我想将 Postgresql 合并到我的 FastAPI API 中。经过研究,我决定遵循本教程 - https://youtu.be/NH4VZaP3_9s 完整的代码可以在这里找到 - https://github.com/veryacademy/YT_FastAPI_Beginner_Fast-Track
我检查了几次并将我的代码与教程一进行了比较,没有发现任何差异。
但是当我运行命令时
docker-compose run my_api alembic revision --autogenerate -m "New Migration"
我得到了这个输出:
Creating my_api_my_api_run ... done
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'user'
INFO [alembic.autogenerate.compare] Detected added index 'ix_user_id' on '['id']'
INFO [alembic.autogenerate.compare] Detected added table 'captcha_solve_query'
INFO [alembic.autogenerate.compare] Detected added index 'ix_captcha_solve_query_id' on '['id']'
INFO [alembic.autogenerate.compare] Detected added table 'credits_transaction'
INFO [alembic.autogenerate.compare] Detected added index 'ix_credits_transaction_id' on '['id']'
Generating /my_api/alembic/versions/858d5482faf8_new_migration.py ... done
但是我的文件夹
versions
仍然是空的。我尝试在我的 Mac 上搜索此文件 858d5482faf8_new_migration.py
但它没有返回任何内容。
无论如何,我尝试继续并执行下一步:
docker-compose run my_api alembic upgrade head
我收到了这个输出:
Creating my_api_my_api_run ... done
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
这开始有点奇怪,因为在教程中输出有与此类似的附加行:
Running upgrade -> 858d5482faf8 New, Migration
我错过了这一行,但仍然没有错误。
此后,当我手动检查 postgres 或尝试执行请求时,我看到/收到丢失表的错误,就像我不会进行任何迁移一样。
我不确定发生了什么,因为我按照教程进行操作,但没有看到任何错误。 (我只收到关于缺少 CSRF 令牌的错误,但我在教程中也看到了它,所以我猜不是那样的?)
有人可以指出我正确的方向吗?
| | | | |编辑| | | | | | | | | |编辑| | | | | | | | | |编辑| | | | |
我改变了一些东西并且有点(?)设法将其更进一步(?)。上面的命令仍然适用,但是这次启动 docker 后出现以下错误:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused Is the server running on host "postgresql_db" (192.168.80.2) and accepting TCP/IP connections on port 5432?
这是我的 docker-compose.yml:
version: "3.8"
services:
database:
container_name: postgresql_db
image: postgres
restart: always
ports:
- "5432:5432"
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_NAME}
pgadmin:
container_name: pgadmin
image: dpage/pgadmin4
environment:
- PGADMIN_DEFAULT_EMAIL=${PGADMIN_EMAIL}
- PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD}
ports:
- "5050:80"
depends_on:
- database
my_api:
container_name: my_api
build: .
command: bash -c "alembic upgrade head && uvicorn main:app --host 0.0.0.0 --port 8000 --reload"
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- database
restart: always
这是我的.env:
DATABASE_URL=postgresql+psycopg2://postgres:password@postgresql_db:5432/my_api_db
DB_USER=postgres
DB_PASSWORD=password
DB_NAME=my_api_db
[email protected]
PGADMIN_PASSWORD=admin
我在谷歌上搜索了一下,常见的错误是使用 localhost 而不是你的容器名称(我认为这不是我),并在家庭地址上指定你的 postgresql 地址(我认为这也不是我)。
问题出在my_api服务里面
docker-compose
my_api:
container_name: my_api
build: .
command: bash -c "alembic upgrade head && uvicorn main:app --host 0.0.0.0 --port 8000 --reload"
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- database
restart: always
量名为
app
,服务为my_api
。 docker-compose run my_api alembic revision --autogenerate -m "New Migration"
目录,但您有一个名为不同的卷。 这里的解决方案是重命名
app
my_api
,保持音量不变,并将 autogenerate 更改为 app