使用Knex和MySQL执行多条语句(变量和迁移)

时间:2019-08-15 18:32:50

标签: mysql database migration knex.js

问题:

我正试图在不阻塞的情况下向具有数千万行的表中添加新列。

我知道这里有一些选项,并且我已经尝试ALTER TABLE的{​​{1}}值和默认值,但是要花很长时间(不可行) )并锁定表格。

因此,我正在尝试编写一个迁移脚本,该脚本会将原始表的结构复制到新表中,将新列添加到该新表中,然后将旧表数据缓慢迁移到新表中。

我的问题是在数据副本上出现了Knex。

我正在本地进行测试,以下查询在Sequel Pro的MySQL 5.6.34版中运行得很好,但是在Knex中却得到了NULL

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '

这里有什么专家可以提供帮助吗?我看不到Knex允许您在Knexfile.js中指定MySQL版本,我想知道语法版本之间是否可能不匹配。我在新表等方面的所有其他命令都可以正常工作...

谢谢

1 个答案:

答案 0 :(得分:1)

默认情况下,mysql驱动程序在单个查询中将不接受多个语句。您可以通过一个简单的Node程序来演示这一点:

const mysql = require('mysql')

connection = mysql.createConnection({
    host: 'localhost',
    user: 'youruser',
    password: 'yourpassword',
    database: 'yourdb',
    multipleStatements: true
})
connection.connect()

connection.query('SELECT 1+1; SELECT 2+2;', function(err, results) {
    if (err) {
        throw err
    }

    console.log(results[0], results[1])
})

connection.end()

如果将multipleStatements设置为false,则应该看到错误。尽管multipleStatements可以通过您的knexfile.js传递给驱动程序,

 {
    client: "mysql",
    connection: {
        // ... other options ...
        multipleStatements: true
    }
}

,您可以尝试这样做,我建议您使用事务,因为在一个大表上像这样在一个查询中执行多条语句充其量似乎很脆弱。简介,请参见docs