2016-04-25 25 views
0
def quantity(): 
    i = 0 
    x = 1 

    file = open("john.txt", "r") 

    while i < 5000: 

     for line in file: 
      c.execute("INSERT INTO test (playerNAME, playerID) VALUES ("+line+", "+str(x)+")") 
      conn.commit() 

      x = random.randint(100,10000000000000000) 
      i += 1 

我嘗試遍歷John.txt文件並將每個值插入到表中。 txt文件中的第一個單詞是「abc123」。當我運行此代碼有一個錯誤:sqlite3.OperationalError:沒有這樣的列:abc123嘗試從python的sqlite中插入txt文件的值

我可以得到的代碼輸入到playerID的隨機數,但我不能讓txt文件查詢工作...

+0

你錯過了附近的引號:'VALUES('「+ line +」',「+ str(x)+」)「)' – trans1st0r

+1

不要連接sql查詢和字符串,使用參數化版本的'execute'。 – DeepSpace

回答

1

你需要在字符串周圍單引號。

c.execute("INSERT INTO test (playerNAME, playerID) VALUES ('"+line+"', "+str(x)+")") 

否則,它會嘗試將其解釋爲sql表達式並查找指定的列。

更一般地說,您應該使用參數或對來自文件的傳入數據進行清理,以防止sql插入的安全性。即使你信任這個特定的文件。這是一個好習慣。

c.execute("INSERT INTO test (playerName, playerID) VALUES (?, ?)", (line, x)) 

Details are herehere就是爲什麼它是非常重要的。

+0

你能解釋一下你用什麼參數來消毒...?我不明白。謝謝你的答案! – Dominico909

+0

如果playerID是字符串類型,而不是數字類型,你會讓他們圍繞第二個參數 – nephlm

1

格式化通過字符串連接的sql查詢是不好的做法。 可變bindging應始終使用:

c.execute("INSERT INTO test (playerNAME, playerID) VALUES (?, ?)", [line, x]) 

在你的情況下,線路上可能包含空格或任何標點符號。 雖然sqlite的錯誤字符串是誤導。

+0

爲什麼這個方法更好的練習? – Dominico909

+0

@ Dominico909因爲你的行可能包含一些sql並且它會被執行,請考慮:'DROP TABLE blahbla' – robyschek

+0

哦謝謝!滑稽漫畫^。^ – Dominico909