Flutter迁移工具插件angel3_migration_runner的使用

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

Flutter迁移工具插件angel3_migration_runner的使用

本包包含以下数据库的迁移实现。它设计用于与Angel3 ORM配合使用。

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

使用方法

  • 使用 PostgresMigrationRunner 进行 PostgreSQL 数据库迁移。
  • 使用 MySqlMigrationRunner 进行 MySQL 和 MariaDB 数据库迁移。此运行器使用 mysql_client 驱动。
  • 使用 MariaDbMigrationRunner 进行 MariaDB 数据库迁移。此运行器使用 mysql1 驱动。

支持的操作

  • up - 基于ORM模型生成所有表。
  • reset - 清除 migrations 表中的所有记录并删除所有与ORM相关的表。
  • refresh - 运行 reset 后跟随 up

限制

  • 不支持更新模式更改。

完整示例代码

import 'dart:io';

import 'package:angel3_migration/angel3_migration.dart';
import 'package:angel3_migration_runner/angel3_migration_runner.dart';
import 'package:angel3_migration_runner/mysql.dart';
import 'package:angel3_migration_runner/postgres.dart';
import 'package:angel3_orm/angel3_orm.dart';
import 'package:mysql_client/mysql_client.dart';
import 'package:postgres/postgres.dart';

import 'todo.dart';

void main(List<String> args) async {
  // 在PostgreSQL数据库上运行迁移
  postgresqlMigration(args);

  // 在MySQL数据库上运行迁移
  mysqlMigration(args);
}

void postgresqlMigration(List<String> args) async {
  var host = Platform.environment['DB_HOST'] ?? 'localhost';
  var database = Platform.environment['DB_NAME'] ?? 'demo';
  var username = Platform.environment['DB_USERNAME'] ?? 'demouser';
  var password = Platform.environment['DB_PASSWORD'] ?? 'demo123';

  print("$host $database $username $password");

  Connection conn = await Connection.open(
      Endpoint(
          host: host,
          port: 5432,
          database: database,
          username: username,
          password: password),
      settings: ConnectionSettings(sslMode: SslMode.disable));

  var runner = PostgresMigrationRunner(
    conn,
    migrations: [
      UserMigration(),
      TodoMigration(),
      FooMigration(),
    ],
  );

  runMigrations(runner, args);
}

void mysqlMigration(List<String> args) async {
  var host = Platform.environment['MYSQL_HOST'] ?? 'localhost';
  var database = Platform.environment['MYSQL_DB'] ?? 'orm_test';
  var username = Platform.environment['MYSQL_USERNAME'] ?? 'test';
  var password = Platform.environment['MYSQL_PASSWORD'] ?? 'test123';

  var mySQLConn = await MySQLConnection.createConnection(
      host: host,
      port: 3306,
      databaseName: database,
      userName: username,
      password: password,
      secure: true);

  // 忽略:未使用的局部变量
  var runner = MySqlMigrationRunner(
    mySQLConn,
    migrations: [
      UserMigration(),
      TodoMigration(),
      FooMigration(),
    ],
  );

  runMigrations(runner, args);
}

class FooMigration extends Migration {
  [@override](/user/override)
  void up(Schema schema) {
    schema.create('foos', (table) {
      table
        ..serial('id').primaryKey() // 创建一个名为id的自增主键
        ..varChar('bar', length: 64) // 创建一个名为bar的varchar类型字段,长度为64
        ..timeStamp('created_at').defaultsTo(currentTimestamp); // 创建一个名为created_at的时间戳字段,默认值为当前时间
    });
  }

  [@override](/user/override)
  void down(Schema schema) => schema.drop('foos'); // 删除名为foos的表
}

更多关于Flutter迁移工具插件angel3_migration_runner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter迁移工具插件angel3_migration_runner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 angel3_migration_runner 插件进行 Flutter 迁移任务的代码案例。angel3_migration_runner 通常用于在 Flutter 应用中运行数据库迁移脚本。以下是一个简单的示例,展示了如何设置和使用该插件。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  angel3_framework: ^4.0.0 # 确保兼容的版本
  angel3_migration: ^4.0.0 # 确保兼容的版本
  angel3_migration_runner: ^4.0.0 # 确保兼容的版本

2. 配置数据库和迁移

接下来,配置你的数据库连接和迁移脚本。

数据库连接配置

创建一个文件 database.dart 来配置你的数据库连接:

import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_mysql/angel3_mysql.dart';
import 'package:angel3_migration/angel3_migration.dart';

Angel configureServer() {
  var app = Angel();

  // 配置 MySQL 连接
  var mysqlService = MysqlService(
    host: 'localhost',
    port: 3306,
    user: 'root',
    password: 'password',
    database: 'your_database_name',
  );

  app.container.registerSingleton<MysqlService>(() => mysqlService);

  // 配置迁移
  var migrations = MigrationContainer();
  // 添加迁移脚本(这里假设你有一个 migration 文件夹存放迁移脚本)
  migrations.add(fromYamlFile('migrations/001_initial_schema.yaml'));

  var migrationService = MigrationService(app, migrations);

  // 使用迁移服务
  app.use('/migrations', migrationService.handler);

  return app;
}

迁移脚本

创建一个 migrations 文件夹,并在其中添加一个迁移脚本,例如 001_initial_schema.yaml

version: 1
up:
  CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  );
down:
  DROP TABLE users;

3. 运行迁移

在你的 main.dart 文件中,配置并运行迁移:

import 'package:flutter/material.dart';
import 'package:angel3_framework/angel3_framework.dart';
import 'database.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  var app = configureServer();

  // 启动应用并运行迁移
  try {
    await app.configureServer();
    var migrationService = app.container.make<MigrationService>();
    await migrationService.up();
    print('Migrations completed successfully.');
  } catch (e) {
    print('Error during migration: $e');
  }

  // 接下来,你可以启动你的 Flutter UI
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter App with Migrations'),
        ),
        body: Center(
          child: Text('Hello, Flutter with Angel3 Migrations!'),
        ),
      ),
    );
  }
}

注意事项

  1. 数据库配置:确保你的数据库连接配置正确。
  2. 迁移脚本:迁移脚本需要按照正确的格式编写,并且版本号需要递增。
  3. 错误处理:在生产环境中,添加更多的错误处理和日志记录。

这个示例展示了如何使用 angel3_migration_runner 进行数据库迁移的基本流程。根据你的具体需求,你可能需要调整配置和迁移脚本。

回到顶部