django.db.utils.OperationalError:FATAL:role" django"不存在

时间:2016-12-01 23:24:10

标签: django postgresql python-3.x digital-ocean ubuntu-16.04

我跟着this tutorial on Digital Ocean在Ubuntu 16.04服务器上安装PostgreSQL 9.5以与Django 1.10一起使用。

一切顺利,但我无法将我的Django应用程序连接到数据库(或者看起来似乎如此)。应用程序和数据库位于同一服务器上。

以下是一些设置,配置和报告:

我得到的错误:

File "/home/mathieu/web/agencies/lib/python3.5/site-packages/psycopg2/__init__.py", line 164, in connect
conn = _connect(dsn, connection_factory=connection_factory, async=async)
django.db.utils.OperationalError: FATAL:  role "django" does not exist

我的Django项目的数据库设置:

DATABASES = {
'sqlite3': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3')
},
'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'agencies',
    'USER': 'django',
    'PASSWORD': '<password>',
    'HOST': 'localhost',
    'PORT': '5432',
}}

hba_file

postgres=# SHOW hba_file;
hba_file
--------------------------------------
/etc/postgresql/9.5/main/pg_hba.conf

其内容(嗯,无论如何相关部分):

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            md5
#host    replication     postgres        ::1/128                 md5

psql中的用户和数据库

postgres=# \du
                               List of roles
Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
django    |                                                            | {}
postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}


postgres=# \l
                              List of databases
Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
agencies  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres         +
                                                            |  postgres=CTc/postgres+
                                                            |  django=CTc/postgres
postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
          |          |          |             |             |  postgres=CTc/postgres
template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
          |          |          |             |             | postgres=CTc/postgres

我在虚拟机上执行完全相同的步骤(运行Linux Mint,我应该说),一切都很好,花花公子......

我不能为我的生活找出问题所在或哪里出错。

4 个答案:

答案 0 :(得分:4)

如果您同时在本地(并且正在运行)安装了Postgres,并且都试图占用相同的端口,同时又有一个Docker容器,则可能会看到此错误。

如果本地实例首先启动并且占用了docker映像也试图使用的端口,则docker不一定会告诉您这一点。

当您尝试运行需要数据库的Django或其他./manage.py命令时,会看到相同的错误,因为该应用程序将看不到您要查找的数据库。

在这种情况下,您可以通过停止服务器,单击Server Settings并更改端口来更改本地安装的postgres上的端口。您必须根据旧端口在所有应用上更新settings.py

根据我的经验,执行此操作后,如果重新启动docker db容器,您将不再看到此错误。

答案 1 :(得分:2)

请参阅链接click here。这是解释。

您的设置

  

&#39;用户&#39;:&#39; django&#39;,

但由于错误表示用户不存在,这意味着您尚未创建用户。

进入psql的交互式会话并输入这些命令。

CREATE DATABASE agencies;
CREATE USER django WITH PASSWORD 'password';
ALTER ROLE django SET client_encoding TO 'utf8'; 
ALTER ROLE django SET default_transaction_isolation TO 'read committed'; 
ALTER ROLE django SET timezone TO 'Asia/Kolkata';

GRANT ALL PRIVILEGES ON DATABASE agencies TO django;
\q

然后在settings.py

  密码&#39;密码&#39;

密码不应该包含在&lt; &GT;

答案 2 :(得分:0)

我认为您忘记为用户添加权利&#39; django&#39;:

GRANT ALL PRIVILEGES ON DATABASE agencies TO django;

答案 3 :(得分:0)

如果您使用的是Docker,并且正在监听5432端口,则您也应该杀死正在监听的其他进程。

为此,请键入以下命令以查看哪些进程正在使用端口5432:

$ lsof -i:5432

这看起来像这样:

COMMAND     PID           USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 15178 andre.carvalho   86u  IPv6 0xb128ac87cd34cc69      0t0  TCP *:postgresql (LISTEN)
postgres  16670 andre.carvalho    7u  IPv6 0xb128ac87dc50c569      0t0  TCP localhost:postgresql (LISTEN)
postgres  16670 andre.carvalho    8u  IPv4 0xb128ac87d2378541      0t0  TCP localhost:postgresql (LISTEN)

在这之后,很简单:只需使用以下命令杀死另一个进程即可:

kill -9 16670

(请注意,该过程由PID标识。)