在SQLAlchemy中创建joinedload sql_查询时保留键命名

2024-06-28 14:58:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我通过SQLAlchemy从所有引用的表中提取一个表行和相应的行。在

给定以下对象结构:

class DNAExtractionProtocol(Base):
    __tablename__ = 'dna_extraction_protocols'
    id = Column(Integer, primary_key=True)
    code = Column(String, unique=True)
    name = Column(String)
    sample_mass = Column(Float)
    mass_unit_id = Column(String, ForeignKey('measurement_units.id'))
    mass_unit = relationship("MeasurementUnit", foreign_keys=[mass_unit_id])
    digestion_buffer_id = Column(String, ForeignKey("solutions.id"))
    digestion_buffer = relationship("Solution", foreign_keys=[digestion_buffer_id])
    digestion_buffer_volume = Column(Float)
    digestion_id = Column(Integer, ForeignKey("incubations.id"))
    digestion = relationship("Incubation", foreign_keys=[digestion_id])
    lysis_buffer_id = Column(String, ForeignKey("solutions.id"))
    lysis_buffer = relationship("Solution", foreign_keys=[lysis_buffer_id])
    lysis_buffer_volume = Column(Float)
    lysis_id = Column(Integer, ForeignKey("incubations.id"))
    lysis = relationship("Incubation", foreign_keys=[lysis_id])
    proteinase_id = Column(String, ForeignKey("solutions.id"))
    proteinase = relationship("Solution", foreign_keys=[proteinase_id])
    proteinase_volume = Column(Float)
    inactivation_id = Column(Integer, ForeignKey("incubations.id"))
    inactivation = relationship("Incubation", foreign_keys=[inactivation_id])
    cooling_id = Column(Integer, ForeignKey("incubations.id"))
    cooling = relationship("Incubation", foreign_keys=[cooling_id])
    centrifugation_id = Column(Integer, ForeignKey("incubations.id"))
    centrifugation = relationship("Incubation", foreign_keys=[centrifugation_id])

    volume_unit_id = Column(String, ForeignKey('measurement_units.id'))
    volume_unit = relationship("MeasurementUnit", foreign_keys=[volume_unit_id])

我正在使用:

^{pr2}$

这给了我:

^{3}$

这确实包含了我想要的所有列,但是命名并不能帮助我选择我想要的。在

是否可以在此数据帧中保留原始表中的键名?e、 我想要measurement_units_1_code而不是measurement_units_1_code。在


Tags: idstringbufferunitcolumnintegerkeysforeign
1条回答
网友
1楼 · 发布于 2024-06-28 14:58:05

这不是joinedload应该用来做什么的。在本例中,您希望执行显式join

session.query(DNAExtractionProtocol.id.label("id"),
              ...,
              MeasurementUnit.id.label("mass_unit_id"),
              ...) \
       .join(DNAExtractionProtocol.mass_unit) \
       .join(DNAExtractionProtocol.digestion_buffer) \
       ... \
       .filter(...)

如果不想键入所有这些名称,可以检查DNAExtractionProtocol类来查找所有关系并动态构造查询和标签。例如:

^{pr2}$

编辑:根据您的数据结构,您可能需要在最后一行使用outerjoin而不是{}。

你可能需要根据自己的喜好调整一下。例如,这没有考虑到潜在的命名冲突,例如对于mass_unit_id,它是DNAExtractionProtocol.mass_unit_id还是{}?在

此外,您可能希望执行sql_query.statement,而不是str(sql_query)str(sql_query)用于打印目的,而不是用于执行。如果使用sql_query.statement,我相信您不需要传递params=[code],因为code已经绑定到查询中的适当参数。在

相关问题 更多 >