为什么django设置导入两次,测试数据库在运行单元测试时创建了两次?

时间:2011-07-13 00:45:43

标签: django unit-testing sqlite pycharm

Django:1.3; PyCharm:1.5.3

我正在为使用GEOS保存Point对象的Django应用程序编写单元测试。对于本地测试,我按照GeoDjango文档自定义了Spatialite后端的每一步。

每当我尝试使用Point对象创建和保存模型实例时,我遇到了GEOS_ERROR(GEOS_ERROR:Geometry必须是Point或LineString)。很明显,Point对象确实在模型的get_or_create函数中传递。并且可以在shell中保存相同的模型。

在没有过多引入导致此错误的代码的情况下,我发现每次运行单元测试时,Django都会导入设置,创建测试数据库并立即销毁数据库,然后再次创建测试数据库测试最终会引发错误。

Testing started at 5:09 PM ...<br />
Importing Django settings module settings
SpatiaLite version ..: 2.4.0    Supported Extensions:
    - 'VirtualShape'    [direct Shapefile access]
    - 'VirtualText'[direct CSV/TXT access]
    - 'VirtualNetwork   [Dijkstra shortest path]
    - 'RTree'       [Spatial Index - R*Tree]
    - 'MbrCache'        [Spatial Index - MBR cache]
    - 'VirtualFDO'      [FDO-OGR interoperability]
    - 'SpatiaLite'      [Spatial SQL - OGC]
PROJ.4 Rel. 4.7.1, 23 September 2009
GEOS version 3.3.0-CAPI-1.7.0Creating test database 'default'...
Destroying old test database 'default'...
SpatiaLite version ..: 2.4.0    Supported Extensions:
(same Spatialite settings again)
cannot start a transaction within a transaction
cannot rollback transaction - SQL statements in progress
Syncing...
Creating tables ...

我怀疑这是由PyCharm造成的。但是当我从终端shell运行'python manage.py test'时,重复了同样的过程并抛出了相同的错误。

我检查了我的设置文件,但无法找出为什么它会提示自己导入两次以及为什么测试数据库创建了两次。用于创建Spatialite数据库的必需init_spatialite-2。* .sql也在项目路径上。

任何建议都将受到高度赞赏!

更新: JetBrains通知我,runserver期间两次导入settings.py可以通过此补丁或runserver --noreload修复。 http://code.djangoproject.com/changeset/15911

但是,测试任务仍然存在导入错误。

1 个答案:

答案 0 :(得分:0)

这很可能是因为您在导入路径中同时包含settings.py和包含。由于可以在不同模块(settings和myproject.settings)下导入设置,因此可以执行两次。

请确保始终使用DJANGO_SETTINGS_MODULE =设置而不是DJANGO_SETTINGS_MODULE = myproject.settings或从包含settings.py的目录中删除__init__.py文件

或者,更好的是,升级到django 1.4