尝试重新实现这个oracle批量插入到postgres等效。
目前有:
a.each do |b|
params << [nil, b.value]
inserts << %{INSERT INTO table(a, b, c, d)
VALUES (:a1, :a2, :a3, :a4); }
end
sql = inserts.join
ActiveRecord::Base.transaction do
# insert
ActiveRecord::Base.connection.exec_update(sql, 'table', params)
end
使用activerecord / postgres的类似实现会是什么样的?
我收到以下错误
ActiveRecord::StatementInvalid:
# ERROR: syntax error at or near ":"
# LINE 4: VALUES (:a1, :a2, :a3, :a4, :a5, :a6, :a7, :...
# ^
答案 0 :(得分:1)
Postgresql对参数占位符使用语法$1
,$2
等。将:a1
,:a2
,...替换为$1
,$2
,...
SQL有一个预准备语句的概念,您可以在其中为语句提供占位符而不是实际值。然后,您可以执行一次或多次语句,每次都提供参数。这样效率更高,因为服务器只需要解析,分析和计划一次查询。
在回答您的评论时,您似乎正在准备一个包含多个连接在一起的INSERT
个语句的字符串。相反,您只需准备一个INSERT
语句,然后多次执行,每行参数一次。
不幸的是,我对ActiveRecord甚至Ruby都知之甚少,无法建议如何重写代码来实现这一目标!
顺便说一下,这不是我称之为“批量插入”的内容。将数据导入postgresql的最快方法通常是通过COPY命令。