Python 数据库处于锁定状态,但所有语句后面都跟有commit?

Python 数据库处于锁定状态,但所有语句后面都跟有commit?,python,sqlite,Python,Sqlite,我正在开发一个IRC机器人,它是由一个名为Skybot的模块化机器人派生而来的 默认情况下,还有两个模块使用sqlite3数据库;他们都被移除了,他们的桌子也掉了,所以我知道问题出在我正在做的事情中 在整个过程中,我只调用3个db.execute()语句,它们都会立即提交。这件事也没有受到查询的影响,但锁仍然存在 相关代码: def db_init(db): db.execute("create table if not exists searches" "

我正在开发一个IRC机器人,它是由一个名为Skybot的模块化机器人派生而来的

默认情况下,还有两个模块使用sqlite3数据库;他们都被移除了,他们的桌子也掉了,所以我知道问题出在我正在做的事情中

在整个过程中,我只调用3个
db.execute()
语句,它们都会立即提交。这件事也没有受到查询的影响,但锁仍然存在

相关代码:

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
如果脚本只需触摸
db_init()
get_link()
即可通过,但如果需要在数据库解锁时调用
store_link()
,它将执行插入操作,但在机器人重新启动之前,它似乎不会以以后调用
get_link()
可以读取的方式提交脚本

bot的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
我自己调整了
隔离级别
,原来是
timeout=10
。我相当困惑

编辑:
get\u db\u connection()
的用法:

main.py(主循环):


如前所述,在函数中发送conn和db。如果您自己编写代码,您将知道数据库的实际位置。按照惯例,您会执行以下操作:

db      = sqlite3.connect('database.db')
conn    = db.cursor()
然后,对于一般用途:

    db.execute("...")
    conn.commit()
因此,在你的情况下:

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

    return db 


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


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

如前所述,在函数中发送conn和db。如果您自己编写代码,您将知道数据库的实际位置。按照惯例,您会执行以下操作:

db      = sqlite3.connect('database.db')
conn    = db.cursor()
然后,对于一般用途:

    db.execute("...")
    conn.commit()
因此,在你的情况下:

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

    return db 


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


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

基于您已将隔离级别设置为自动更新:

sqlite3.connect(filename, isolation_level=None)
您的代码中根本不需要
commit
语句

编辑:
将您的
execute
语句包装在
try
语句中,这样您至少有机会了解正在发生的事情,即

import sqlite3
def get_db(name=""):
    if not name:
        name = "db1.db"
    return sqlite3.connect(name, isolation_level=None)
connection = get_db()
cur = connection.cursor()
try:
    cur.execute("create table if not exists searches"
               "(search_string UNIQUE PRIMARY KEY,link)")
except sqlite3.Error as e:
    print 'Searches create Error '+str(e)
try:
    cur.execute("insert into searches (search_string, link) VALUES (?, ?)", ("my search", "other"))
except sqlite3.Error as e:
    print 'Searches insert Error '+str(e)
cur.execute("select link from searches where search_string=? limit 1", ["my search"])
s_data = cur.fetchone()
print 'Result:', s_data

基于您已将隔离级别设置为自动更新:

sqlite3.connect(filename, isolation_level=None)
您的代码中根本不需要
commit
语句

编辑:
将您的
execute
语句包装在
try
语句中,这样您至少有机会了解正在发生的事情,即

import sqlite3
def get_db(name=""):
    if not name:
        name = "db1.db"
    return sqlite3.connect(name, isolation_level=None)
connection = get_db()
cur = connection.cursor()
try:
    cur.execute("create table if not exists searches"
               "(search_string UNIQUE PRIMARY KEY,link)")
except sqlite3.Error as e:
    print 'Searches create Error '+str(e)
try:
    cur.execute("insert into searches (search_string, link) VALUES (?, ?)", ("my search", "other"))
except sqlite3.Error as e:
    print 'Searches insert Error '+str(e)
cur.execute("select link from searches where search_string=? limit 1", ["my search"])
s_data = cur.fetchone()
print 'Result:', s_data

如果要使用游标进行提交,请尝试conn.commit()。在连接上提交,然后在游标上执行。您正在光标上执行
.commit()
。有趣。我只是想看看其他模块在做什么,这表明它们也有问题。我确实在追踪中看到了其中一个。在尝试conn.commit()时,我得到一个
名称错误:未定义全局名称“conn”
。您的问题是您有多个连接。显示调用
get\u db\u connection
的位置和方式。使用
get\u db\u connection()
用法更新问题。如果要使用光标进行提交,请尝试conn.commit()。在连接上提交,然后在光标上执行。您正在光标上执行
.commit()
。有趣。我只是想看看其他模块在做什么,这表明它们也有问题。我确实在追踪中看到了其中一个。在尝试conn.commit()时,我得到一个
名称错误:未定义全局名称“conn”
。您的问题是您有多个连接。显示调用
get\u db\u connection
的位置和方式。使用
get\u db\u connection()
用法更新问题。删除所有
commit
调用,问题仍然存在。我不认为commit语句是问题所在,我只是指出它们完全是多余的。查看我的编辑以调试您的问题。删除了所有
commit
调用,问题仍然存在。我不认为commit语句是问题所在,我只是指出它们完全是多余的。请参阅我的编辑以调试您的问题。