mercredi 21 octobre 2015

Database is locking but all statements are followed by commit?

I'm working on an IRC bot, forked from a modular bot called Skybot. There are two other modules that make use of the sqlite3 database by default; they have both been removed and their tables dropped, so I know that the issue is somewhere in what I'm doing. I only call 3 db.execute() statements in the whole thing and they're all immediately committed. This thing isn't getting hammered with queries either, but the lock remains.

Relevant code:

def db_init(db):
    db.execute("create table if not exists searches"
               "(search_string UNIQUE PRIMARY KEY,link)")
    db.commit()

    return db


def get_link(db, inp):
        row = db.execute("select link from searches where"
                         " search_string=lower(?) limit 1",
                         (inp.lower(),)).fetchone()
    db.commit()
    return row


def store_link(db, stub, search):
    db.execute("insert into searches (search_string, link) VALUES (?, ?)", (search.lower(), stub))
    db.commit()
    return stub

If the script only has to touch db_init() and get_link() it breezes through, but if it needs to call store_link() while the database is unlocked it will do the insert, but doesn't seem to be committing it in a way that future calls to get_link() can read it until the bot restarts.

The bot's db.py:

import os
import sqlite3


def get_db_connection(conn, name=''):
"returns an sqlite3 connection to a persistent database"

if not name:
    name = '%s.%s.db' % (conn.nick, conn.server)

filename = os.path.join(bot.persist_dir, name)
return sqlite3.connect(filename, isolation_level=None)

bot.get_db_connection = get_db_connection

I did adjust the isolation_level myself, that was originally timeout=10. I am fairly stumped.

Aucun commentaire:

Enregistrer un commentaire