2017-01-16 61 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'是正确的列名。如果“文本”是可以选择的正确列名,那么是的,这将解决问题。 –