【问题标题】:Postgres and Docker: Database error - role "username" does not existPostgres 和 Docker:数据库错误 - 角色“用户名”不存在
【发布时间】:2021-07-29 11:55:34
【问题描述】:

我正在尝试在 MacOS 上实现配置此 project 的 postgres 数据库,因此我安装了 postgres、docker 并尝试在此 docker 文件上运行 docker-compose up -d

version: "3"

services:
  maadb-ps-db:
    image: postgres:latest
    container_name: maadb-ps-db
    ports:
      - "5433:5432"
    env_file:
      - postgres.env
    volumes:
      - database-data:/usr/local/var/postgres

volumes:
  database-data:

这里我的环境文件只有这一行:

POSTGRES_HOST_AUTH_METHOD=trust

然后,我尝试通过python和以下方法连接到数据库:

def get_resources_sql():
conn = None
try:
    # read connection parameters
    params = config()

    # connect to the PostgreSQL server
    print('Connecting to the PostgreSQL database...')
    conn = psycopg2.connect(**params)

    # create a cursor
    cur = conn.cursor()

    # TODO

    # close the communication with the PostgreSQL
    cur.close()
except (Exception, psycopg2.DatabaseError) as error:
    print("Database ERROR: ", error)
finally:
    if conn is not None:
        conn.close()
        print('Database connection closed.')

参数如下:

[postgresql]
host=localhost
port=5433
database=maadbsql

当我尝试运行代码时,出现以下错误:

args {'host': 'localhost', 'port': '5433', 'database': 'maadbsql'}
Connecting to the PostgreSQL database...
Database ERROR:  FATAL:  role "username" does not exist

如果我尝试通过psql maadbsql 打开maadbsql 数据库并检查权限,这就是我得到的(我只有两个用户,“用户名”和“postgres”):

我错过了什么吗?

编辑:

这是运行docker-compose up后的日志:link

这是关机后的日志:link

【问题讨论】:

  • 我有几个问题。您说您的环境文件仅包含 POSTGRES_HOST_AUTH_METHOD 行,但是 username postgres 用户来自哪里? maadbsql 数据库是如何创建的?似乎缺少一些信息。此外,Python 代码中的连接参数似乎没有指定用户名。
  • @larsks 我手动创建了 maadbsql 数据库,因为我在配置文件中看到它是必需的。关于用户名账号,我想是我安装Postgres的时候创建的,和我的系统账号同名。

标签: python postgresql macos docker containers


【解决方案1】:

我认为您没有正确创建数据库。我将首先删除您的容器和卷:

docker-compose down -v

配置您的环境文件,以便 postgres 图像将为您的应用程序创建数据库和用户:

POSTGRES_HOST_AUTH_METHOD=trust
POSTGRES_USER=maadbsql
POSTGRES_DB=maadbsql

通过此更改,我可以成功运行以下 Python 代码:

>>> import psycopg2
>>> conn = psycopg2.connect('dbname=maadbsql user=maadbsql host=localhost port=5433')
>>> cur = conn.cursor()
>>> cur.execute('create table example(id int, name text)')
>>> conn.commit()
>>> cur.execute('insert into example (id, name) values (%s, %s)', (1, 'alice'))
>>> conn.commit()
>>> cur.execute('select * from example')
>>> cur.fetchall()
[(1, 'alice')]

【讨论】:

  • 即使在环境文件和连接函数中添加这些行,我仍然收到错误“数据库错误:致命:角色“用户名”不存在”。
  • 本例中没有名为username的用户。用户名为maadbsql。如果您运行我在此答案中包含的示例代码,会发生什么?这个问题中的所有内容对我来说都是正确的。这是一个完整的会话:asciinema.org/a/AS0wAdGPG4h8nYVk4fALjUyDH
  • 我收到了上面评论中提到的错误。还有一个问题就是看起来好像没有创建数据库,其实我无法访问maadbsql。这是我在 docker 中看到的日志:imgur.com/a/i1k08L9
  • 在 (a) 按照建议修改环境文件和 (b) 运行 docker-compose down -v 之后,您能否更新您的问题以包括运行 docker-compose up 的输出?
  • 这是在更新您的postgres.env 文件之后,对吧?我确实在 docker 日志中看到了 CREATE DATABASE,所以它正在创建 a 数据库。此时,如果你尝试docker exec -it maadb-ps-db psql -U maadbsql -c '\l',是失败了,还是提供了数据库列表?
猜你喜欢
  • 2017-09-02
  • 2021-10-11
  • 2011-11-04
  • 1970-01-01
  • 2015-04-01
  • 2012-08-08
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多