好的,我想出了一个有点笨拙的解决方案,但它确实有效!
在 MySQL 中,制作一个简单的测试表:
CREATE TABLE `aa_test` (
`a` int(11) unsigned NOT NULL AUTO_INCREMENT,
`b` varchar(256) DEFAULT NULL,
`c` varchar(256) DEFAULT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8;
在您的 ruby 代码中,将您的行组合成一个大的 honkin' 数组:
values = [1, 'hi', 'there', 2, 'ho', 'there', 47, 'yo', 'buddy']
动态构建查询,具体取决于您拥有的行数:
query = "INSERT INTO aa_test (`a`, `b`, `c`) VALUES "
(values.size / 3).times {|ignore|
query << '(?,?,?),'
}
query.chop! # remove final comma
client.prepare(query).execute(*values)
有用!至少,在irb。:-)
# mysql -h*** -u*** -p*** YourDatabaseHere -e'SELECT * FROM aa_test'
+----+------+-------+
| a | b | c |
+----+------+-------+
| 1 | hi | there |
| 2 | ho | there |
| 47 | yo | buddy |
+----+------+-------+
当然,您必须跟踪 values[] 中有多少字段和行。您可以将列名保存在一个数组中,并将它们插入到查询中并为循环提供除数。
这是我的应用程序中动态行数的示例。您只需要一个列名数组:
col_names = ['Date', 'Receipt_type', 'Type', 'Name', 'Item', 'Num', 'Amount', 'Source', 'Destination', 'Statement_s']
query = 'INSERT INTO sa_general_journal ('
col_names.each do |col_name|
query << '`' << col_name << '`,'
end
query.chop!
query << ') VALUES '
(values.size / col_names.size).times {|ignore|
query << '('
(col_names.size).times {|ignore|
query << '?,'
}
query.chop!
query << '),'
}
query.chop!
client.prepare(query).execute(*values)
请记住,准备好的语句存在服务器端限制。max_prepared_stmt_count
限制可以排队的准备好的语句的数量,以减少拒绝服务攻击。如果设置为零,则不能执行任何准备好的语句。此外,如果您正在加载 BLOBS,请记住准备好的语句数据必须在max_allowed_packet
(我的服务器上为 16MB)范围内。我正在使用准备好的语句将 PDF 文件加载到 BLOB 中,这让我吃了好几次。
我来这里是为了寻找答案,但不得不自己想出一个。我知道这是一个老问题。(人们因为回答老问题而跳槽我!)但我希望这对像我一样通过搜索到达这里的人有用!