2017-08-08 72 views
1

努力值添加到表時,我發現了以下錯誤:的Python - sqlite的 - OperationalError:近「S」:語法錯誤

line 33, in insert 
    c.execute("INSERT INTO {tn} (Process, Info) VALUES('{proc}', 
'{inf}')".format(tn=table_name, proc=proc, inf=content)) 
OperationalError: near "s": syntax error 

這是使用某些文本時,如果我寫發生常規的東西有沒有問題,但例如類似的東西:

#. My item number one 
#. My item number two with some more content 
    and it's continuing on the second line? 
#. My third item:: 
    Oh wait, we can put code! 
#. My four item:: 
    No way. 
.. _bottom: 
    Go to top_''' 

它失敗.. 這是我使用的代碼:

def insert(table_name, proc, content): 

    conn = sqlite3.connect(sqlite_file) 
    conn.text_factory = str 
    c = conn.cursor() 

    c.execute("INSERT INTO {tn} (Process, Info) VALUES('{proc}', 
       '{inf}')".format(tn=table_name, proc=proc, inf=content)) 

    conn.commit() 
    conn.close() 

欣賞你的幫助:)

回答

4

語法錯誤是由你插入包含元字符的數據到你的SQL查詢造成的。在您的具體示例中,您的數據包含一個'字符,並表示字符串的結尾。接下來的字符s就是一個語法錯誤。

不是使用str.format()將您的數據放入查詢中。使用SQL參數,並留下正確的逃逸到數據庫驅動程序:

c.execute("INSERT INTO {tn} (Process, Info) VALUES(?, ?)".format(tn=table_name), 
      (proc, content)) 

兩個?字符作爲佔位符的數據庫驅動程序從(proc, content)元組插入值。司機會妥善處理這些價值。

由於SQL參數只能用於,而不是表格等對象名稱,所以仍然會使用字符串格式來插入表名。您需要100%確定您不接受table_name變量的任意不可信數據。例如,首先將該數據與有效表名稱列表進行比較。

+0

可以使用一些關於sql注入的信息,作爲你不想使用'str.format()'的原因。但總體上很好的解釋。 – Don

相關問題