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
相关产品推荐
相关产品推荐

