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