使用PG gem在参数化语句中多次插入

时间:2018-09-25 00:10:33

标签: ruby postgresql pg

我使用Ruby PG宝石,尝试通过exec_params同时插入几行。

我想要实现的是:

INSERT INTO public.my_things (col1, col2)
VALUES
    ('value11', 'value12'),
    ('value21', 'value22'),
    ('value31', 'value32');

我尝试了这个(以及其他组合):

connection.exec_params(
  'INSERT INTO public.my_things (col1, col2) VALUES ($1, $2)',
  [['value11', 'value12'], ['value21', 'value22'], ['value31', 'value32']],
)

1 个答案:

答案 0 :(得分:2)

有两件事要注意:

  1. 您需要正确数量的占位符。
  2. #exec_params需要一个平面数组作为参数。

所以你想说:

connection.exec_params(
  'INSERT INTO public.my_things (col1, col2) VALUES ($1, $2), ($3, $4), ($5, $6)',
  ['value11', 'value12', 'value21', 'value22', 'value31', 'value32']
)

或者,如果您有一个数组数组,并且您不知道到运行时要花多长时间:

aoa = [['value11', 'value12'], ['value21', 'value22'], ['value31', 'value32'], ... ]
values = aoa.length.times.map { |i| "($#{2*i+1}, $#{2*i+2})" }.join(',')
connection.exec_params(
  "INSERT INTO public.my_things (col1, col2) VALUES #{values}",
  aoa.flatten
)