You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask Migrate执行upgrade失败后无法执行downgrade的问题求助

Flask Migrate执行upgrade失败后无法执行downgrade的问题求助

大家好!我最近跟着Miguel Grinberg的Flask Mega Tutorial开发Flask应用,修改数据库模型的时候踩了大坑,现在flask db upgrade执行失败,连回滚用的flask db downgrade也跑不了,实在没辙了来求助各位!

问题经过

最开始我的Post模型是这样的:

class Post(db.Model):
    id: so.Mapped[int] = so.mapped_column(primary_key=True)
    body: so.Mapped[str] = so.mapped_column(sa.String(140))
    timestamp: so.Mapped[datetime] = so.mapped_column(
        index=True, default=lambda: datetime.now(timezone.utc))
    user_id: so.Mapped[int] = so.mapped_column(sa.ForeignKey(User.id), index=True)
    school_id: so.Mapped[Optional[int]] = so.mapped_column(sa.ForeignKey(School.id))
    
    author: so.Mapped['User'] = so.relationship(back_populates='posts')
    school: so.Mapped['School'] = so.relationship(back_populates='posts')
    
    def __repr__(self):
        return '<Post {}>'.format(self.body)

我想实现帖子可以@用户或学校的功能,所以打算新增at_user_id字段记录@的用户,同时把原来的school_id改名为at_school_id记录@的学校,修改后的模型代码如下:

class Post(db.Model):
    id: so.Mapped[int] = so.mapped_column(primary_key=True)
    body: so.Mapped[str] = so.mapped_column(sa.String(140))
    timestamp: so.Mapped[datetime] = so.mapped_column(
        index=True, default=lambda: datetime.now(timezone.utc))
    user_id: so.Mapped[int] = so.mapped_column(sa.ForeignKey(User.id), index=True)
    at_user_id: so.Mapped[int] = so.mapped_column(sa.ForeignKey(User.id), index=True)
    at_school_id: so.Mapped[Optional[int]] = so.mapped_column(sa.ForeignKey(School.id))
    
    author: so.Mapped['User'] = so.relationship(back_populates='posts')
    school: so.Mapped['School'] = so.relationship(back_populates='posts')
    
    def __repr__(self):
        return '<Post {}>'.format(self.body)

改完后我先跑了flask db migrate,看起来一切正常,结果执行flask db upgrade的时候直接报错,栈追踪的最后一行是:

ValueError: Constraint must have a name

我意识到修改肯定有问题,赶紧把模型代码改回了原来的版本,但现在连flask db downgrade也执行失败,还是报同样的错误。

目前的迁移状态

我执行flask db history得到的输出是:

5894df3de404 -> c99a4bb66db5 (head), change post school reference column name
d536cbcefe42 -> 5894df3de404, remove unique constraint on coder.name
81bde43194e8 -> d536cbcefe42, add errors table
da1665d06269 -> 81bde43194e8, aligned db with refined workflow
84c4df60bcf5 -> da1665d06269, update to working model, add admin privilages column to user table
d366444514a2 -> 84c4df60bcf5, followers
aa7ad342e8fa -> d366444514a2, new fields in user model

再执行flask db check,输出如下:

INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added index ''ix_coder_name'' on '('name',)'
ERROR [flask_migrate] Error: New upgrade operations detected:
[('add_index', Index('ix_coder_name', Column('name', String(length=64), table=<coder>, nullable=False)))]

现在我完全卡壳了:模型已经改回原样,但迁移状态好像被卡住了,既不能升级也不能回滚,有没有大佬能指点一下该怎么解决这个问题呀?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:24:32