在postgres中插入值,但它们被解释为列

时间:2018-07-11 09:00:37

标签: ruby-on-rails postgresql activerecord

我试图像这样在我的postgres数据库中插入一些数据:

  def insert_row(conn, row)
    attendee = map_row_to_struct(row)

    conn.execute(
      <<-SQL
        INSERT INTO tmp_attendee_import (email, first_name, last_name)
        VALUES("#{attendee.email}", "#{attendee.first_name}", "#{attendee.last_name}");
      SQL
    )
  end

SQL的出色表现为:

INSERT INTO tmp_attendee_import (email, first_name, last_name)
VALUES("myemail@yahoo.com", "Gigel", "Ion");

但我收到此错误:

Failure/Error:
               conn.execute(
                 <<-SQL
                   INSERT INTO tmp_attendee_import (email, first_name, last_name)
                   VALUES("#{attendee.email}", "#{attendee.first_name}", "#{attendee.last_name}");
                 SQL
               )

     ActiveRecord::StatementInvalid:
       PG::UndefinedColumn: ERROR:  column "myemail@yahoo.com" does not exist
       LINE 2:             VALUES("myemail@yahoo.com", "Gigel", "Ion");
                                  ^
       :             INSERT INTO tmp_attendee_import (email, first_name, last_name)
                   VALUES("myemail@yahoo.com", "Gigel", "Ion");

有人知道吗?

1 个答案:

答案 0 :(得分:2)

Postgres manual

  

SQL中的字符串常量是任意字符序列   以单引号(')界定,例如'This is a string'。至   在字符串常量中包含单引号字符,写两个   相邻的单引号,例如“戴安娜的马”。 请注意,这不是   与双引号字符(“)相同。

     

还有第二种标识符:带分隔符的标识符或   带引号的标识符。它是通过包围任意顺序的   双引号(“)中的字符。带分隔符的标识符始终是   标识符,而不是关键字。因此,“选择”可用于指代   列或表名为“选择”,而未引用的选择将是   用作关键字,因此在以下情况时会引发解析错误   用于需要表名或列名的地方。

TL; DR:字符串常量的单引号,表/列名称的双引号。

顺便说一句,您选择的插入记录的方式容易受到sql-injection的攻击。<​​/ p>