Alembic 自动生成空迁移文件

Jek*_*son 2 sqlalchemy alembic starlette fastapi

我正在尝试将alembic库连接到数据库和sqlalchemy库。作为指南,我使用此示例 链接

我的项目文件:

数据库文件

from databases import Database
from sqlalchemy import MetaData, create_engine

DATABASE_URL = "postgresql://....@localhost:5432/db"

engine = create_engine(DATABASE_URL)
metadata = MetaData()

database = Database(DATABASE_URL)
Run Code Online (Sandbox Code Playgroud)

模型.py

from sqlalchemy import Table, Column, Integer, String, DateTime
from sqlalchemy.sql import func

from db import metadata

notes = Table(
    "notes",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("title", String(50)),
    Column("description", String(50)),
    Column("created_date", DateTime, default=func.now(), nullable=False),
)
Run Code Online (Sandbox Code Playgroud)

env.py(alembic设置)

from db import DATABASE_URL, metadata

....
#add new
target_metadata = metadata
...
#change
def run_migrations_online():

    config.set_main_option('sqlalchemy.url', str(DATABASE_URL))
    connectable = engine_from_config(
        config.get_section(config.config_ini_section),
        prefix="sqlalchemy.",
        poolclass=pool.NullPool,
    )
Run Code Online (Sandbox Code Playgroud)

当我跑

alembic revision --autogenerate -m 'Add notest table'
Run Code Online (Sandbox Code Playgroud)

创建此上下文的迁移/版本中的新文件

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    pass
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    pass
    # ### end Alembic commands ###
Run Code Online (Sandbox Code Playgroud)

我想这可能与 target_metadata = metadata 变量的使用有关。似乎都是按照说明进行的,但是迁移没有按预期工作。

Jek*_*son 7

如果有人有类似的问题。您所要做的就是在metadata对象之前将models.py 中的表导入到env.py 文件中。

环境文件

...
from models.notes import notes
from db import DATABASE_URL, metadata
...
Run Code Online (Sandbox Code Playgroud)

  • 如果未导入这些类,则永远不会定义这些类,并且永远不会填充元数据。 (2认同)
  • @GabrielCappelli,但是当我有数十个甚至数百个模型时我该怎么办?全部导入吗?也许有比“from mymodels import *”更好的方法? (2认同)