1 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
你永遠(yuǎn)不應(yīng)該自己格式化 SQL 查詢:
永遠(yuǎn),永遠(yuǎn),永遠(yuǎn)不要使用 Python 字符串連接 (+) 或字符串參數(shù)插值 (%) 將變量傳遞給 SQL 查詢字符串。甚至沒有在槍口下。
從文檔示例中可以看出,首選方法是讓庫處理它。
SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes
data = ("O'Reilly", )
cur.execute(SQL, data) # Note: no % operator
這應(yīng)該可以正確處理用單引號(hào)轉(zhuǎn)義您的字符串。
編輯:在您的代碼中添加示例。上面建議的方式不應(yīng)該用于插入表名(INSERT INTO %s),它應(yīng)該只用于數(shù)據(jù)部分(VALUES (%s))
EDIT2:沒有注意到你想插入兩個(gè)值'20-07-30-01:53', "[*IF *VALUE *EQ 'DB_CONTENT'? *UNTIL]"。我已經(jīng)編輯了代碼,請(qǐng)注意%s查詢字符串中的附加內(nèi)容。此外,我真的看不出val[i]包含什么,但它應(yīng)該是您要插入的兩個(gè)值的序列(元組、列表)。
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
? ? ? ? )
添加回答
舉報(bào)