1

鉴于此模型:

from typing import Optional

from sqlmodel import SQLModel, Field


class SongBase(SQLModel):
    name: str
    artist: str = Field(index=False)
    #label: Optional[str] = Field(None, index=False)
    year: Optional[int] = Field(None, index=False)


class Song(SongBase, table=True):
    id: int = Field(default=None, primary_key=True, index=False)


class SongCreate(SongBase):
    pass

我使用创建初始 alembic 修订alembic revision --autogenerate -m "init",然后使用alembic upgrade head.

现在我取消注释该label字段,然后运行alembic revision --autogenerate -m "label"​​. 我的迁移显示如下:

revision = '083a8e84f047'
down_revision = 'c1b2ad7d0a39'
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column('song', sa.Column('label', sqlmodel.sql.sqltypes.AutoString(), nullable=True))
    op.alter_column('song', 'id',
               existing_type=sa.INTEGER(),
               nullable=True,
               autoincrement=True)
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('song', 'id',
               existing_type=sa.INTEGER(),
               nullable=False,
               autoincrement=True)
    op.drop_column('song', 'label')
    # ### end Alembic commands ###

为什么 alembic 试图更改 id 字段?我们正在尝试评估 sqlmodel/alembic 以查看它对于生产工作负载是否可行,并且必须手动进行迁移以摆脱这些主键操作对我来说似乎有点危险。我做错了什么让alembic想以这种方式编辑我的主键字段吗?

编辑:为了披露,模型来自这篇文章/示例:https ://github.com/testdrivenio/fastapi-sqlmodel-alembic

4

1 回答 1

1

在这里做了一些更多的研究,并查看了 alembic repo 中的一些 github 讨论。我认为发生的情况是,该id列没有明确设置nullable=False哪个 alembic 似乎需要。然后在最初的“迁移”期间,它忽略了这个事实(如果那是一个错误,idk),这使得模型从一开始就不同步。因此,每次迁移都会尝试使其恢复同步。

在任何情况下,修复似乎总是显式声明主键字段的可为空参数:

class SongBase(SQLModel):
    name: str
    artist: str
    label: str = Field(index=False)
    year: Optional[int] = None


class Song(SongBase, table=True):
    id: int = Field(default=None, primary_key=True, nullable=False)


class SongCreate(SongBase):
   pass
于 2021-11-06T19:07:16.723 回答