python sqlite3 SELECT和UPDATE导致数据库锁定错误

时间:2016-04-27 12:28:22

标签: python sqlite

我正在尝试做一些基本的事情,遍历表并更新行的字段。但是,它会给出错误

  

“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

0 个答案:

没有答案