Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django测试挂起--keepdb标志_Python_Django_Django Testing_Django Tests - Fatal编程技术网

Python Django测试挂起--keepdb标志

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] 但当我这样做时,进程挂起,如

出于性能调优的原因,我想对生产数据库的副本运行Django测试。据我所知,这应通过以下方式实现:

(1) 调整Django设置,如

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感谢您的帮助。我相信我能够通过更改
序列化设置来解决问题。看看我贴的答案。