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
? ? ? ? )
添加回答
舉報