Django sqlite3超时无效

drh*_*gen 7 python sqlite django

我在Django中进行了一个简单的集成测试,它生成一个Celery工作者来运行一个作业,该作业将一条记录写入数据库.Django线程还将记录写入数据库.因为它是一个测试,我使用默认的内存中的sqlite3数据库.没有使用任何交易.

我经常收到这个错误:

django.db.utils.OperationalError: database table is locked
Run Code Online (Sandbox Code Playgroud)

根据Django文档,由于一个连接在等待另一个完成时超时.这是"比sqlite在默认配置中可以处理的更多并发性".这看起来很奇怪,因为它是两个线程中的两个记录.尽管如此,相同的文档都说要增加超时选项以强制连接等待更长时间.好的,我将数据库设置更改为:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'OPTIONS': {'timeout': 10000000},
    }
}
Run Code Online (Sandbox Code Playgroud)

这没有效果.错误仍然出现,它显然没有等待1e7秒或1e7毫秒或1e7微秒才这样做.我还缺少一个额外的设置吗?

我已经尝试过Python 3.5和Python 3.6以及Django 1.11和Django 2.0.

pro*_*her 5

我遇到了同样的问题,我的实验给了我以下几点:

  1. 我发现Django在测试模式下使用内存中的SQLite DB,直到您明确更改它为止。这就解释了为什么我只能在单元测试中看到该问题。强制Django在.NET中DATABASES->TEST->NAME显式设置的文件集中使用SQLite DB settings.py。例如这样:

    DATABASES = {
        'default': {
            ...
            'TEST': {
                'NAME': 'testdb.sqlite3',
            },
        },
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将超时值设置为大于2147483.647(看起来很熟悉,对吗?:-))将禁用超时(或将其设置为可忽略的较小值)。

  3. 据我了解,问题的根源是当SQLite使用共享缓存时,根本不遵守超时值。