Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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/postgres设置,用于创建数据库,用于运行测试_Python_Django_Unit Testing - Fatal编程技术网

Python Django/postgres设置,用于创建数据库,用于运行测试

Python Django/postgres设置,用于创建数据库,用于运行测试,python,django,unit-testing,Python,Django,Unit Testing,我的单元测试是从django.test.TestCase扩展而来的。使用SQLite3后端,它们运行良好 我想用PostgreSQL后端运行它们,测试要做的第一件事就是尝试创建一个测试数据库。这将失败,因为django没有执行此操作的权限。我想配置PostgreSQL/django以便允许此操作,但我找不到任何关于如何执行此操作的文档 这些是用于连接到数据库的设置(settings.py): 在运行django应用程序时,我始终有一个预先创建的数据库和用户,以便django可以连接 我有两个问题

我的单元测试是从
django.test.TestCase
扩展而来的。使用SQLite3后端,它们运行良好

我想用PostgreSQL后端运行它们,测试要做的第一件事就是尝试创建一个测试数据库。这将失败,因为django没有执行此操作的权限。我想配置PostgreSQL/django以便允许此操作,但我找不到任何关于如何执行此操作的文档

这些是用于连接到数据库的设置(
settings.py
):

在运行django应用程序时,我始终有一个预先创建的数据库和用户,以便django可以连接

我有两个问题:

  • 在单元测试期间,用于创建数据库的连接设置是什么?我的理解是,django用于连接应用程序数据库的用户不需要(也不应该)拥有数据库创建权限
  • 这一切在哪里描述?我找到的最接近的设置是(
    TEST
    key in
    DATABASES
    config参数),但这些设置大多涉及Oracle数据库,并且有不同的用途
Django将用于测试,但将使用不同的数据库(默认情况下,
test\u mydb
,其中常规数据库是
mydb

您可以更改django用户权限以在psql shell中创建数据库。有关更多信息,请参阅

=> ALTER USER myuser CREATEDB;

我不知道是否可以限制权限,以便django用户只能为生产创建数据库
test\u mydb

,我在执行接受的答案解决方案时遇到错误。 大概是这样的:

django.db.utils.OperationalError:无法删除当前打开的数据库

对我来说,我需要做:

ALTER USER <your_user> CREATEDB;
CREATE DATABASE postgres;
alteruser-CREATEDB;
创建数据库postgres;
它必须是
postgres
,测试才能正常进行,而不会引发错误
django.db.utils.OperationalError

从2020年起,让django能够根据其他答案创建数据库的一个更好的选择就是在运行测试时使用
--keepdb
标志:

$。/manage.py测试——keepdb
这将在两次运行之间保持相同的db,速度更快,并且不需要授予django用户
CREATEDB
权限


正如@Alasdair之前所指出的,Django只会尝试在
test\uu
上连接或创建db。您还可以使用
数据库设置中的
test
自定义测试数据库的名称。

Django将使用用于测试,但将使用不同的数据库(默认情况下
test\u mydb
)。在对的回答中,我给出了如何向用户添加createdb权限的说明。我不知道是否可以限制权限,让django用户只能创建数据库
test\u mydb
@Alasdair:这让我有点惊讶,但它确实有效。如果你愿意答复,我将接受你的答复。可能的副本
ALTER USER <your_user> CREATEDB;
CREATE DATABASE postgres;