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\nRun Code Online (Sandbox Code Playgroud)\n为了使 API 容器能够访问数据库,ini 文件中的 sqlalchemy.url 设置为:
\npostgresql://{username}:{password}@db:5432/{database}
但是,当我想要进行迁移时,例如添加表列,我会将app/database/models.py更改目录中的模型更改为app/database并运行alembic revision --autogenerate -m "Description"。这就是问题发生的地方,我收到错误:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "db" to address: Name or service not known\nRun Code Online (Sandbox Code Playgroud)\n如果我将主机名更改为 localhost,它可以工作,但 docker-compose 会中断,因为它必须引用容器名称。
\n这个工作流程似乎不正确。人们如何在使用容器的项目中使用数据库?
\n该docker-compose.yml文件如下所示:
.\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\nRun Code Online (Sandbox Code Playgroud)\n
由于您的数据库已发布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)
| 归档时间: |
|
| 查看次数: |
15734 次 |
| 最近记录: |