使用psycopg2插入多字符串和空数组

时间:2014-12-15 05:54:10

标签: python postgresql psycopg2

psycopg2在插入多个单词,空字符串和空数组时会抱怨:

name = "Meal Rounds"
description = ""
sizes = []
cur.execute(""" INSERT INTO items (name, description, sizes) VALUES (%s, %s, %s)""" % (name, description, sizes))

错误:

# Multi word error
psycopg2.ProgrammingError: syntax error at or near "Rounds"
LINE 1: ... (name, description, sizes) VALUES (Meal Rounds, , ...
                                                    ^
# Empty string error
psycopg2.ProgrammingError: syntax error at or near ","
LINE 1: ...scription, sizes) VALUES ("Meal Rounds", , [], Fals...
                                                    ^
# Empty array error
psycopg2.ProgrammingError: syntax error at or near "["
LINE 1: ...n, sizes) VALUES ("Meal Rounds", "None", [], False)...
                                                    ^

我可以通过转义来解决多字错误:

""" INSERT INTO items (name, description, sizes) VALUES (\"%s\", \"%s\", %s)"""

但是对于有15列以上的表,逃避每一个是痛苦的。 psycopg2不能以更简单的方式处理这个问题吗?但它仍然会为空字符串抛出错误。

如何更有效地插入多个单词,以及如何插入空字符串和数组?

以下是psql在我的列上输出的内容:

 name          | character varying(255)   | 
 description   | character varying(255)   | 
 sizes         | integer[]                |

1 个答案:

答案 0 :(得分:1)

你的执行调用是创建一个带有Python字符串替换的字符串,结果证明它是无效的SQL。您应该使用Python DB API提供的参数替换:

https://www.python.org/dev/peps/pep-0249/#id15

要使用参数替换调用execute,可以传递两个参数。第一个是使用与数据库相关的参数字符串的查询。 Psycopg2使用" pyformat" paramstyle所以你的查询将按照书面形式工作。第二个参数应该是您要替换到查询中的变量。数据库驱动程序将处理您需要的所有引用/转义。所以你的执行调用应该是

cur.execute("""INSERT INTO items (name, description, sizes) VALUES (%s, %s, %s)""", (name, description, sizes))