Python Django测试挂起--keepdb标志
出于性能调优的原因,我想对生产数据库的副本运行Django测试。据我所知,这应通过以下方式实现: (1) 调整Django设置,如Python Django测试挂起--keepdb标志,python,django,django-testing,django-tests,Python,Django,Django Testing,Django Tests,出于性能调优的原因,我想对生产数据库的副本运行Django测试。据我所知,这应通过以下方式实现: (1) 调整Django设置,如 DATABASES = { 'default': { ... 'TEST': { 'NAME': 'my_database_copy', }, } } 和(2)使用--keepdb标志,如python manage.py测试--keepdb[1] 但当我这样做时,进程挂起,如
DATABASES = {
'default': {
...
'TEST': {
'NAME': 'my_database_copy',
},
}
}
和(2)使用--keepdb
标志,如python manage.py测试--keepdb
[1]
但当我这样做时,进程挂起,如下所示:
bash-4.2$ python manage.py test --keepdb
Using existing test database for alias 'default'...
DATABASES = {
'default': {
...
'TEST': {
'NAME': 'my_database_copy',
'SERIALIZE': False,
},
}
}
(进程不会用ctrl+c
关闭。我正在使用Docker,我通过重新启动Docker来停止它。)
数据库没有未应用的迁移,如果省略了--keepdb
,test命令(python manage.py test
)可以正常工作
我确认数据库副本已正确还原并可访问,因为我可以在运行python manage.py shell
时访问它
[1] 通过添加
序列化
键调整设置字典,如下所示:
bash-4.2$ python manage.py test --keepdb
Using existing test database for alias 'default'...
DATABASES = {
'default': {
...
'TEST': {
'NAME': 'my_database_copy',
'SERIALIZE': False,
},
}
}
当SERIALIZE
为True
(默认值)时,Django尝试将整个数据库的副本作为字符串读取到内存中。见[1]。当数据库引擎不支持事务,但在我的例子中由于内存不足而崩溃时,这被认为有助于测试。此处介绍了通过设置停用此行为[2]
[1]
[2] 如果不使用
--keepdb
,测试数据库是否会被删除?@Ben如果我省略了--keepdb
标志,那么测试过程会识别数据库“my_database_copy”已经存在,并询问该过程是否应该删除它。如果输入“否”,则测试过程存在(自然)。如果输入“是”,测试将成功运行。如果然后运行python manage.py shell
,我可以确认数据库已被删除,django.db.utils.OperationalError:FATAL:database“my_database_copy”不存在
。有趣的是,使用调试模式运行python manage.py test--keepdb--debug mode
@Ben感谢您的帮助。我相信我能够通过更改序列化设置来解决问题。看看我贴的答案。