1 回答

TA贡献1966条经验 获得超4个赞
你永远不应该自己格式化 SQL 查询:
永远,永远,永远不要使用 Python 字符串连接 (+) 或字符串参数插值 (%) 将变量传递给 SQL 查询字符串。甚至没有在枪口下。
从文档示例中可以看出,首选方法是让库处理它。
SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes
data = ("O'Reilly", )
cur.execute(SQL, data) # Note: no % operator
这应该可以正确处理用单引号转义您的字符串。
编辑:在您的代码中添加示例。上面建议的方式不应该用于插入表名(INSERT INTO %s),它应该只用于数据部分(VALUES (%s))
EDIT2:没有注意到你想插入两个值'20-07-30-01:53', "[*IF *VALUE *EQ 'DB_CONTENT' *UNTIL]"。我已经编辑了代码,请注意%s查询字符串中的附加内容。此外,我真的看不出val[i]包含什么,但它应该是您要插入的两个值的序列(元组、列表)。
from psycopg2.sql import SQL, Identifier
SQL_QUERY_STRING = """INSERT INTO {} VALUES (%s, %s)"""
def insert(data, table):
val = [tuple(line) for line in data]
for i in range(len(val)):
curr.execute(
SQL(SQL_QUERY_STRING).format(Identifier(table)),
val[i],
# second (data) argument has to be a sequene (tuple, list, ...)
# of values to be inserted, even if it's just one value
)
添加回答
举报