【问题标题】:Ruby / Rails array of strings to PostgreSQL insertRuby/Rails 字符串数组到 PostgreSQL 插入
【发布时间】:2014-12-11 05:32:25
【问题描述】:

目前,我有一个 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))

【问题讨论】:

    标签: ruby-on-rails ruby arrays postgresql activerecord


    【解决方案1】:

    对于这样的事情,我会忽略 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
    }
    

    应该做的伎俩并且是安全的。

    【讨论】:

    • 这不关心哈希和数组。
    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 2017-02-16
    • 2014-10-12
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多