2017-01-16 60 views
0

我有一個數據庫,我已經導入文本作爲主鍵。 然後,我可以使用與文本相關的關鍵字列,例如列「arson」。每個列的默認值都爲0.在for循環中,sqlite3可以引用主鍵嗎?

我試圖讓SQLite3數據庫讀取文本,檢查是否存在特定的關鍵字,然後爲關鍵字列指定1的值文字包含關鍵字。

下面的例子是我試圖只改變文本中包含單詞「Arson」的行的arson列中的值。

該程序正在讀取文本並打印3次,表明其中三個文本中包含「縱火犯」字樣。但是,我無法使用1更新單個行。我已經嘗試了下面的代碼的一些變化,但似乎卡在這一個。

!# Python3 
#import sqlite3 

sqlite_file = 'C:\\Users\\xxxx\\AppData\\Local\\Programs\\Python\\Python35-32\\database.sqlite' 
conn = sqlite3.connect(sqlite_file) 
c = conn.cursor() 



texts = c.execute("SELECT texts FROM database") 
for articles in texts: 
    for words in articles: 
     try: 
      if "Arson" in words: 
       print('yes') 
       x = articles 
       c.execute("UPDATE database SET arson = 1 WHERE ID = ?" (x)) 
     except TypeError: 
      pass 

conn.commit() 
conn.close() 
+0

'c.execute( 「UPDATE SET數據庫縱火= 1 WHERE ID =?」(X))'將提高一個'TypeError'異常。你爲什麼試圖抓住那個錯誤?你的語法錯了。 –

+0

c.execute(「更新數據庫SET arson = 1 WHERE ID =?」(x))'會引發TypeError異常。你爲什麼試圖抓住那個錯誤?你的語法錯了。 –

+0

你是對的,我刪除了try除外條款。這是從打開數據庫中的所有列開始的剩餘部分,其中一些是TEXT,另一些是INTEGER。我刪除它,現在得到一個TypeError - 'str'對象不可調用。我真的不知道該怎麼做,我將字符串傳遞給c.execute以將原始文本導入到db:text = str(articles)sets = str(ordered_set(articles))c.execute(「INSERT OR IGNORE INTO數據庫(集合,文本)VALUES(?,?)「,(集合,文本))如何獲取它以引用我的for循環中的文章? – DTracer

回答

0

四個小時後,我終於能夠解決這個問題。我添加了上面推薦的逗號。但是,這導致了其他問題,因爲代碼沒有正確執行整個循環。爲此,我不得不添加另一個遊標對象,並在循環中使用第二個遊標。修改後的代碼可以如下所示:

!# Python3 
import sqlite3 

sqlite_file = 'C:\\Users\\xxxx\\AppData\\Local\\Programs\\Python\\Python35-32\\database.sqlite' 
conn = sqlite3.connect(sqlite_file) 
c = conn.cursor() 
c2 = conn.cursor() 

atexts = c.execute("SELECT texts FROM database") 
for articles in atexts: 
    for words in articles: 
     if "arson" in words: 
      print('yes') 
      c2.execute("UPDATE database SET arson = 1 WHERE texts = ?", (words,)) 


conn.commit() 
conn.close() 
1

這個表達式:

c.execute("UPDATE database SET arson = 1 WHERE ID = ?" (x)) 

總是將引發TypeError,因爲你試圖把字符串作爲一個功能。你基本上在做"..."(argument),好像"..."是可以調用的。

你需要添加一些逗號爲它是在x傳遞作爲SQL參數嘗試:

c.execute("UPDATE database SET arson = 1 WHERE ID = ?", (x,)) 

第一個逗號傳遞到c.execute()兩個參數分開,所以現在你傳遞查詢字符串和一個單獨的參數序列。

第二個逗號使(..,)成爲一個元組,其中包含一個元素。逗號在那裏很重要,但仍需要使用括號括號來區分逗號代表的內容。

您可以完全刪除try...except TypeError。如果代碼仍然在提高TypeError例外,則仍然存在錯誤。

+0

謝謝,編輯時間耗盡後不久我就想出了逗號。我用逗號更新了代碼,不幸的是,我仍然收到一個我不明白的錯誤,「sqlite3.OperationalError:沒有這樣的列:ID」,但我檢查並重新檢查,縱火是我的專欄之一。另外,我嘗試用單詞替換x值的文章,但得到相同的結果。 – DTracer

+0

這解決了我以前的評論中的問題:c.execute(「UPDATE ancast SET arson = 1 WHERE texts =?」,(x,))....導致另一個問題,只有第二行正在更新。不是其他人,第一個也是最後一個。我會檢查我的循環。 – DTracer

+0

@DTracer:你沒有分享你的表格列,所以我只能假設'ID'是正確的列名。如果「文本」是可以選擇的正確列名,那麼是的,這將解決問題。 –