FastAPI Alembic - 即使输出如此说明,也不会创建迁移文件。文件夹“版本”为空,数据库中缺少表

问题描述 投票:0回答:1

我想将 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 地址(我认为这也不是我)。

python postgresql sqlalchemy fastapi alembic
1个回答
0
投票

问题出在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

当您这样做时,默认情况下,alembic 将定位到
docker-compose run my_api alembic revision --autogenerate -m "New Migration"
目录,但您有一个名为不同的卷。
 这里的解决方案是重命名 
app
->
my_api
,保持音量不变,并将 autogenerate 更改为
 
app
    

© www.soinside.com 2019 - 2024. All rights reserved.