bmrlab / gendam

A privacy-first generative DAM
6 stars 1 forks source link

数据库进行表结构不兼容升级以后,需要执行数据迁移。 #53

Closed web3nomad closed 22 hours ago

web3nomad commented 1 month ago

beta 上线前,数据库名字改成了 library.db。

现在 .db 里面看不到 migrations 历史记录表,难道 prisma 是通过比较 schema 差异来判断 migration 执行到哪一个的?

如果以后遇到 schema 不兼容,把原来的 db 改个名字就行,比如改成 library-archived-xxx.db,然后执行数据迁移。

web3nomad commented 1 month ago

rust prisma client 的 baselining, https://prisma.brendonovich.dev/extra/migrations#baselining

可以通过配置不同的 baselining 来实现不同版本下的 migration 更新

web3nomad commented 1 month ago

rust prisma client 的 _db_push() 可以加 accept_data_loss 和 force_reset

client
  ._db_push()
  .accept_data_loss() // --accept-data-loss in CLI
  // .force_reset()      // --force-reset in CLI
  .await // apply migrations
  .map_err(|e| {
      tracing::error!("failed to push db: {}", e);
  })?;

accept_data_loss 可以忽略删除字段时候的 warning 确保不被卡住,

然后我发现实际的行为是 schema 里删除一个 nullable 的字段并不会真的在 sql 里面删除, 需要再验证下,可能是测试用例不对,这个虽然没问题,但是不合理。

(可能是因为 rust prisma 的逻辑并不是逐个比较 applied migrations, 而是直接计算 migrations 和数据库 schema 的 diff, 然后一次性 apply diff, 就如头帖提到的一样)

web3nomad commented 6 days ago

rust prisma client 的 _db_push() 可以加 accept_data_loss 和 force_reset

client
  ._db_push()
  .accept_data_loss() // --accept-data-loss in CLI
  // .force_reset()      // --force-reset in CLI
  .await // apply migrations
  .map_err(|e| {
      tracing::error!("failed to push db: {}", e);
  })?;

accept_data_loss 可以忽略删除字段时候的 warning 确保不被卡住,

然后我发现实际的行为是 schema 里删除一个 nullable 的字段并不会真的在 sql 里面删除, 需要再验证下,可能是测试用例不对,这个虽然没问题,但是不合理。

(可能是因为 rust prisma 的逻辑并不是逐个比较 applied migrations, 而是直接计算 migrations 和数据库 schema 的 diff, 然后一次性 apply diff, 就如头帖提到的一样)

之前的用法都错了,应该用 migrate deploy 而不是 db push,后者是不使用 migrations 直接推送最终状态到数据库里,只适用于开发环境。

client
    ._migrate_deploy()
    // ._db_push()

https://github.com/bmrlab/gendam/commit/ca2bfb08c1d17d5d73d1d8231ede53775abae241

web3nomad commented 6 days ago

https://github.com/bmrlab/gendam/commit/b2a247589bb47ee1d9436fa3d8882f82082c083c

从 0.10 到 0.1.1 的时候,有很大变更

TODO 这样直接复制数据的方式行得通,但是需要有个机智判断当前版本和过去版本的差异。 比如可以通过 prisma 的 migrate diff 来判断当前数据库的 schema 的版本。