创建一个用于Django的PostgreSQL数据库

时间:2015-06-24 20:40:40

标签: python django database postgresql ubuntu

我目前正在研究如何使用Django制作基本博客的this教程,但我想使用PostgreSQL数据库而不是sqlite数据库。 Django不会为非sqlite自动创建数据库,而我在创建我的数据库时遇到了麻烦。我以为我已经正确完成了,但每当我尝试同步我的数据库时,我会看到一堆文件路径,然后是错误

"django.db.utils.OperationalError: FATAL:  role [username] does not exist"

我试过谷歌搜索问题并尝试了一些我找到的解决方案,但是它们似乎都没有起作用。

提前感谢您提供的任何指导。

2 个答案:

答案 0 :(得分:2)

从过去的初学者角度来看,我会更深入 - 首先,关于如何阅读Django错误的说明:

django.db.utils.OperationalError

表示django的数据库实用程序中存在错误(将django连接到不同类型的数据库(如MySQL,Postgres和SQLite)的位),因此db.utils部分。 OperationalErrors是当您尝试运行某些东西时从数据库本身返回的东西,这意味着您可以隔离Django并专注于数据库交互本身。如果Django不存在并且您通过psql(postgres'命令行实用程序)运行相同的命令,您仍然会看到:

FATAL: role [username] does not exist

此外,由于全部大写,您通常可以从数据库中判断它是错误的。关系数据库LOVE CAPS LOCK。

就解决问题而言,错误非常具有自我描述性。您需要查看的是您的settings.py文件(如kmmnbvnr指出的那样)。在数据库配置中,您应该看到用户名和密码。 Postgres抱怨您尝试使用不存在的用户连接到已配置的数据库,因此您需要创建它。以下是使用PSQL而不是使用的sumb命令kmmbvnr的命令:

使用命令行实用程序连接到数据库:

$ psql -d postgres

如果您创建的数据库不是默认的postgres,请使用该数据库代替数据库名称

即。 $ psql -d my_database_name

编辑:在某些操作系统上,如果填写了您的操作系统用户名,则可能需要添加-U <database user>而不是默认的&#34; postgres&#34;用户名。

即。 $ psql -d postgres -U postgres(postgres是默认用户)。

CREATE ROLE testrole WITH LOGIN ENCRYPTED PASSWORD 'password';

ALTER ROLE testrole WITH CREATEDB;

grant all privileges on database postgres to testrole;

将testrole和密码更改为您想要的任何内容,只要它们与settings.py中的用户名/密码相匹配即可。请注意&#39; &#39;密码周围,但不是用户名。那些很重要。另请注意,出于安全原因,Postgres对使用内置'postgres'用户进行非管理任务不满意,因此最好创建另一个用户与Django一起使用。此外,关于授予权限的最后几行是有点宽容的,但对于本地测试配置,它将是您最容易的选择。有关生产环境/适当安全性的权限,请参阅Postgres文档。

最后,您可以通过查阅PSQL(linux / mac上的man psql)上的手册页来了解如何使用命令行登录特定用户,从而独立于django进行测试。我相信命令是:

$ psql -d postgres -U testrole -W

-d指定数据库(即mydatabase或postgres)时,-U是要连接的用户,-W表示提示输入密码。

答案 1 :(得分:0)

假设你在linux主机上

sudo su postgres
createuser myuser -P
createdb -O myuser mydb

并确保您拥有settings.py

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'mydb',
    'USER': 'myuser',
    'PASSWORD': '_replace_with_user_password_',
    'HOST': '',
    'PORT': '',
}

}