for循环期间sqlite3可以引用主键吗?

时间:2017-01-16 08:34:22

标签: python-3.x sqlite

我有一个数据库,我将文本作为主键导入。 然后,我的列中包含可与文本相关的关键字,例如“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()

2 个答案:

答案 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()