mysql - knex 迁移失败,但不会恢复更改

标签 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 行为不正确?

最佳答案

当 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/

相关文章:

javascript - Meteor npm install font-awesome,找不到模块 'fontawesome' "

node.js - 安装后不显示完整的 NPM 依赖项列表

postgresql - 使用用户注册时创建的 ID 插入关系表

mysql - MySQL 查询速度慢需要改进

mysql - SQL:每小时、不同时间、几天内的平均值

npm - fork 未维护的 npm 包的指南?

php - Laravel 查询 - SQL : Get records start new period today

mysql - CodeIgniter 事件记录;将两个查询合并为一个?

javascript - knex - 链接语句