我正在尝试做一些基本的工作,遍历一个表并更新一个行字段。但是,它给出了错误"sqlite3.OperationalError: database is locked"
可能是因为我同时在做选择和更新。不过,我不知道怎么做。在
下面是我代码的基本结构:
更新:更新代码,因此只连接一次。数据库锁定问题已消失,但循环正在重置几次:001002002003001002003
UPDATE2:再次更新代码,显然我错过了sqlite3的一些内容。但是,如果我在迭代中做了更新,前两个记录仍然会被迭代两次。因此,如果我在main中注释掉“update”函数,则迭代从0到19。但如果我把它放在那里,它是这样的:0,1,0,1,2,3,4,…19import sqlite3,time
db_file="testdb.db"
conn=sqlite3.connect(db_file)
def createTables():
cursor=conn.cursor()
cmd='''
CREATE TABLE IF NOT EXISTS photos(
photo_id CHAR(15) UNIQUE,
hosted_id CHAR(15)
);
'''
cursor.execute(cmd)
conn.commit()
cmd2="INSERT OR IGNORE INTO photos VALUES ('{}','')"
for i in range(300):
cursor.execute(cmd2.format(i))
conn.commit()
def query(cursor):
cmd='''
SELECT * FROM photos
'''
return cursor.execute(cmd)
def update(photo_id,hosted_id):
cmd='''
UPDATE photos
SET hosted_id='{hosted_id}'
WHERE photo_id = '{photo_id}'
'''.format(**locals())
cursor=conn.cursor()
res=cursor.execute(cmd)
conn.commit()
def getHostedID():
return "foo"
if __name__=="__main__":
createTables()
cur1=conn.cursor()
query(cur1)
counter=0
for i in range(20):
res=cur1.fetchone()
hosted_id=counter
print hosted_id, res[0]
#This update makes iteration funky
update(res[0],hosted_id)
counter=counter+1