如何为Django测试自动创建PostGIS数据库?
我正在尝试测试我的Django应用,这些应用运行在PostGIS数据库上,参考了Django测试文档里的信息。
通常,我是通过复制一个模板来创建一个新的数据库:
(以postgres用户身份)
createdb -T template_postgis -O lizard test_geodjango2
当我运行 ./manage.py test
时,出现了以下信息:
正在创建测试数据库...
创建测试数据库时出错:没有权限创建数据库
如果你想尝试删除测试数据库'test_geodjango2',请键入'yes',或者键入'no'来取消:
有什么好的方法可以让系统创建这个数据库吗?
3 个回答
从Django 1.11开始,Django支持一个只适用于Postgres的设置,叫做 settings.DATABASE[whatever]['TEST']['TEMPLATE']
。这个设置决定了测试数据库是从哪个模板创建的:
https://docs.djangoproject.com/en/dev/ref/settings/#template
正如S.Lott提到的,使用标准的test命令。
如果你在用geodjango和postgis,你需要在设置中添加以下内容,以确保空间模板能够正确创建。
settings.py
POSTGIS_SQL_PATH = 'C:\\Program Files\\PostgreSQL\\8.3\\share\\contrib'
TEST_RUNNER='django.contrib.gis.tests.run_tests'
控制台
manage.py test
具体内容可以在这里找到: http://geodjango.org/docs/testing.html?highlight=testing#testing-geodjango-apps
我还没仔细研究过,但当我这样做时,系统会提示我输入数据库密码,因为它试图安装所需的sql。
可能是因为你的 DATABASE_USER
没有权限创建新的数据库或模式。
编辑
如果你查看Django的 test
命令的源代码,你会发现它总是会创建一个测试数据库。此外,它还会修改你的设置,让你使用这个测试数据库。
可以参考这个链接: http://docs.djangoproject.com/en/dev/topics/testing/#id1
你应该使用 fixtures。下面是具体的操作步骤。
从你的模板数据库中创建一个“fixture”。使用
manage.py dumpdata
命令生成一个包含所有模板数据的JSON文件。[提示,使用--indent=2
选项可以生成易于阅读和编辑的JSON格式。]把这个文件放在你应用的
fixtures
目录下。在你的TestCase类定义中引用这个fixtures文件。这样在运行测试之前就会加载这个fixture。
class AnimalTestCase(TestCase): fixtures = ['mammals.json', 'birds'] def testFluffyAnimals(self): etc.
这些fixtures会替代你的模板数据库。一旦有了fixtures,你就不再需要模板数据库了。