You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决SQLite的OperationalError: database is locked错误?

SQLite数据库锁错误(OperationalError: database is locked)解决方法

核心问题分析

你直接调用了db.raw_connection()获取底层数据库连接,该连接不会被SQLAlchemy的连接池自动管理,长期持有连接会导致写入操作无法获取数据库锁——SQLite作为文件型数据库,同一时间仅支持一个写操作,未正确释放的连接会持续占用锁资源,引发冲突。

具体解决步骤

1. 改用SQLAlchemy引擎对象直接操作

放弃使用raw_connection(),直接用创建好的引擎对象进行读写,让SQLAlchemy自动管理连接的创建与释放:

DATABASE = 'sqlite:////someaddress.db'
# 仅保留引擎对象,不调用raw_connection()
db = create_engine(DATABASE, echo=True, connect_args={'timeout': 15})

# 读取数据
POSTCODES = pd.read_sql("SELECT pcd, pcd2, pcds, LAT, LONG FROM postcodes", con=db)

# 写入数据
self.df.to_sql(name='vouchers', con=db, if_exists='replace', index=False)

2. 手动管理底层连接(若必须使用)

如果业务场景需要用到底层连接,用with语句包裹操作,确保代码块结束后自动关闭连接、释放锁:

# 读取操作
with db.raw_connection() as conn:
    POSTCODES = pd.read_sql("SELECT pcd, pcd2, pcds, LAT, LONG FROM postcodes", conn)

# 写入操作
with db.raw_connection() as conn:
    self.df.to_sql(name='vouchers', con=conn, if_exists='replace', index=False)

3. 调整超时时间(可选)

若锁冲突是因为操作等待时间不足,可适当调大connect_args中的timeout值,给操作更多等待锁释放的时间:

db = create_engine(DATABASE, echo=True, connect_args={'timeout': 30})  # 超时设为30秒

4. 排查外部进程占用

确认没有其他程序(如SQLite可视化工具、其他脚本)正在打开目标数据库文件,外部进程持有锁会导致你的脚本无法执行写入操作。

额外注意事项

  • SQLite仅适合低并发读写场景,若你的业务有频繁读写需求,建议替换为PostgreSQL、MySQL等客户端-服务器型数据库。
  • 避免在循环中反复创建连接,尽量复用SQLAlchemy的连接池资源。

内容的提问来源于stack exchange,提问作者elksie5000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:06:01