Flutter数据库操作插件angel3_orm_mysql的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter数据库操作插件angel3_orm_mysql的使用

Angel3 ORM for MySQL 是一个用于在Flutter应用中操作MySQL或MariaDB数据库的插件。本文将详细介绍如何使用该插件进行数据库操作,并提供完整的示例代码。

支持的数据库

  • MariaDB 10.2.x 或更高版本
  • MySQL 8.x 或更高版本

注意: MySQL低于8.0和MariaDB低于10.2.0不支持,因为Angel3 ORM需要公共表表达式(CTE)来工作。

MySqlExecutor

MySqlExecutor 使用 mysql_client 驱动程序实现,适用于 MySQL 8.0+ 和 MariaDB 10.2+ 数据库。

连接到 MySQL 或 MariaDB

import 'package:mysql_client/mysql_client.dart';

var connection = await MySQLConnection.createConnection(
    host: "localhost",
    port: 3306,
    databaseName: "orm_test",
    userName: "test",
    password: "test123",
    secure: true);

var logger = Logger('orm_mysql');
await connection.connect(timeoutMs: 10000);
var executor = MySqlExecutor(connection, logger: logger);

已知限制

  • 不支持 Blob 数据类型映射。
  • 不支持 timestamp 数据类型映射,请使用 datetime
  • 不支持 UTC datetime。

MariaDBExecutor

MariaDBExecutor 使用 mysql1 驱动程序实现,仅适用于 MariaDB 10.2+ 数据库。

连接到 MariaDB

import 'package:mysql1/mysql1.dart';

var settings = ConnectionSettings(
    host: 'localhost',
    port: 3306,
    db: 'orm_test',
    user: 'test',
    password: 'test123');
var connection = await MySqlConnection.connect(settings);

var logger = Logger('orm_mariadb');
var executor = MariaDbExecutor(connection, logger: logger);

已知限制

  • 不支持 Blob 类型映射。
  • 不支持 timestamp 映射,请使用 datetime
  • 仅支持 UTC datetime,非UTC datetime将自动转换为UTC datetime。

创建新的数据库

  1. 登录到 MariaDB/MySQL 数据库控制台:
mysql -u root -p
  1. 创建新数据库并授予权限:
create database orm_test;

-- 授予本地访问权限
create user 'test'@'localhost' identified by 'test123';
grant all privileges on orm_test.* to 'test'@'localhost';

-- 授予本地和远程访问权限
create user 'test'@'%' identified by 'test123';
grant all privileges on orm_test.* to 'test'@'%';

示例代码

以下是完整的示例代码,演示如何使用 angel3_orm_mysql 插件进行数据库操作:

import 'dart:io';

import 'package:angel3_migration/angel3_migration.dart';
import 'package:angel3_orm/angel3_orm.dart';
import 'package:angel3_orm_mysql/angel3_orm_mysql.dart';
import 'package:angel3_serialize/angel3_serialize.dart';
import 'package:mysql_client/mysql_client.dart';
import 'package:mysql1/mysql1.dart';
import 'package:logging/logger.dart';
import 'package:optional/optional.dart';
part 'main.g.dart';

void main() async {
  //hierarchicalLoggingEnabled = true;

  //await mariaDBExample();
  await mysqlExample();

  exit(0);
}

Future<void> mariaDBExample() async {
  Logger.root
    ..level = Level.ALL
    ..onRecord.listen(print);

  var settings = ConnectionSettings(
      host: 'localhost',
      port: 3306,
      db: 'orm_test',
      user: 'test',
      password: 'test123');
  var connection = await MySqlConnection.connect(settings);

  print("Connected to MariaDb");
  var logger = Logger('orm_mysql');
  var executor = MariaDbExecutor(connection, logger: logger);

  var query = TodoQuery();
  query.values
    ..text = 'Clean your room!'
    ..updatedAt = DateTime.now().toUtc()
    ..isComplete = false;

  var todo = await query.insert(executor);
  print(todo.value.toJson());

  var query2 = TodoQuery()..where!.id.equals(todo.value.idAsInt);
  var todo2 = await query2.getOne(executor);
  print(todo2.value.toJson());
  print(todo == todo2);
}

Future<void> mysqlExample() async {
  Logger.root
    ..level = Level.ALL
    ..onRecord.listen(print);

  var connection = await MySQLConnection.createConnection(
      host: "localhost",
      port: 3306,
      databaseName: "orm_test",
      userName: "test",
      password: "test123",
      secure: true);

  print("Connected to MySQL");
  var logger = Logger('orm_mysql');
  await connection.connect(timeoutMs: 10000);
  var executor = MySqlExecutor(connection, logger: logger);

  var query = TodoQuery();
  query.values
    ..text = 'Clean your room!'
    ..updatedAt = DateTime.now().toUtc()
    ..isComplete = false;

  var todo = await query.insert(executor);
  print(todo.value.toJson());

  var query2 = TodoQuery()..where!.id.equals(todo.value.idAsInt);
  var todo2 = await query2.getOne(executor);
  print(todo2.value.toJson());
  print(todo == todo2);
}

@serializable
@orm
abstract class _Todo extends Model {
  String? get text;

  @DefaultsTo(false)
  bool? isComplete;
}

通过以上步骤和示例代码,您可以轻松地在Flutter应用中使用 angel3_orm_mysql 插件进行数据库操作。


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

1 回复

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


当然,以下是一个关于如何使用 angel3_orm_mysql 插件在 Flutter 中进行数据库操作的代码示例。这个插件允许你通过 ORM(对象关系映射)的方式与 MySQL 数据库进行交互。

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

dependencies:
  flutter:
    sdk: flutter
  angel3_orm: ^x.y.z  # 请替换为最新版本号
  angel3_mysql: ^x.y.z  # 请替换为最新版本号
  # 如果需要其他依赖,比如 Dart 的 MySQL 客户端,也请添加

请注意,angel3_orm_mysql 实际上并不是一个独立的包,angel3_orm 可以与 angel3_mysql 结合使用来实现 ORM 功能。你可能还需要 mysql1 或其他 Dart MySQL 客户端库来实际执行数据库操作。

接下来,是一个简单的示例,展示了如何设置 ORM 并执行基本的数据库操作:

import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_orm/angel3_orm.dart';
import 'package:angel3_mysql/angel3_mysql.dart';
import 'package:mysql1/mysql1.dart';

part 'models/user.dart'; // 假设你有一个 User 模型

void main() async {
  // 配置 MySQL 连接
  var connectionSettings = ConnectionSettings(
    host: 'localhost',
    port: 3306,
    user: 'root',
    password: 'your_password',
    db: 'your_database',
  );

  // 创建 MySQL 客户端
  var mysqlClient = await MySqlClient.connect(connectionSettings);

  // 配置 Angel ORM
  var orm = ModelORM();

  // 注册模型(假设 User 是你已经定义好的模型)
  orm.registerModel<User>();

  // 创建 Angel 应用并配置 ORM
  var app = Angel();
  var service = await createMySqlService(mysqlClient, orm);
  app.use('/db', service);

  // 迁移数据库(这一步通常在你的应用初始化时执行一次)
  await service.migrate();

  // 示例:创建一个新用户
  var newUser = User()
    ..name = 'John Doe'
    ..email = 'john.doe@example.com';

  // 保存到数据库
  await service.readOrCreate(newUser);

  // 查询用户
  var users = await service.query().find();
  print('Users in database: $users');

  // 关闭数据库连接
  await mysqlClient.close();
}

// models/user.dart
part of 'main.dart';

@serializable
class User extends Model {
  @field
  String name;

  @field
  String email;

  // 构造函数等
  User();

  factory User.fromJson(Map json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

注意事项

  1. 模型定义:上面的示例中,User 类是一个简单的模型,它使用了 json_serializable 包来进行 JSON 序列化和反序列化。你需要确保你的模型类被正确定义,并且使用了 @field 注解来标记数据库字段。

  2. 迁移:在实际应用中,数据库迁移是非常重要的。angel3_orm 提供了一些基本的迁移功能,但你可能需要根据自己的需求扩展这些功能。

  3. 错误处理:上面的示例代码中没有包含错误处理逻辑。在实际应用中,你应该添加适当的错误处理来确保程序的健壮性。

  4. 依赖版本:确保你使用的是最新版本的 angel3_ormangel3_mysql 包,因为包的功能和 API 可能会随着版本的更新而变化。

  5. Flutter 特定注意事项:虽然上面的代码示例可以在 Flutter 应用中运行(特别是在服务器端代码部分),但请注意,Flutter 应用通常不会直接与 MySQL 数据库交互。在实际应用中,你可能会在 Flutter 前端与一个后端服务(如使用 Dart 编写的服务器)进行通信,而后端服务再与 MySQL 数据库交互。

希望这个示例能帮助你开始使用 angel3_orm_mysql 进行数据库操作!

回到顶部