为什么ActiveRecord Model.import无法在MySQL中插入批量记录?

Why ActiveRecord Model.import is failing to insert bulk records in MySQL?

提问人:soLegacy 提问时间:11/2/2023 最后编辑:dbuggersoLegacy 更新时间:11/3/2023 访问量:38

问:

我正在尝试使用 ActiveRecord 导入方法插入大约 200,000 条记录。它失败,出现 TypeError: can't quote Hash 错误。我在网上搜索了一下,但没有任何与我的场景相关的有意义的东西。

我从较小的规模开始,并成功了多达 120,000 条记录。如果我继续尝试,我想我可以找到一个极限。除了将记录插入到较小的批次中之外,我还能做些什么吗?

这是我的配置 - Rails 5.0.3、Ruby 2.3.0、Mysql 5.1.73。我知道这些已经过时了。

有人遇到过类似的问题,您是如何解决的?

MySQL Ruby-on-Rails 批量加载

评论

0赞 easleyfixed 11/3/2023
哦,我刚刚看到了版本 5 MySQL ..我不确定,但我不禁觉得,如果你升级到 8,如果不是验证问题,你可能没有问题。
0赞 easleyfixed 11/3/2023
嗯,小批量不会出错?我想知道这是否是连接超时问题?也许它的设置足够低,以至于批处理花费的时间比超时更长,并且它出错,所以在较小的运行时它很好?
0赞 soLegacy 11/3/2023
@easleyfixed您能建议我是否可以尝试一些东西来检查它是否是验证问题。你指的是 Rails 导入选项吗?在哪里可以检查连接超时?是的,较小的批量工作正常。
0赞 easleyfixed 11/3/2023
好吧,我不完全确定它的 Rails 端,而且 AFAIK 我不认为 MySQL 太关心 #,但它对 ' 和/以及其他一些如果不终止会导致问题的事情。MySQL连接超时是在MySQL中设置的。一种更简单的方法是使用 MySQL Workbench,这样您就可以进入那里并在 GUI 而不是 CLI 中四处走动。
0赞 easleyfixed 11/3/2023
另外,我想知道您的批量刀片尺寸是多少?将bulk_insert_buffer_size增加到更高的值。此外,您的read_buffer可能需要更大,甚至可能key_buffer_size增加。也许它需要在事务提交后清除,innodb_flush_log_at_trx_commit需要设置为 2。当然,这些都是在黑暗中刺伤,但希望能让你走上正确的道路。

答:

2赞 engineersmnky 11/3/2023 #1

“TypeError: can't quote Hash”由连接适配器引发。来源

可以很容易地重新创建此错误:

Arel::Nodes.build_quoted({}).to_sql. 
#=> TypeError: can't quote Hash

这意味着,在您尝试导入的记录中,很可能有一个裸露的哈希,而不是 JSON(这可能是预期的)。

如果是这种情况,您可能需要搜索记录以确定这些有问题的哈希值的位置,并相应地修改它们。例如,如果它们打算成为 JSON 数据,则可以使用它们进行转换。Hash#to_json