0

我有一个数据库,这是我创建它的方法:

@UseMoor(tables: [
  Users
  Images,
], daos: [
  UserDao,
  ImageDao
])
class AppDatabase extends _$AppDatabase {
  AppDatabase() : super(FlutterQueryExecutor.inDatabaseFolder(path: 'my-db.sql', logStatements: true));

  @override
  MigrationStrategy get migration => MigrationStrategy(
        beforeOpen: (details) async {
          await customStatement('PRAGMA foreign_keys = ON');
        },
        onUpgrade: (Migrator m, int from, int to) async {
          if (from == 1) {
            m.createTable(keps);
          }
        },
      );

  @override
  int get schemaVersion => 2;
}

正如你第一次看到的那样,我只有一张桌子Users。后来添加Images所以我写了这个onUpgrade方法:

onUpgrade: (Migrator m, int from, int to) async {
          if (from == 1) {
            m.createTable(images);
          }
        },

现在我想在表格中添加一列,Users但我不知道是否应该onUpgrade这样写:

onUpgrade: (Migrator m, int from, int to) async {
          if (from == 1) {
            m.createTable(images);
          }
          else if (from == 2) {
            await m.addColumn(users, users.keycloakName);
          }
        },
      );


  @override
  int get schemaVersion => 3;

在这个选项中,我希望 Moor 像这样工作:如果手机上的应用程序正在使用一个数据库,schemaVersion == 2那么它很简单:它只是添加列。

但是,如果手机上的 schemaVersion 为 1 并获得使用 schemaVersion == 3 的新应用版本怎么办?Moor 是否意识到这一点并首先运行

          if (from == 1) {
            m.createTable(images);
          }

部分,完成后运行:

          else if (from == 2) {
            await m.addColumn(users, users.keycloakName);
          }

部分,或者我必须像这样编写 onUpgrade (重复代码):

onUpgrade: (Migrator m, int from, int to) async {
          if (from == 1) {
            m.createTable(images);
          }
          else if (from == 2) {
            m.createTable(images);
            await m.addColumn(users, users.keycloakName);
          }
        },
      );


  @override
  int get schemaVersion => 3;

有了这个问题,如果手机上的 schemaVersion 已经是 2,它会尝试再次创建 iamges 表......

4

1 回答 1

0

仅运行一次,因此onUpgrade如果您从 1 升级到 3,则from == 1在上面的代码中只会运行第一个 ( ) 升级。您当然可以稍微更改您的代码,它将运行所有升级,例如

if (from == 1) {
    // upgrade from 1, all migrations from 1 to 2 here
    m.createTable(images);
}
if (from <= 2) {
    // upgrade from 2, all migrations from 2 to 3 here
    await m.addColumn(users, users.keycloakName);
}
if (from <= 3) {
    // upgrade from 3, all migrations from 3 to 4 here
    etc.etc()
}

但我相信你会明白,你需要非常小心如何使用它!我个人更喜欢上面的方法来复制粘贴所有迁移,但当然这取决于您的架构和迁移。

最后说明

实际上,在 Moor repo 中的这个问题中,最近有一个关于这个确切问题的讨论,所以一定要检查一下 :)

于 2021-08-11T11:12:02.870 回答