knex迁移失败,但不还原更改

时间:2019-12-20 12:57:21

标签: mysql npm knex.js

我想在我的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行为不正确?

1 个答案:

答案 0 :(得分:0)

当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
相关问题