目前,我有一个 Rails 项目,我正在尝试绕过事件记录到直接 postgres,以便使用字符串数组进行大批量创建,其中的值尚不存在(以避免重复)。我面临的问题是试图转义在所述 ruby 数组中包含 ' 或 (, ect.. 的字符串字符,以便 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))
最佳答案
对于这样的事情,我会忽略 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
}
应该做到这一点并且是安全的。
关于ruby-on-rails - Ruby/Rails 字符串数组到 PostgreSQL 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26394419/