Flutter数据库迁移生成插件needle_orm_migration_generator的使用

Flutter数据库迁移生成插件needle_orm_migration_generator的使用

migration generator for <a href="https://github.com/needle-dart/needle_orm_all" rel="ugc">Needle ORM</a>

使用示例

以下是一个完整的示例,展示如何使用 needle_orm_migration_generator 插件来管理数据库迁移。

示例代码

import 'package:logging/logging.dart';
import 'package:mysql1/mysql1.dart';
import 'package:needle_orm_migration_runner/mariadb.dart';
import 'package:needle_orm_migration_runner/needle_orm_migration_runner.dart';

// 定义数据表迁移类
class BookMigration extends Migration {
  @override
  Future up() async {
    // 创建书籍表
    await query('''
      CREATE TABLE IF NOT EXISTS books (
        id INT AUTO_INCREMENT PRIMARY KEY,
        title VARCHAR(255) NOT NULL,
        author VARCHAR(255) NOT NULL
      )
    ''');
  }

  @override
  Future down() async {
    // 删除书籍表
    await query('DROP TABLE IF EXISTS books');
  }
}

class UserMigration extends Migration {
  @override
  Future up() async {
    // 创建用户表
    await query('''
      CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(255) NOT NULL UNIQUE,
        email VARCHAR(255) NOT NULL UNIQUE
      )
    ''');
  }

  @override
  Future down() async {
    // 删除用户表
    await query('DROP TABLE IF EXISTS users');
  }
}

void main(List<String> args) async {
  // 设置日志级别
  Logger.root.level = Level.ALL; // 默认为 Level.INFO
  Logger.root.onRecord.listen((record) {
    print(
        '${record.level.name}: ${record.time} ${record.loggerName}: ${record.message}');
  });

  // 数据库连接设置
  var settings = new ConnectionSettings(
      host: 'localhost',
      port: 3306,
      user: 'needle',
      password: 'needle',
      db: 'needle');

  // 连接数据库
  var conn = await MySqlConnection.connect(settings);

  // 初始化迁移运行器
  var migrationRunner = MariaDbMigrationRunner(conn, migrations: [
    BookMigration(), // 添加书籍表迁移
    UserMigration(), // 添加用户表迁移
  ]);

  // 执行迁移命令
  await runMigrations(migrationRunner, args);
}

代码说明

  1. 导入必要的包

    • mysql1: 用于与 MySQL 数据库进行交互。
    • needle_orm_migration_runner: 提供迁移运行器功能。
    • logging: 用于记录日志信息。
  2. 定义迁移类

    • BookMigrationUserMigration 继承自 Migration 类。
    • up() 方法定义了创建表的操作。
    • down() 方法定义了删除表的操作。
  3. 初始化数据库连接

    • 使用 ConnectionSettings 配置数据库连接参数。
    • 使用 MySqlConnection.connect() 方法建立数据库连接。
  4. 运行迁移

    • 创建 MariaDbMigrationRunner 实例,传入数据库连接和迁移列表。
    • 调用 runMigrations 函数执行迁移操作。

输出示例

运行程序后,控制台将输出类似以下日志:

INFO: 2023-01-01 12:00:00.000 root: Running migration: BookMigration
INFO: 2023-01-01 12:00:01.000 root: Migration completed: BookMigration
INFO: 2023-01-01 12:00:01.000 root: Running migration: UserMigration
INFO: 2023-01-01 12:00:02.000 root: Migration completed: UserMigration

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

1 回复

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


needle_orm_migration_generator 是一个用于 Flutter 的 ORM(对象关系映射)库 NeedleORM 的数据库迁移生成插件。它可以帮助开发者自动生成数据库迁移代码,从而简化数据库架构变更的管理过程。

使用步骤

  1. 安装依赖: 首先,你需要在 pubspec.yaml 文件中添加 needle_ormneedle_orm_migration_generator 依赖。

    dependencies:
      needle_orm: ^0.1.0 # 请根据实际情况使用最新版本
    
    dev_dependencies:
      needle_orm_migration_generator: ^0.1.0 # 请根据实际情况使用最新版本
      build_runner: ^2.1.0
    

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

  2. 定义实体: 在 NeedleORM 中,实体类表示数据库中的表。你需要使用 [@Entity](/user/Entity) 注解来标记这些类。

    import 'package:needle_orm/needle_orm.dart';
    
    [@Entity](/user/Entity)()
    class User {
      @PrimaryKey()
      int id;
    
      String name;
    
      int age;
    }
    
  3. 生成迁移代码: 当你对实体类进行了修改(例如添加了新的字段或表),你需要生成相应的迁移代码。运行以下命令来生成迁移代码:

    flutter pub run build_runner build
    

    这将会生成一个迁移文件,通常命名为 migration.dart,其中包含了从旧版本数据库到新版本数据库的迁移逻辑。

  4. 应用迁移: 在应用启动时,你需要应用生成的迁移代码来更新数据库架构。通常这会在初始化数据库时进行。

    import 'package:needle_orm/needle_orm.dart';
    import 'migration.dart'; // 生成的迁移文件
    
    void main() async {
      final database = await $FloorMyDatabase.databaseBuilder('my_database.db').build();
      await database.migrate(); // 应用迁移
    }
回到顶部