sqlite3.ProgrammingError:在线程中创建的 SQLite 对象只能在同一线程中使用。在 Django 2.2 中

Sar*_*sad 6 sqlite django python-3.x

我在测试服务器中遇到这个问题。但尚未投入生产。我尝试了一些解决方案,例如 python manage.py runserver --noreload 并编辑 /lib/python3.6/site-packages/django/utils/autoreload.py 这个文件。

文档中提到。

https://github.com/django/django/commit/5bf2c87ece216b00a55a6ec0d6c824c9edabf188

错误消息看起来像这样,

sqlite3.ProgrammingError:在线程中创建的 SQLite 对象只能在同一线程中使用。该对象是在线程 id 140000522213120 中创建的,这是线程 id 140000744696768。

请建议我一个解决方案来纠正这个问题,以前有人遇到过这个问题。帮我解决这个问题。

小智 7

这里的问题是SQLite必须处理由于多线程并发访问而产生的冲突,即一个线程创建和访问的SQLite数据库不能允许另一个线程访问它。这可能是由以下情况导致的:

  1. 创建全局连接对象,然后由不同的线程访问这些对象
  2. 不同连接之间的连接对象未正确关闭

始终建议使用 ORM 来处理数据库并有效管理其连接生命周期。对于 Sqlite 来说,使用最广泛的 ORM 是SqlAlchemy。使用 ORM 或许可以解决这个问题。

然而,对于非常简单的应用程序,使用 ORM 只是一种过度杀伤力,您可以通过允许并发访问来调整创建到 Sqlite 数据库的连接的方式。这可以通过在建立连接时设置check_same_thread参数来完成:False

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")
Run Code Online (Sandbox Code Playgroud)

话虽如此,以这种方式设置 Sqlite 连接需要负责处理应用程序而不是数据库上的并发性,并且用户应确保对数据库的写入操作是序列化的,以避免任何脏写入/更新。

注意:使用 sqlalchemy 时,使用正确的库和代码隔离很重要。我特别发现这篇文章也很有帮助。