Python 如何防止在使用更新时锁定SQL数据库?
我有一个程序,它使用几个sql数据库来存储数据。我有一个管理各种sql函数的类,例如获取一个值、一个完整的表或只是更新一个值。在我运行使用UPDATE的函数之前,所有进程都可以正常工作。我执行一个UPDATE命令并尝试提交更改,数据库始终被锁定。自定义sql类中的每个函数都有Python 如何防止在使用更新时锁定SQL数据库?,python,sql,sqlite,sql-update,Python,Sql,Sqlite,Sql Update,我有一个程序,它使用几个sql数据库来存储数据。我有一个管理各种sql函数的类,例如获取一个值、一个完整的表或只是更新一个值。在我运行使用UPDATE的函数之前,所有进程都可以正常工作。我执行一个UPDATE命令并尝试提交更改,数据库始终被锁定。自定义sql类中的每个函数都有 cursor.close database.close 因此,数据库连接仍处于打开状态时不应该有任何问题。我是否在该语法中遗漏了一些未正确连接到数据库的内容?我使用额外的print语句试图找出问题发生的地方,因此可以忽略
cursor.close
database.close
因此,数据库连接仍处于打开状态时不应该有任何问题。我是否在该语法中遗漏了一些未正确连接到数据库的内容?我使用额外的print语句试图找出问题发生的地方,因此可以忽略这些语句
import sqlite3 as db
import os
databaseName = "site"
class MassDb:
def __init__(self,databaseName):
super(MassDb, self).__init__()
print("Current Directory: ",os.getcwd())
self.databaseName = databaseName
def updateValue(self, location, metric, input_value):
print("OPEN CONNECTION UPDATE - running updateValue: ",location, metric, input_value)
if self.databaseName == "site":
try:
siteConn = db.connect("site_data.db")
siteCursor = siteConn.cursor()
siteCursor.execute("UPDATE sites SET " + metric + " = ? WHERE LOCATI ON = ?", (input_value, location))
siteConn.commit()
except:
print("UPDATE FAILED")
finally:
siteCursor.close
siteConn.close
elif self.databaseName == "comp":
try:
compConn = db.connect("comp_data.db")
compCursor = compConn.cursor()
compCursor.execute("UPDATE competitors SET " + metric + " = ? WHERE NAME = ?", (input_value, location))
compConn.commit()
except:
print("UPDATE FAILED")
finally:
compCursor.close
compConn.close
print("CLOSED CONNECTION UPDATE - Update Connection Closed")
else:
print("Update Error")
MassDb("site").updateValue("Location", "CURRENT_SCORE", "100")
正如@roganjosh所评论的,我的问题是我没有正确地关闭数据库。如果
commit()
如果已使用,则无需关闭数据库。但是,
cursor.close()
及
需要这样写。不加括号就好像引用的是一个属性,而不是一个方法。为了执行close方法,必须存在()。现在看起来很明显,但我当时不知道。希望这可以帮助其他人,如果他们也遇到了这一点
此外,使用上下文管理器可以工作,并且无需使用close()
siteCursor.close
不关闭数据库,只需将函数绑定到名称即可。您需要()
来实际调用函数siteCursor.close()
。如果您在代码的其他地方调用sqlite方法,我不确定您为什么会认为这是一个属性?我对python相当陌生,甚至对sql也比较新,所以我还没有发现语法中的所有错误。谢谢你的回复。我做了更改,但问题仍然存在,因此它无法正确关闭数据库肯定还有其他原因。公平竞争如果您对这两种方法都不熟悉,那么您已经避免了代码中的一些常见陷阱。我再看一眼。(“更新站点集”+metric+“=?WHERE LOCATI ON=?”
为什么会有大量的空白?无论如何,我在这里偏离了方向(尽管这是一个合法的问题)因为我不确定您对这种情况的处理是否会阻止数据库在出现故障时被锁定。您可以使用和
上下文管理器来处理打开和关闭连接的操作。SQLite并不是真正为并发而设计的,所以在写入过程中总是有机会锁定数据库,但它通常比超时时间快其他连接。您还可以使用上下文管理器查看预写日志(WAL)是一个很好的修复方法。我也遇到了同样的问题,这就排除了对“我是否关闭了连接”的猜测。
conn.close()
with conn:
#do stuff here
commit()