How do I unlock a SQLite database?

前端 未结 30 1870
栀梦
栀梦 2020-11-22 15:56
sqlite> DELETE FROM mails WHERE (`id` = 71);
SQL error: database is locked

How do I unlock the database so this will work?

30条回答
  •  北荒
    北荒 (楼主)
    2020-11-22 16:40

    I had the same problem. Apparently the rollback function seems to overwrite the db file with the journal which is the same as the db file but without the most recent change. I've implemented this in my code below and it's been working fine since then, whereas before my code would just get stuck in the loop as the database stayed locked.

    Hope this helps

    my python code

    ##############
    #### Defs ####
    ##############
    def conn_exec( connection , cursor , cmd_str ):
        done        = False
        try_count   = 0.0
        while not done:
            try:
                cursor.execute( cmd_str )
                done = True
            except sqlite.IntegrityError:
                # Ignore this error because it means the item already exists in the database
                done = True
            except Exception, error:
                if try_count%60.0 == 0.0:       # print error every minute
                    print "\t" , "Error executing command" , cmd_str
                    print "Message:" , error
    
                if try_count%120.0 == 0.0:      # if waited for 2 miutes, roll back
                    print "Forcing Unlock"
                    connection.rollback()
    
                time.sleep(0.05)    
                try_count += 0.05
    
    
    def conn_comit( connection ):
        done        = False
        try_count   = 0.0
        while not done:
            try:
                connection.commit()
                done = True
            except sqlite.IntegrityError:
                # Ignore this error because it means the item already exists in the database
                done = True
            except Exception, error:
                if try_count%60.0 == 0.0:       # print error every minute
                    print "\t" , "Error executing command" , cmd_str
                    print "Message:" , error
    
                if try_count%120.0 == 0.0:      # if waited for 2 miutes, roll back
                    print "Forcing Unlock"
                    connection.rollback()
    
                time.sleep(0.05)    
                try_count += 0.05       
    
    
    
    
    ##################
    #### Run Code ####
    ##################
    connection = sqlite.connect( db_path )
    cursor = connection.cursor()
    # Create tables if database does not exist
    conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS fix (path TEXT PRIMARY KEY);''')
    conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS tx (path TEXT PRIMARY KEY);''')
    conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS completed (fix DATE, tx DATE);''')
    conn_comit( connection )
    

提交回复
热议问题