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[] |
答案 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))