目前,我有一个rails项目,我试图将活动记录转换为直接postgres,以便使用字符串数组进行大批量创建,其中值尚不存在(以避免重复)。我面临的问题是试图逃避包含'的字符串字符。或(例如,在所述ruby数组中,postgres可以接受。示例如下(显然不起作用):
Ruby数组:
array_of_strings = ["example one's value", "example (2) value"]
sql = "INSERT INTO TABLE (column) SELECT column FROM TABLE UNION VALUES #{array_of_strings} EXCEPT SELECT column FROM TABLE;"
ActiveRecord::Base.connection.execute(ActiveRecord::Base.send(:sanitize_sql_array, sql))
答案 0 :(得分:2)
对于类似这样的事情,我忽略了ActiveRecord引用和转义内容并直接转到ActiveRecord::Base.connection.quote
。
您最终想要的SQL就是这样的:
INSERT INTO TABLE (column)
SELECT column FROM TABLE
UNION VALUES ('example one''s value'), ('example (2) value')
EXCEPT SELECT column FROM TABLE
您可以使用quote
将'
转换为''
(请注意,SQL会将单引号加倍以转义它们),但您必须在VALUES中添加适当的括号你自己。连接的quote
方法也会添加外部单引号。
这样的事情:
values = array_of_strings.map { |s| "(#{ActiveRecord::Base.connection.quote(s)})" }.join(',')
接下来是:
sql = %Q{
INSERT INTO TABLE (column)
SELECT column FROM TABLE
UNION VALUES #{values}
EXCEPT SELECT column FROM TABLE
}
应该做到这一点并且安全。