SQLAlchemy多重继承

问题描述 投票:0回答:1

我在SQLAlchemy中多重继承方面遇到麻烦。我读过有可能,但没有找到任何好的例子。

我想按以下方式对数据建模:

- Layer   

    - VaporLayer

    - SolutionLayer
       - OrganicLayer
       - AqueousLayer

当我在python shell中查询这些模型时,得到不一致的结果。如果我首先查询Layer,则会得到空白对象,该对象仅具有id字段和空白layer_type字段,用于此层次结构中任何模型的所有后续查询。如果我在新的shell中查询SolutionLayer,即使我查询OrganicLayer,也会得到AqueousLayerlayer_type的实例(它们具有正确的solution_layer_typeLayer字段)。我试图使with_polymorphic函数无法成功产生相同的结果。理想情况下,这些查询将始终产生最特定的类(最远的向下层次结构)或至少始终填充layer_type

以下符合我的模型。py:

class Layer(Base):
    __tablename__ = "layers"
    id = Column(Integer, primary_key=True)
    layer_volume = Column(Float)
    layer_type = Column(String)

    __mapper_args__ = {
        "polymorphic_identity": "layers",
        "polymorphic_on": layer_type,
    }


class VaporLayer(Layer):
    __tablenema__ = "vapor_layers"
    id = Column(ForeignKey("layers.id"), primary_key=True)
    voltage = Column(Float)
    pressure = Column(Float)
    __mapper_args__ = {"polymorphic_identity":'vapor_layers'}


class SolutionLayer(Layer):
    __tablename__ = "solution_layers"
    id = Column(ForeignKey("layers.id"), primary_key=True)

    spin_speed = Column(Integer)
    spin_duration = Column(Float)
    spin_temp = Column(Float)
    solution_layer_type = Column(String)
    __mapper_args__ = {
        "polymorphic_identity": "solution_layers",
        "polymorphic_on": solution_layer_type,
    }


class OrganicLayer(SolutionLayer):
    __tablename__ = "organic_layers"
    id = Column(ForeignKey("solution_layers.id"), primary_key=True)

    organic_solute = Column(String)
    organic_solvent = Column(String)
    concentration = Column(Float)

    additive = Column(String)
    additive_concentration = Column(Float)

    __mapper_args__ = {
        "polymorphic_identity": "organic_layers",
    }


class AqueousLayer(SolutionLayer):
    __tablename__ = "aqueous_layers"
    id = Column(ForeignKey("solution_layers.id"), primary_key=True)
    solute = Column(String)
    solute_concentration = Column(String)
    solute_batch = Column(String)

    additive = Column(String)
    additive_concentration = Column(Float)

    __mapper_args__ = {
        "polymorphic_identity": "aqueous_layers",
    }
python oop inheritance sqlalchemy polygon
1个回答
0
投票

在SolutionLayer类中将"polymorphic_on"添加到__mapper_args__似乎会覆盖Layer.layer_type,并阻止ORM确定对象实际上是什么类。现在可以进行删除。

© www.soinside.com 2019 - 2024. All rights reserved.