gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:36:24 26 4
gpt4 key购买 nike

问题:

我正在尝试向具有数千万行的表添加新列,而不阻塞它。

我知道这里有一些选项,并且我已经尝试使用 NULL 值和默认值来进行 ALTER TABLE 操作,但这需要很长一段时间(不可行)并锁定表。

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

我的问题在于数据副本上的 Knex。

我正在本地进行测试,下面的查询在 Sequel Pro 的 MySQL 版本 5.6.34 中运行得非常好,但是我收到一条 You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,了解在 Knex 中使用 close ' 的正确语法。

knex.schema.raw(`
SELECT @prevMaxIdMovedRecord;
SELECT @newMaxIdMovedRecord;
SELECT maxIdMoved FROM migration_status
ORDER BY maxIdMoved DESC
INTO @prevMaxIdMovedRecord;

INSERT IGNORE INTO table_copy (field1, newField1)
SELECT t.field1, 1 FROM table t
WHERE t.id BETWEEN @prevMaxIdMovedRecord AND @prevMaxIdMovedRecord + 50000;

SELECT id FROM table_copy
ORDER BY id DESC
LIMIT 1
INTO @newMaxIdMovedRecord;

INSERT INTO migration_status (maxIdMoved)
VALUES (@newMaxIdMovedRecord);

DELIMITER ;
`)

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

谢谢

最佳答案

默认情况下,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进行介绍。

关于mysql - 使用 Knex 和 MySQL 执行多条语句(变量和迁移),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57514470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com