我有一个数据库,我将文本作为主键导入。 然后,我的列中包含可与文本相关的关键字,例如“arson”列。这些列中的每一列都具有默认值0。
我试图让SQLite3数据库读取文本,检查是否存在特定关键字,然后为关键字列分配1值,用于包含关键字的文本的行。
以下示例是我尝试更改纵火列中的值仅适用于文本中包含单词“Arson”的行。
程序正在阅读文本并打印3次,表示其中三个文本中包含“Arson”字样。但是,我无法使用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 :(得分: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
例外,那么您仍有错误。
答案 1 :(得分: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()