我想在我的 ts 项目中使用 knex。 迁移看起来像这样:
export async function up(knex: Knex): Promise<any> {
return knex.schema.createTable('first_table', (t) => {
t.integer('first_table_id').primary();
}).createTable('second_table', (t) => {
t.integer('id');
// simulation sql error, duplicate in this case.
t.integer('id').
})
}
迁移已经失败。我等待所有更改的事务回滚,但我已成功创建first_table。我不明白某些内容或 Knex 行为不正确?
最佳答案
当 mysql 执行 DDL 查询时,它会隐式提交。因此,在创建表事务的每个查询之后,都会自动提交。
除了在运行迁移之前进行数据库转储并在迁移失败时恢复它之外,没有真正简单的方法来解决这个问题。
https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html
例如,如果您执行以下操作,则使用 mysql:
* start transaction
* create table 1
* rollback
表 1 仍将被创建,并且不会回滚任何内容,因为 mysql 内部实际上会执行以下操作:
* start transaction
* create table 1
* implicit commit
* implicit start transaction for rollback query
* rollback of automatically started empty transaction
关于mysql - knex 迁移失败,但不会恢复更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59425666/