我试图像这样在我的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");
有人知道吗?
答案 0 :(得分:2)
SQL中的字符串常量是任意字符序列 以单引号(')界定,例如'This is a string'。至 在字符串常量中包含单引号字符,写两个 相邻的单引号,例如“戴安娜的马”。 请注意,这不是 与双引号字符(“)相同。
还有第二种标识符:带分隔符的标识符或 带引号的标识符。它是通过包围任意顺序的 双引号(“)中的字符。带分隔符的标识符始终是 标识符,而不是关键字。因此,“选择”可用于指代 列或表名为“选择”,而未引用的选择将是 用作关键字,因此在以下情况时会引发解析错误 用于需要表名或列名的地方。
TL; DR:字符串常量的单引号,表/列名称的双引号。
顺便说一句,您选择的插入记录的方式容易受到sql-injection的攻击。</ p>