我在 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。
最佳答案
我遇到了同样的问题,我的实验给了我以下结果:
我发现 Django 在测试模式下使用内存中的 SQLite DB,直到您明确更改它。这就解释了为什么我只在我的单元测试中看到这个问题。强制 Django 在
settings.py
中显式设置DATABASES->TEST->NAME
文件中使用 SQLite DB。例如像这样:DATABASES = { 'default': { ... 'TEST': { 'NAME': 'testdb.sqlite3', }, }, }
设置大于 2147483.647 的超时值(看起来很熟悉,对吧?:-))禁用超时(或将其设置为可忽略的小值)。
据我了解,问题的根源在于,当 SQLite 使用共享缓存时,根本没有考虑超时值。
关于python - Django sqlite3 超时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46831783/