我有一个列名/值的字典,要插入表中。我有一个生成INSERT
语句的函数。我被卡住了,因为函数总是在值周围加上引号,有些是整数。
e.g。如果第1列是整数类型,则该语句应为INSERT INTO myTable (col1) VALUES 5;
vs
INSERT INTO myTable (col1) VALUES '5';
第二个导致错误,表示第5列不存在。
"5"
。
在Python中,给定表和列名称,如何测试INSERT
语句是否需要在''
附近VALUES
?
答案 0 :(得分:2)
此问题标有" psycopg2" - 您可以使用格式字符串准备语句,并在许多情况下为您提供psycopg2推断类型。
cur.execute('INSERT INTO myTable (col1, col2) VALUES (%s, %s);', (5, 'abc'))
psycopg2
会为你处理它,因为Python知道5
是一个整数而'abc'
是一个字符串。
http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries
答案 1 :(得分:1)
虽然我个人不喜欢这个想法,但是当你在Postgres中插入时,你可以在整数周围使用单引号。
也许你的问题是缺少括号:
INSERT INTO myTable(col1)
VALUES('5');
Here是一个说明此代码的SQL小提琴。
正如您在评论中所述,双引号在Postgres中不起作用。
答案 2 :(得分:1)
您当然希望使用库函数来决定是否引用您插入的值。如果您要插入用户输入的任何内容,编写自己的引用功能可能会导致SQL Injection attacks。
从您的代码中可以看出,您使用的是psycopg2 - 我发现another response可能能够回答您的问题,因为我不熟悉该库。主要的要点似乎是你应该使用
cursor.execute("query with params %s %s", ("param1", "pa'ram2"))
将自动处理param1和param2所需的任何引用。
答案 3 :(得分:0)
insert into example (value_t) values ('O''Hara');
正如您在http://sqlfiddle.com/#!15/8bfbd/3中所看到的那样,无需在文本字段中插入整数或在数字字段中表示整数的字符串。
要检查字段类型,您可以使用information_schema:
select data_type from information_schema.columns
where table_schema='public'
and table_name='example'
and column_name='value_i';