如何为Django测试自动创建PostGIS数据库?

5 投票
3 回答
2785 浏览
提问于 2025-04-15 12:28

我正在尝试测试我的Django应用,这些应用运行在PostGIS数据库上,参考了Django测试文档里的信息。

通常,我是通过复制一个模板来创建一个新的数据库:

(以postgres用户身份)

createdb -T template_postgis -O lizard test_geodjango2

当我运行 ./manage.py test 时,出现了以下信息:

正在创建测试数据库...

创建测试数据库时出错:没有权限创建数据库

如果你想尝试删除测试数据库'test_geodjango2',请键入'yes',或者键入'no'来取消:

有什么好的方法可以让系统创建这个数据库吗?

3 个回答

0

从Django 1.11开始,Django支持一个只适用于Postgres的设置,叫做 settings.DATABASE[whatever]['TEST']['TEMPLATE']。这个设置决定了测试数据库是从哪个模板创建的:

https://docs.djangoproject.com/en/dev/ref/settings/#template

2

正如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。

4

可能是因为你的 DATABASE_USER 没有权限创建新的数据库或模式。


编辑

如果你查看Django的 test 命令的源代码,你会发现它总是会创建一个测试数据库。此外,它还会修改你的设置,让你使用这个测试数据库。

可以参考这个链接: http://docs.djangoproject.com/en/dev/topics/testing/#id1

你应该使用 fixtures。下面是具体的操作步骤。

  1. 从你的模板数据库中创建一个“fixture”。使用 manage.py dumpdata 命令生成一个包含所有模板数据的JSON文件。[提示,使用 --indent=2 选项可以生成易于阅读和编辑的JSON格式。]

  2. 把这个文件放在你应用的 fixtures 目录下。

  3. 在你的TestCase类定义中引用这个fixtures文件。这样在运行测试之前就会加载这个fixture。

    class AnimalTestCase(TestCase):
        fixtures = ['mammals.json', 'birds']
        def testFluffyAnimals(self):
             etc.
    

这些fixtures会替代你的模板数据库。一旦有了fixtures,你就不再需要模板数据库了。

撰写回答