有没有办法在 Adonis Lucid 中压缩迁移或基线数据库?
Is there a way to squash migrations or baseline a database in Adonis Lucid?
我想要一种从 Adonis 生态系统中的现有数据库以编程方式生成迁移的方法。例如,必须 运行 500 次迁移,在每次测试期间 运行 很烦人并且需要时间,我想将迁移压缩到某个点成为一个初始迁移。有没有办法在 Adonis CLI 中执行此操作?到目前为止,我的研究得出的结论是不,我只需要手动创建一个初始迁移以匹配数据库的当前状态,这似乎极易出错。
官方没有办法
我遇到了同样的问题并决定通过 运行 在干净的数据库上进行所有迁移然后将整个数据库转储导出到 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 秒左右。
我想要一种从 Adonis 生态系统中的现有数据库以编程方式生成迁移的方法。例如,必须 运行 500 次迁移,在每次测试期间 运行 很烦人并且需要时间,我想将迁移压缩到某个点成为一个初始迁移。有没有办法在 Adonis CLI 中执行此操作?到目前为止,我的研究得出的结论是不,我只需要手动创建一个初始迁移以匹配数据库的当前状态,这似乎极易出错。
官方没有办法
我遇到了同样的问题并决定通过 运行 在干净的数据库上进行所有迁移然后将整个数据库转储导出到 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 秒左右。