2015-10-16 28 views
1

SQLite3請求不起作用我創建了一個python腳本來創建一個帶有一個表的sqlite3數據庫。該表由2列組成:一個用於id(int),另一個用於關聯的句子(文本)。下面是代碼:
由於'character

#!/usr/bin/python 

import sqlite3 

i=0 
con = sqlite3.connect("database.db") 
cur = con.cursor() 
cur.execute('''CREATE TABLE data(data_id int, sentence text)''') 

with open("data.txt", "r") as ins: 
     for line in ins: 
     i = i + 1 
     cur.execute("insert into data(data_id, sentence) values ("+str(i)+",'"+line+"')") 

con.commit() 
con.close() 

正如你所看到的,這個代碼將讀取該文件data.txt中是包含在每一行句子的文件。

當我嘗試執行腳本,我得到這個錯誤:

Traceback (most recent call last): 
    File "scriptData.py", line 13, in <module> 
    cur.execute("insert into data(data_id, sentence) values ("+str(i)+",'"+line+"')") 
sqlite3.OperationalError: near "che": syntax error 

這是由於這樣的事實,在我的文件data.txt中,一些線路有「文字這是一個問題。我試圖通過在data.txt文件中執行'\'來保護這個字符,但它不起作用。
問題是我需要在我的句子中保留'。我不是一個Python程序員,所以我的知識非常有限。你有任何想法使這個腳本工作?

+6

_DO不連接的數據到查詢;使用查詢參數!_'cur.execute(「INSERT INTO ... VALUES(?,?)」,(i,line))' –

+1

否則有人可能會給你一個關於他們的兒子Bobby的句子。 –

+0

擴大Chads評論:[媽媽的漏洞](https://xkcd.com/327/) – Matthias

回答

4

你需要當你通過PARAMS到SQL查詢中使用轉義來避免這樣的情況:

cur.execute("insert into data(data_id, sentence) values (?, ?)", (i, line)) 
+1

我永遠不會記得sqlite是否支持'%s'格式的設置 - 使用'?'更傳統, –

+0

@JonClements,謝謝。 –

+0

我得到一個錯誤:sqlite3.OperationalError:接近「%」:語法錯誤。 – Mtoypc

3

不串接數據爲SQL查詢。這樣做很危險;惡意用戶可以執行SQL注入攻擊。改用查詢參數。

cur.execute("insert into data(data_id, sentence) values (?, ?)", (i, line)) 

另外請注意,該查詢可以通過使用executemany代替進行更有效的for循環:

cur.execute("insert into data(data_id, sentence) values (?, ?)", enumerate(ins)) 
+0

謝謝你的答案,我知道這是危險的,但這個腳本只是在這裏幫助我創建數據庫。除我以外,其他人都不會訪問它。 – Mtoypc

+0

@MoPypc好吧,它不僅安全,而且查詢適用於任何'line'文本值,不像簡單地連接它。更何況,如果你使用'executemany',那麼查詢參數是必需的,如果你插入大量的行,這是性能所需要的。 –