Python SQLite3的问题sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in th

本文探讨了在Python中使用SQLite数据库时遇到的多线程并发访问问题,并提供了通过设置`check_same_thread`参数为`False`来解决线程间访问冲突的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言: SQLite是基于文件系统的mini数据库,我们用以存放简便的数据,本文将描述在代码中碰到的并发问题。

  1. 问题的提出

最近在跑python代码过程中,使用sqlite的时候,碰到了如下错误信息:

Mon, 17 Apr 2017 16:00:00 base.py[line:131] ERROR Job “save_data (trigger: cron[day_of_week=‘mon-fri’, hour=‘16’], next run at: 2017-04-18 16:00:00 CST)” raised an exception
Traceback (most recent call last):
File “C:\Program Files\Python\lib\site-packages\apscheduler\executors\base.py”, line 125, in run_job
retval = job.func(*job.args, **job.kwargs)
File “indexdata.py”, line 238, in save_data
sqlite_obj.insert_data(“index50”, datetime.datetime.now().strftime("%Y-%m-%d"), final_data[‘value’])
File “C:\workspace\stock-crawler\stockindex\util\SQLiteUtil.py”, line 27, in insert_data
self.cx.execute(self.insert_sql_str, [name, date, valdata, datetime.datetime.now()])
sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in thread xxxx

代码为多个线程进行数据库的读写操作。这里简要列出关键的数据库操作,主要集中在insert/update操作。
2. 问题分析

从错误信息来分析,问题是sqlite本身应对多个线程并发访问过程中的冲突问题,由一个线程创建并访问的sqlite的数据库,无法允许另外一个线程进行访问。这里的解决办法可能有2个:

通过队列规避多线程的访问
 通过设置或者多个访问管道,规避线程之间的冲突问题
  从技术上评估,2个方法都可以解决问题,哪种更具优势?

  1. 问题解决

通过网上搜索发现,其实可以通过设置sqlite文件的读取方式,可以简单规避掉线程之间的冲突问题:

def initDB(self, file_path):
self.file_path = file_path
self.cx = sqlite3.connect(file_path, check_same_thread=False)
self.cx.execute(self.create_table_str)
self.cx.execute(self.create_detail_table_str)
print(“init the table strucutre successfully”)
check_same_thread这个设置为False,即可允许sqlite被多个线程同时访问
4. 总结

对于sqlite而言,所有的读取或者打开操作,都是有check_same_thread的设置,与语言无关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值