Flutter数据库迁移插件sqflite_migrate的使用

Flutter数据库迁移插件sqflite_migrate的使用

GitHub Actions Workflow Status example

在sqflite中进行数据库迁移的正确且传统的方法。

  • 支持使用纯SQL语法创建迁移文件
  • 一个包含所有必要命令的工作CLI
  • 一种更细粒度控制的方法(不推荐用于生产环境)

使用方法

dart pub global activate sqflitemigrate

这将使你能够从pub.dev网站访问全局CLI。

创建你的迁移文件夹

在你觉得最适合你的应用程序的地方创建迁移文件夹,并填充迁移文件。

-- UP --
CREATE TABLE IF NOT EXISTS my_table (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL
);

-- DOWN --
DROP TABLE my_table;

-- UP ---- DOWN -- 只是纯SQL注释,用于分离updown查询。

你可以在updown部分写任意数量的查询,只要语句由;分隔符分隔即可。

-- UP --
CREATE TABLE IF NOT EXISTS my_table (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL
);

CREATE TABLE IF NOT EXISTS my_table2 (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL
);

-- DOWN --
DROP TABLE my_table;
DROP TABLE my_table2;

命名格式

迁移文件应按以下格式命名:

<version>_<description>.sql

目前版本格式只是一个简单的整数,应该递增并以升序排序,以便运行迁移。

在接下来的版本中,我们将在CLI中添加create命令,并提供带有时间戳或版本号创建的选项。

运行迁移

sqflite_migrate CLI具有以下命令:

  • migrate --database DB_PATH --path MIGRATIONS_FOLDER_PATH [OPTIONS] - 运行迁移
  • rollback --database DB_PATH --path MIGRATIONS_FOLDER_PATH [OPTIONS] - 回滚迁移
  • status --database DB_PATH --path MIGRATIONS_FOLDER_PATH - 显示当前迁移状态
  • clear --database DB_PATH - 清除迁移表中的所有记录
  • delete-db --database DB_PATH - 删除数据库文件和所有迁移记录

程序化使用

你也可以使用MigrationRunner类来程序化地运行迁移,但不建议在生产环境中使用它,因为这种方法未经过充分测试。

import 'package:sqflite_migrate/sqflite_migrate.dart';

void main() async {
  final migrator = MigrationRunner.init(
    database: 'path/to/db',
    migrationsPath: 'path/to/migrations',
  );

  await migrator.migrate()..rollback();
}

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

1 回复

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


sqflite_migrate 是一个用于在 Flutter 应用中进行 SQLite 数据库迁移的插件。它可以帮助你在应用升级时,轻松管理数据库的版本和迁移操作。以下是使用 sqflite_migrate 的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 sqflitesqflite_migrate 依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4
  sqflite_migrate: ^1.1.0

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

2. 创建数据库迁移脚本

lib 目录下创建一个 migrations 文件夹,并在其中创建数据库迁移脚本。每个迁移脚本通常是一个 Dart 文件,包含 updown 方法。up 方法用于执行升级操作,down 方法用于回滚操作。

例如,创建一个 migration_v1.dart 文件:

import 'package:sqflite_migrate/sqflite_migrate.dart';

class MigrationV1 extends Migration {
  [@override](/user/override)
  Future<void> up(Database db) async {
    await db.execute('''
      CREATE TABLE users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT NOT NULL
      )
    ''');
  }

  [@override](/user/override)
  Future<void> down(Database db) async {
    await db.execute('DROP TABLE users');
  }
}

再创建一个 migration_v2.dart 文件:

import 'package:sqflite_migrate/sqflite_migrate.dart';

class MigrationV2 extends Migration {
  [@override](/user/override)
  Future<void> up(Database db) async {
    await db.execute('ALTER TABLE users ADD COLUMN age INTEGER');
  }

  [@override](/user/override)
  Future<void> down(Database db) async {
    // 由于 SQLite 不支持删除列,这里可以创建一个新表并复制数据
    await db.execute('CREATE TABLE users_backup AS SELECT id, name, email FROM users');
    await db.execute('DROP TABLE users');
    await db.execute('ALTER TABLE users_backup RENAME TO users');
  }
}

3. 配置数据库迁移

在应用的某个地方(例如 main.dart 中),配置数据库迁移:

import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite_migrate/sqflite_migrate.dart';
import 'migrations/migration_v1.dart';
import 'migrations/migration_v2.dart';

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

  // 配置迁移
  final migrations = [
    MigrationV1(),
    MigrationV2(),
  ];

  // 打开数据库并应用迁移
  final database = await openDatabase(
    'my_database.db',
    version: 2, // 数据库版本号
    onCreate: (db, version) async {
      await Migrator(db, migrations).migrateTo(version);
    },
    onUpgrade: (db, oldVersion, newVersion) async {
      await Migrator(db, migrations).migrateTo(newVersion);
    },
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('Database migration example'),
      ),
    );
  }
}
回到顶部