Flutter数据库交互插件pip_services3_postgres的使用
Flutter数据库交互插件pip_services3_postgres的使用
本模块是Pip.Services多语言微服务工具包的一部分。它提供了实现PostgreSQL持久化的组件集。
该模块包含以下包:
- Build - 用于创建PostgreSQL持久化组件的工厂。
- Connect - 配置连接到数据库的PostgreSQL连接组件。
- Persistence - 抽象的持久化组件以执行基本的CRUD操作。
使用
在你的项目的pubspec.yaml
文件中添加依赖项:
dependencies:
pip_services3_postgres: version
例如,让我们为以下数据对象创建一个持久化组件。
import 'package:pip_services3_commons/pip_services3_commons.dart';
class MyObject implements IStringIdentifiable, ICloneable {
@override
String? id;
String? key;
String? content;
MyObject();
MyObject.from(this.id, this.key, this.content);
Map<String, dynamic> toJson() {
return <String, dynamic>{'id': id, 'key': key, 'content': content};
}
void fromJson(Map<String, dynamic> json) {
id = json['id'];
key = json['key'];
content = json['content'];
}
@override
MyObject clone() {
return MyObject.from(id, key, content);
}
}
持久化组件应实现以下接口,其中包含一组基本的CRUD操作。
abstract class IMyPersistence {
Future<DataPage<MyObject>> getPageByFilter(
String? correlationId, FilterParams? filter, PagingParams? paging);
Future<MyObject?> getOneById(String? correlationId, String id);
Future<MyObject?> getOneByKey(String? correlationId, String key);
Future<MyObject?> create(String? correlationId, MyObject? item);
Future<MyObject?> update(String? correlationId, MyObject? item);
Future<MyObject?> set(String? correlationId, MyObject? item);
Future<MyObject?> deleteById(String? correlationId, String? id);
}
要实现PostgreSQL持久化组件,你可以继承IdentifiablePostgresPersistence
。大多数CRUD操作将来自基类。你只需要覆盖getPageByFilter
方法,并提供自定义过滤函数。此外,你需要实现一个不存在于基类中的getOneByKey
自定义持久化方法。
class MyPostgresPersistence
extends IdentifiablePostgresPersistence<MyObject, String> {
MyPostgresPersistence() : super('myobjects', null) {
ensureSchema_(
"CREATE TABLE myobjects (id VARCHAR(32) PRIMARY KEY, key VARCHAR(50), content VARCHAR(255))");
ensureIndex_("myobjects_key", {'key': 1}, {'unique': true});
}
@override
void defineSchema_() {
// pass
}
String? _composeFilter(FilterParams? filter) {
filter = filter ?? FilterParams();
var criteria = [];
var id = filter.getAsNullableString('id');
if (id != null) criteria.add("id='" + id + "'");
var tempIds = filter.getAsNullableString("ids");
if (tempIds != null) {
var ids = tempIds.split(",");
criteria.add("id IN ('" + ids.join("','") + "')");
}
var key = filter.getAsNullableString("key");
if (key != null) criteria.add("key='" + key + "'");
return criteria.length > 0 ? criteria.join(" AND ") : null;
}
Future<DataPage<MyObject>> getPageByFilter(
String? correlationId, FilterParams? filter, PagingParams? paging) {
return super.getPageByFilter_(
correlationId, _composeFilter(filter), paging, null, null);
}
Future<MyObject?> getOneByKey(String? correlationId, String key) async {
var query =
"SELECT * FROM " + this.quotedTableName_() + " WHERE \"key\"=@1";
var params = {'1': key};
var res = await client_!.query(query, substitutionValues: params);
var resValues = res.isNotEmpty ? res.first[0][1] : null;
var item = this.convertToPublic_(resValues);
if (item == null)
this.logger_.trace(correlationId, "Nothing found from %s with key = %s",
[this.tableName_, key]);
else
this.logger_.trace(correlationId, "Retrieved from %s with key = %s",
[this.tableName_, key]);
item = this.convertToPublic_(item);
return item;
}
}
另外,你也可以使用非关系型格式存储数据,使用IdentificableJsonPostgresPersistence
。它在表中存储两个列:id
(具有唯一对象ID)和data
(以JSON序列化的对象数据)。要访问数据字段,你应该使用data->'field'
表达式或data->>'field'
表达式(对于字符串值)。
class MyPostgresJsonPersistence
extends IdentifiableJsonPostgresPersistence<MyObject, String> {
MyPostgresJsonPersistence() : super('myobjects_json', null) {
clearSchema();
ensureTable_(idType: "VARCHAR(32)", dataType: "JSONB");
ensureIndex_(this.tableName_! + '_json_key', {"(data->>'key')": 1},
{'unique': true});
}
@override
void defineSchema_() {
// pass
}
String? _composeFilter(FilterParams? filter) {
filter = filter ?? FilterParams();
var criteria = [];
var id = filter.getAsNullableString('id');
if (id != null) criteria.add("data->>'id'='" + id + "'");
var tempIds = filter.getAsNullableString("ids");
if (tempIds != null) {
var ids = tempIds.split(",");
criteria.add("data->>'id' IN ('" + ids.join("','") + "')");
}
var key = filter.getAsNullableString("key");
if (key != null) criteria.add("data->>'key'='" + key + "'");
return criteria.length > 0 ? criteria.join(" AND ") : null;
}
Future<DataPage<MyObject>> getPageByFilter(
String? correlationId, FilterParams? filter, PagingParams? paging) {
return super.getPageByFilter_(
correlationId, _composeFilter(filter), paging, 'id', null);
}
Future<MyObject?> getOneByKey(String? correlationId, String key) async {
var query =
"SELECT * FROM " + this.quotedTableName_() + " WHERE data->>'key'=@1";
var params = {'1': key};
var res = await client_!.query(query, substitutionValues: params);
var resValues = res.isNotEmpty ? res.first[0][1] : null;
var item = this.convertToPublic_(resValues);
if (item == null)
this.logger_.trace(correlationId, "Nothing found from %s with key = %s",
[this.tableName_, key]);
else
this.logger_.trace(correlationId, "Retrieved from %s with key = %s",
[this.tableName_, key]);
item = this.convertToPublic_(item);
return item;
}
}
配置包括PostgreSQL持久化的微服务可能如下所示:
...
{{#if POSTGRES_ENABLED}}
- descriptor: pip-services:connection:postgres:con1:1.0
connection:
uri: {{{POSTGRES_SERVICE_URI}}}
host: {{{POSTGRES_SERVICE_HOST}}}{{#unless POSTGRES_SERVICE_HOST}}localhost{{/unless}}
port: {{POSTGRES_SERVICE_PORT}}{{#unless POSTGRES_SERVICE_PORT}}5432{{/unless}}
database: {{POSTGRES_DB}}{{#unless POSTGRES_DB}}app{{/unless}}
credential:
username: {{POSTGRES_USER}}
password: {{POSTGRES_PASS}}
- descriptor: myservice:persistence:postgres:default:1.0
dependencies:
connection: pip-services:connection:postgres:con1:1.0
table: {{POSTGRES_TABLE}}{{#unless POSTGRES_TABLE}}myobjects{{/unless}}
{{/if}}
...
现在你可以从命令行安装包:
pub get
开发
为了开发,你需要安装以下前提条件:
- Dart SDK 2
- Visual Studio Code 或其他你喜欢的IDE
- Docker
安装依赖项:
pub get
运行自动化测试:
pub run test
生成API文档:
./docgen.ps1
在提交更改之前,运行dockerized构建和测试:
./build.ps1
./test.ps1
./clear.ps1
更多关于Flutter数据库交互插件pip_services3_postgres的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库交互插件pip_services3_postgres的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
pip_services3_postgres
是一个用于在 Flutter 应用中与 PostgreSQL 数据库进行交互的插件。它是 pip_services3
库的一部分,提供了一套简单易用的 API 来执行 CRUD 操作以及更复杂的数据库操作。
以下是如何在 Flutter 项目中使用 pip_services3_postgres
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 pip_services3_postgres
的依赖:
dependencies:
flutter:
sdk: flutter
pip_services3_postgres: ^1.0.0
然后运行 flutter pub get
来安装依赖。
2. 创建 Postgres 连接
接下来,你需要创建一个 PostgresConnection
对象来管理与 PostgreSQL 数据库的连接。
import 'package:pip_services3_postgres/pip_services3_postgres.dart';
void main() async {
var connection = PostgresConnection.fromConfig(ConfigParams.fromTuples([
'connection.host', 'localhost',
'connection.port', 5432,
'connection.database', 'testdb',
'connection.username', 'postgres',
'connection.password', 'password'
]));
await connection.open(null);
// Your database operations here
await connection.close(null);
}
3. 执行查询
你可以使用 PostgresPersistence
类来执行 SQL 查询。以下是一个简单的查询示例:
import 'package:pip_services3_postgres/pip_services3_postgres.dart';
class MyPostgresPersistence extends PostgresPersistence {
MyPostgresPersistence() : super('my_table');
Future<List<Map<String, dynamic>>> getItems() async {
var query = "SELECT * FROM my_table";
var result = await client.query(query);
return result.toList();
}
}
void main() async {
var persistence = MyPostgresPersistence();
await persistence.configure(ConfigParams.fromTuples([
'connection.host', 'localhost',
'connection.port', 5432,
'connection.database', 'testdb',
'connection.username', 'postgres',
'connection.password', 'password'
]));
await persistence.open(null);
var items = await persistence.getItems();
print(items);
await persistence.close(null);
}
4. 插入数据
你可以使用 PostgresPersistence
类来插入数据:
Future<void> insertItem(Map<String, dynamic> item) async {
var query = "INSERT INTO my_table (column1, column2) VALUES (@column1, @column2)";
await client.query(query, substitutionValues: item);
}
5. 更新数据
更新数据的示例:
Future<void> updateItem(Map<String, dynamic> item) async {
var query = "UPDATE my_table SET column1 = @column1 WHERE id = @id";
await client.query(query, substitutionValues: item);
}
6. 删除数据
删除数据的示例:
Future<void> deleteItem(String id) async {
var query = "DELETE FROM my_table WHERE id = @id";
await client.query(query, substitutionValues: {'id': id});
}
7. 错误处理
在进行数据库操作时,务必处理可能出现的错误:
try {
var items = await persistence.getItems();
print(items);
} catch (e) {
print('Error: $e');
}
8. 关闭连接
在完成数据库操作后,记得关闭连接:
await persistence.close(null);