当数据库在容器中运行时,如何使用 alembic 自动生成并应用迁移?

Hun*_*er2 8 python sqlalchemy alembic docker

我发现在容器化环境中处理数据库迁移的工作流程令人困惑。我有一个带有附加数据库的 Web API。API 在一个容器中运行,数据库在另一个容器中运行。项目文件结构如下

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docker-compose.yml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Dockerfile\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 app\n|    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n|    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 database\n|    |    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 alembic/\n|    |    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n|    |    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db.py\n|    |    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 models.py\n|    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 other\n|    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 source\n|    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 files\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 other\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 files\n
Run Code Online (Sandbox Code Playgroud)\n

为了使 API 容器能够访问数据库,ini 文件中的 sqlalchemy.url 设置为:

\n

postgresql://{username}:{password}@db:5432/{database}

\n

但是,当我想要进行迁移时,例如添加表列,我会将app/database/models.py更改目录中的模型更改为app/database并运行alembic revision --autogenerate -m "Description"。这就是问题发生的地方,我收到错误:

\n
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "db" to address: Name or service not known\n
Run Code Online (Sandbox Code Playgroud)\n

如果我将主机名更改为 localhost,它可以工作,但 docker-compose 会中断,因为它必须引用容器名称。

\n

这个工作流程似乎不正确。人们如何在使用容器的项目中使用数据库?

\n

docker-compose.yml文件如下所示:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docker-compose.yml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Dockerfile\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 app\n|    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n|    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 database\n|    |    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 alembic/\n|    |    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n|    |    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db.py\n|    |    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 models.py\n|    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 other\n|    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 source\n|    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 files\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 other\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 files\n
Run Code Online (Sandbox Code Playgroud)\n

Dav*_*aze 1

由于您的数据库已发布ports:,您可以直接从主机访问它。在主机上的容器外部运行的应用程序和在 Compose 设置中运行的同一应用程序是不同的环境,最好使用环境变量来指定这一点。不要在应用程序中对数据库位置进行硬编码。

如果您可以使用标准的 PostgreSQL 环境变量,那么指定它就相当容易了。

# To run migrations:
cd app/database
PGUSER=username PGPASSWORD=password PGDATABASE=database \
  alembic revision --autogenerate -m "Description"
# (assumes default PGHOST=localhost)
Run Code Online (Sandbox Code Playgroud)
# To run the application:
version: '3.8'
services:
  db: { ... }
  app:
    build: .
    environment:
      PGHOST: db
      PGUSER: username
      PGPASSWORD: password
      PGDATABASE: database
    ports:
      - "5000:5000"
    depends_on:
      - db
Run Code Online (Sandbox Code Playgroud)