我想要一种从Adonis生态系统中现有数据库中以编程方式生成迁移的方法。例如,在每次测试运行期间必须运行500个迁移是烦人的,而且需要时间,我希望将迁移压缩到一个初始迁移的某个点。在Adonis CLI中有办法做到这一点吗?到目前为止,我的研究得出了否定的结论,我只需手工创建一个初始迁移,以匹配数据库的当前状态,这似乎非常容易出错。
发布于 2022-02-25 19:10:58
没有官方的方法。
我也遇到了同样的问题,并决定通过在干净数据库上运行所有迁移,然后将整个数据库转储导出到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秒。
https://stackoverflow.com/questions/71240508
复制相似问题