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

如何无数据丢失移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:30:58