【问题标题】:Creating a PostgreSQL database for use with Django创建用于 Django 的 PostgreSQL 数据库
【发布时间】:2015-06-24 20:40:39
【问题描述】:

我目前正在通过this 教程学习如何使用 Django 制作基本博客,但我想使用 PostgreSQL 数据库而不是 sqlite 数据库。 Django 不会为非 sqlite 自动创建数据库,我在创建我的数据库时遇到了麻烦。我以为我做得很好,但是每当我尝试同步我的数据库时,我都会看到一堆文件路径,然后是错误

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

我已尝试在谷歌上搜索该问题并尝试了一些我找到的解决方案,但它们似乎都不起作用。

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

【问题讨论】:

  • 您是否在您的 postgres 数据库中创建了一个用户供 django 使用?

标签: python django database postgresql ubuntu


【解决方案1】:

在过去从初学者的角度遇到过这个问题,我将更深入地讨论——首先,关于如何阅读 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 的命令,而不是 kmmbvnr 使用的 sudo 命令:

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

$ psql -d postgres

如果您创建的数据库不是默认的 postgres,请使用它作为数据库名称,

$ psql -d my_database_name

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

$ 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 中的用户名/密码匹配即可。请注意密码周围的“”,而不是用户名周围的“”。这些很重要。另请注意,出于安全原因,Postgres 不赞成将内置的“postgres”用户用于非管理任务,因此最好创建另一个用户以与 Django 一起使用。此外,关于授予权限的最后几行有点宽松,但对于本地测试配置,这将是您最容易的选择。有关生产环境的权限/适当的安全性,请参阅 Postgres 文档。

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

$ psql -d postgres -U testrole -W

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

【讨论】:

    【解决方案2】:

    假设你在一个 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': '',
    }
    

    }

    【讨论】:

    猜你喜欢
    • 2011-08-09
    • 2018-02-09
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多