我跟着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,我应该说),一切都很好,花花公子......
我不能为我的生活找出问题所在或哪里出错。
答案 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标识。)