首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sqlmodel的alembic迁移尝试更改主键列

使用sqlmodel的alembic迁移尝试更改主键列
EN

Stack Overflow用户
提问于 2021-11-06 16:54:33
回答 1查看 192关注 0票数 1

给定此模型:

代码语言:javascript
复制
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 revision --autogenerate -m "init"创建了一个初始的alembic版本,然后使用alembic upgrade head应用它。

现在,我取消对label字段的注释,并运行alembic revision --autogenerate -m "label"。我的迁移如下所示:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2021-11-06 19:07:17

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

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69866050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档