我在SQLAlchemy中多重继承方面遇到麻烦。我读过有可能,但没有找到任何好的例子。
我想按以下方式对数据建模:
- Layer
- VaporLayer
- SolutionLayer
- OrganicLayer
- AqueousLayer
当我在python shell中查询这些模型时,得到不一致的结果。如果我首先查询Layer
,则会得到空白对象,该对象仅具有id
字段和空白layer_type
字段,用于此层次结构中任何模型的所有后续查询。如果我在新的shell中查询SolutionLayer
,即使我查询OrganicLayer
,也会得到AqueousLayer
和layer_type
的实例(它们具有正确的solution_layer_type
和Layer
字段)。我试图使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",
}
在SolutionLayer类中将"polymorphic_on"
添加到__mapper_args__
似乎会覆盖Layer.layer_type
,并阻止ORM确定对象实际上是什么类。现在可以进行删除。