0

我想要一种从 Adonis 生态系统中的现有数据库以编程方式生成迁移的方法。例如,在每次测试运行期间必须运行 500 次迁移很烦人并且需要时间,我想将迁移到某个点压缩到一个初始迁移中。有没有办法在 Adonis CLI 中做到这一点?到目前为止,我的研究没有得出结论,我只需要手动创建一个初始迁移以匹配似乎极易出错的 db 的当前状态。

4

1 回答 1

0

官方没有办法。

我遇到了同样的问题,并决定通过在干净的数据库上运行所有迁移然后将整个数据库转储导出到 sql 文件来解决它,该文件将作为第一次迁移运行,如下所示:

export default class NewVersion extends BaseSchema {
  public async up() {
    this.defer(async (db) => {
      const sql = await readFile(path.join(__dirname, '../versions/dumps/v1.0.0.sql'), 'utf-8')
      await db.rawQuery(sql)
    })
  }

为了保持一切井井有条,我制作了这样的文件夹结构: 在此处输入图像描述

这样,如果我需要检查特定内容,我就可以访问所有迁移。

还有一件事......我在 v0.0.0 中的最后一次迁移是:

从“@ioc:Adonis/Lucid/Schema”导入 BaseSchema

export default class EndVersion extends BaseSchema {
  public async up() {
    this.defer(async (db) => {
      const lastBatch = await db.from('adonis_schema').orderBy('batch', 'desc').firstOrFail()
      await db.table('adonis_schema').insert({
        name: 'database/migrations/1644361478305_VERSION_1.0.0',
        batch: lastBatch.batch + 1,
      })
    })
  }

  public async down() {
    this.defer(async (db) => {
      await db
        .from('adonis_schema')
        .where('name', 'database/migrations/1644361478305_VERSION_1.0.0')
        .delete()
    })
  }
}

此迁移将新的第一个迁移(sql 转储)设置为已完成,因为我不希望它在我已经运行所有迁移的数据库上运行。

这样我在生产服务器上就有了干净的迁移状态。新的迁移可能会继续堆积。

关于这一点的另一个好处是,我从头开始的迁移运行时间从几分钟缩短到了 20 秒。

于 2022-02-25T19:10:58.393 回答