PostgreSQL相当于Oracle批量插入

时间:2017-04-24 23:02:58

标签: oracle postgresql rspec

尝试重新实现这个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, :...
  #                                   ^

1 个答案:

答案 0 :(得分:1)

Postgresql对参数占位符使用语法$1$2等。将:a1:a2,...替换为$1$2,...

SQL有一个预准备语句的概念,您可以在其中为语句提供占位符而不是实际值。然后,您可以执行一次或多次语句,每次都提供参数。这样效率更高,因为服务器只需要解析,分析和计划一次查询。

在回答您的评论时,您似乎正在准备一个包含多个连接在一起的INSERT个语句的字符串。相反,您只需准备一个INSERT语句,然后多次执行,每行参数一次。

不幸的是,我对ActiveRecord甚至Ruby都知之甚少,无法建议如何重写代码来实现这一目标!

顺便说一下,这不是我称之为“批量插入”的内容。将数据导入postgresql的最快方法通常是通过COPY命令。