如何无数据丢失移除SQLAlchemy多态继承及PostgreSQL继承表
问题描述
当前系统中有多个模型通过多态身份继承自Quote模型,但这些模型实际并无太多共性,编码时易出现问题与混淆,尤其是对象存在不应使用的同名属性时。
对应的PostgreSQL数据库结构中,子表(如bids)继承自quotes表,仅定义该模型新增列,这增加了调试难度,且实际上仅需继承父表少量列。因此我们决定将部分模型与Quote解耦,以提升代码灵活性与可读性。
现有方案构想
我想到的唯一方案是为继承模型(如Bid)创建不继承自Quote的新模型(暂称NewBid),包含所有必要属性(含原继承自Quote的属性),随后替换所有Bid的使用场景,并创建迁移将bids表数据复制到new_bids表。
具体步骤:
- 新增模型并创建迁移 -> 部署
- 创建数据迁移复制数据,同时在PR中替换所有
Bid为NewBid以避免新数据进入旧表 -> 部署 - 验证正常后删除
bids表与Bid模型(不级联删除其数据库引用) - 将
NewBid与new_bids表分别重命名为Bid与bids
但这些步骤风险高、易出错,回退困难,大型PR易出纰漏,我暂未想到其他方法。
已尝试操作
目前仅做了简单尝试,比如移除Quote与Bid模型中的polymorphic_identity属性。相关研究未找到有效结果,多数内容围绕多态身份的删除或关系,而非彻底移除多态身份并得到独立表(无数据丢失)。SQLAlchemy与PostgreSQL文档中也未找到相关答案。
技术问询
如何在不丢失数据的情况下,移除SQLAlchemy中的多态身份继承以及PostgreSQL中的继承表?
最小代码示例
class Quote(Base): class Type(ValuesMixin): QUOTE = "quote" BID = "bid" __tablename__ = "quotes" __mapper_args__ = { "polymorphic_on": "type", "polymorphic_identity": Type.QUOTE, } type = Column(String, nullable=False, default=Type.QUOTE) ... class Bid(Quote): __tablename__ = "bids" __mapper_args__ = { "polymorphic_identity": Quote.Type.BID, } ...
内容的提问来源于stack exchange,提问作者Bono
相关产品推荐
相关产品推荐

