目前,我有一个 Rails 项目,我正在尝试将活动记录直接传递到 postgres,以便使用字符串数组进行大批量创建,其中值尚不存在(以避免重复)。我面临的问题是试图将 ruby 数组中包含 ' 或 ( 等的字符串字符转义为 postgres 可以接受的。示例如下(显然它不起作用):
红宝石数组:
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))
对于这样的事情,我会忽略 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
转换'
to ''
(请注意,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
}
应该能解决问题并且安全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)