我正在尝试做一些基本的事情,遍历表并更新行的字段。但是,它会给出错误
“sqlite3.OperationalError:数据库被锁定”
可能是因为我正在同时进行SELECT和UPDATE。但是我不知道如何做到这一点。
以下是我的代码的裸骨结构:
更新:更新了代码,因此只连接一次。数据库锁定问题已消失,但循环正在重置几次:001,002,001,002,003,001,002,003
UPDATE2 :再次更新了代码,显然我错过了sqlite3。但是,如果我在迭代中进行更新,前两个记录仍会迭代两次。因此,如果我在 main 中注释掉“更新”功能,则迭代从0到19.但是如果我保留它,它就像这样:0,1,0,1,2 ,3,4-,... 19
import 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