Flutter数据库ORM插件static_postgres_orm的使用

Flutter数据库ORM插件static_postgres_orm的使用

使用

以下是一个简单的使用示例:

import 'package:static_postgres_orm/static_postgres_orm.dart';
import 'package:dartz/dartz.dart';

// 定义数据字段类
class _DataFields extends GenericDataFields {
  late final IntegerField_PG _company_id;
  late final IntegerField_PG _product_id;
  late final StringField_WithDefault_PG _description;
  late final StringField_WithDefault_PG _code;
  late final BooleanField_WithDefault_PG _is_active;
  late final NumericField_WithDefault_PG _price;
  late final StringField_WithDefault_PG _full_description;
  late final DateField_WithDefault_PG _insert_date;
  late final DateTimeField_WithDefault_PG _update_date;
  late final TimeField_PG _insert_time;

  _DataFields() : super() {
    fields = <GenericField>[];
    _createFields();
    _addFields();
  }

  _DataFields get _backup => getBackup(this) as _DataFields;
  set _backup(_DataFields v) => setBackup(this, v);

  // 创建字段
  void _createFields() {
    _company_id = IntegerField_PG(this, 'company_id', true, true);
    _product_id = IntegerField_PG(this, 'product_id', true, true);
    _code =
        StringField_WithDefault_PG(this, 'code', false, false, 50, 'aloja!!!!');
    _description = StringField_WithDefault_PG(
        this, 'description', false, false, 200, 'produto genérico');
    _is_active =
        BooleanField_WithDefault_PG(this, 'is_active', false, false, false);
    _price = NumericField_WithDefault_PG(this, 'price', false, false, 0);
    _full_description = StringField_WithDefault_PG(
        this, 'full_description', false, false, -1, 'Aloja!');
    _insert_date = DateField_WithDefault_PG(
        this, 'insert_date', false, false, DateTime.now());
    _update_date = DateTimeField_WithDefault_PG(
        this, 'update_date', false, false, DateTime.now());
    _insert_time = TimeField_PG(this, 'insert_time', false, false);
  }

  // 获取字段
  GenericField getCooField(_DataFields origin, String field) {
    return origin.fields
        .firstWhere((element) => getFieldName(element) == field);
  }

  // 克隆字段
  void _cloneField(_DataFields origin) {
    fields.forEach((element) {
      element.copy(getCooField(origin, getFieldName(element)));
    });
  }

  [@override](/user/override)
  void backup() {
    _backup = _DataFields();
    _backup._cloneField(this);
  }

  [@override](/user/override)
  void restore() {
    if (assigned) {
      _cloneField(_backup);
      finalize();
    }
  }

  // 添加字段
  void _addFields() {
    fields.add(_company_id);
    fields.add(_product_id);
    fields.add(_code);
    fields.add(_description);
    fields.add(_is_active);
    fields.add(_price);
    fields.add(_full_description);
    fields.add(_insert_date);
    fields.add(_update_date);
    fields.add(_insert_time);
  }
}

// 定义ORM类
class Product_ORM extends PostgressORM {
  static final Event _addRecord = Event();

  _DataFields get _dataFields => getRecords(this)[rowIndex] as _DataFields;

  IntegerField get product_id => _dataFields._product_id;
  IntegerField get company_id => _dataFields._company_id;
  StringField_WithDefault get description => _dataFields._description;
  StringField_WithDefault get code => _dataFields._code;
  BooleanField_WithDefault get is_active => _dataFields._is_active;
  NumericField_WithDefault get price => _dataFields._price;
  StringField_WithDefault get full_description => _dataFields._full_description;
  DateField_WithDefault get insert_date => _dataFields._insert_date;
  DateTimeField_WithDefault get update_date => _dataFields._update_date;
  TimeField get insert_time => _dataFields._insert_time;

  Product_ORM(Postgres_SqlConnection sqlConnection)
      : super(sqlConnection, 'public', 'product', _addRecord) {
    _addRecord.action = _executeAddRecord;

    getRecords(this).add(_DataFields());
  }

  // 执行添加记录操作
  void _executeAddRecord() {
    getRecords(this).add(_DataFields());
  }

  // 物化查询
  Future<Either<ErrorSqlResult, SelectSuccesSqlResult>> materialize(
      int company_id, int product_id) async {
    return getMaterialize(
        this,
        (<GenericField>[]
          ..add(IntegerField_PG.clone(_dataFields._company_id)
            ..setValue(company_id))
          ..add(IntegerField_PG.clone(_dataFields._product_id)
            ..setValue(product_id))));
  }

  // 删除记录
  Future<Either<ErrorSqlResult, ExecuteSuccesSqlResult>> deleteRecord(
      int company_id, int product_id) async {
    return getDeleteRecord(
        this,
        (<GenericField>[]
          ..add(IntegerField_PG.clone(_dataFields._company_id)
            ..setValue(company_id))
          ..add(IntegerField_PG.clone(_dataFields._product_id)
            ..setValue(product_id))));
  }
}

更多关于Flutter数据库ORM插件static_postgres_orm的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据库ORM插件static_postgres_orm的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


static_postgres_orm 是一个用于 Flutter 的 PostgreSQL ORM(对象关系映射)插件,它允许你通过 Dart 代码与 PostgreSQL 数据库进行交互。这个插件的主要特点是它生成了静态类型的模型和查询,从而提供了更好的类型安全和开发体验。

安装

首先,你需要在 pubspec.yaml 文件中添加 static_postgres_orm 依赖:

dependencies:
  flutter:
    sdk: flutter
  static_postgres_orm: ^0.1.0  # 请根据实际情况使用最新版本

然后运行 flutter pub get 来安装依赖。

配置

  1. 配置数据库连接:你需要在 lib 目录下创建一个 postgres.yaml 文件来配置数据库连接信息:

    database:
      host: localhost
      port: 5432
      database: my_database
      user: my_user
      password: my_password
    
  2. 生成模型:使用 static_postgres_orm 提供的命令行工具来生成模型和查询代码。在项目根目录下运行:

    flutter pub run static_postgres_orm:generate
    

    这将根据你的数据库表结构生成对应的 Dart 模型和查询类。

使用生成的模型

假设你有一个名为 users 的表,生成工具会为你生成一个 User 模型和 UserQuery 类。

查询数据

import 'package:static_postgres_orm/static_postgres_orm.dart';
import 'generated/models.dart';  // 生成的模型文件

void fetchUsers() async {
  final query = UserQuery();
  final users = await query.getAll();

  for (var user in users) {
    print('User: ${user.name}, Email: ${user.email}');
  }
}

插入数据

void insertUser() async {
  final user = User()
    ..name = 'John Doe'
    ..email = 'john.doe@example.com';

  await user.insert();
}

更新数据

void updateUser() async {
  final query = UserQuery();
  final user = await query.getById(1);

  if (user != null) {
    user.name = 'Jane Doe';
    await user.update();
  }
}

删除数据

void deleteUser() async {
  final query = UserQuery();
  final user = await query.getById(1);

  if (user != null) {
    await user.delete();
  }
}

自定义查询

你可以使用 UserQuery 类来构建自定义查询:

void customQuery() async {
  final query = UserQuery()
    ..where((user) => user.email.like('%example.com'))
    ..orderBy((user) => user.name.asc());

  final users = await query.getAll();

  for (var user in users) {
    print('User: ${user.name}, Email: ${user.email}');
  }
}

事务处理

static_postgres_orm 也支持事务处理:

void transactionExample() async {
  final transaction = await PostgresORM.beginTransaction();

  try {
    final user = User()
      ..name = 'Alice'
      ..email = 'alice@example.com';

    await user.insert(transaction: transaction);

    await transaction.commit();
  } catch (e) {
    await transaction.rollback();
    print('Transaction failed: $e');
  }
}
回到顶部