python - Django sqlite3 超时无效

标签 python django sqlite

我在 Django 中有一个简单的集成测试,它生成一个 Celery worker 来运行一个作业,该作业将一条记录写入数据库。 Django 线程也向数据库写入一条记录。因为是测试,所以我使用默认的内存sqlite3数据库。没有正在使用的交易。

我经常遇到这个错误:

django.db.utils.OperationalError: database table is locked

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

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

这没有效果。错误仍然出现,并且显然没有等待 1e7 秒或 1e7 毫秒或 1e7 微秒才这样做。我还缺少其他设置吗?

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

最佳答案

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

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

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

  3. 据我了解,问题的根源在于,当 SQLite 使用共享缓存时,根本没有考虑超时值。

关于python - Django sqlite3 超时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46831783/

相关文章:

php - 密码散列 : Keccak or not

python - latin-1 到 ascii

python - 具有 Crispy-forms VariableDoesNotExist 的 Django

django - Django 中序列化器 to_internal_value 方法的用途是什么

ruby-on-rails - 从字符串到文本的change_column上的Rails ActiveRecord SQlite3数据类型不匹配错误

python - Pandas 数据框中的增量分配以确定没有日期元素的周数中的月份

python - Pandas 、Python : Pass names of dataframes to function in a loop

python - Django python 3 还是 2?

android - 在 Android 中将表名作为字符串传递给 SQLiteDatabase 删除函数

ruby-on-rails - 错误 "no such file to load"-- sqlite3/sqlite3_native (LoadError)