Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x sqlite3能否在for循环期间引用主键?_Python 3.x_Sqlite - Fatal编程技术网

Python 3.x sqlite3能否在for循环期间引用主键?

Python 3.x sqlite3能否在for循环期间引用主键?,python-3.x,sqlite,Python 3.x,Sqlite,我有一个数据库,在那里我把文本作为主键导入。 然后,我有一些列,其中包含与文本相关的关键字,例如“arson”列。这些列中的每一列都有一个默认值0 我试图让SQLite3数据库读取文本,检查是否存在特定的关键字,然后为包含关键字的文本所在行的关键字列指定一个1值 下面的例子是我试图仅为文本中包含单词“arson”的行更改arson列中的值 该程序正在读取文本并打印3次“是”,表明其中三个文本中有“纵火”字样。但是,我无法使用1更新单个行。我尝试了下面代码的一些变体,但似乎在这一个上卡住了 !#

我有一个数据库,在那里我把文本作为主键导入。 然后,我有一些列,其中包含与文本相关的关键字,例如“arson”列。这些列中的每一列都有一个默认值0

我试图让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()
这句话:

c.execute("UPDATE database SET arson = 1 WHERE ID = ?" (x))
始终将引发一个
类型错误
,因为您试图将字符串视为一个函数。您基本上是在执行
“…”(参数)
,就好像
“…”
是可调用的

您需要添加一些逗号,以便尝试将
x
作为SQL参数传入:

c.execute("UPDATE database SET arson = 1 WHERE ID = ?", (x,))
第一个逗号分隔了传递给
c.execute()
的两个参数,因此现在可以传递一个查询字符串和一个单独的参数序列

第二个逗号构成一个元组,其中有一个元素。逗号在这里很重要,尽管仍然需要括号来消除逗号所代表的含义的歧义


您可以删除
try…,但TypeError除外。如果代码仍然引发
TypeError
异常,那么您仍然有一个bug。

四个小时后,我终于能够解决这个问题。我添加了上面建议的逗号;但是,这导致了其他问题,因为代码没有正确执行整个循环。为此,我必须添加另一个游标对象,并在循环中使用第二个游标。修订后的守则如下:

!# 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()

c.execute(“更新数据库集arson=1,其中ID=?“(x))
将引发
TypeError
异常。你为什么要抓住那个错误?您的语法有误。
c.execute(“更新数据库集arson=1,其中ID=?“(x))
将引发
TypeError
异常。你为什么要抓住那个错误?你的语法错了。你是对的,我删除了try-except子句。这是我打开数据库中所有列时留下的,其中一些是文本,另一些是整数。我删除了它,现在得到一个TypeError-“str”对象不可调用。我真的不知道该怎么办,我将字符串传递给c.execute以将原始文本输入数据库:text=str(articles)set=str(ordered_set(articles))c.execute(“插入或忽略数据库(set,text)值(?,),(set,text)),我如何让它引用for循环中的文章?谢谢,编辑时间用完后不久,我就算出了逗号。我用逗号更新了代码,不幸的是,我仍然收到一个我不理解的错误,“sqlite3.OperationalError:没有这样的列:ID”,但我检查了又重新检查,arson是我的一个列。此外,我尝试用文字替换x值的文章,但得到了相同的结果。这解决了我之前评论中的问题:c.execute(“UPDATE ancast SET arson=1,其中text=?”,(x,)…导致了另一个问题,只更新了第二行。不是其他的,第一个和最后一个。我将检查我的循环。@DTracer:您没有共享表列,因此我只能假设
ID
是正确的列名。如果
text
是要选择的正确列名,则是,这将解决问题。