在SQLAlchemy中按链接对象键筛选查询

2024-09-28 05:28:10 发布

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

从标题判断this将是完全相同的问题,但我看不出任何答案如何适用于我的用例:

我有两个班级和他们之间的关系:

treatment_association = Table('tr_association', Base.metadata,
    Column('chronic_treatments_id', Integer, ForeignKey('chronic_treatments.code')),
    Column('animals_id', Integer, ForeignKey('animals.id'))
)

class ChronicTreatment(Base):
    __tablename__ = "chronic_treatments"
    code = Column(String, primary_key=True)

class Animal(Base):
    __tablename__ = "animals"
    treatment = relationship("ChronicTreatment", secondary=treatment_association, backref="animals")

我只想选择那些接受过代号为“X”的治疗的动物。我尝试了很多方法。在

此操作失败,并出现AttributeError

^{pr2}$

这个很高兴地返回未过滤的动物列表:

sql_query = session.query(Animal.treatment).filter(ChronicTreatment.code == "chrFlu")
for item in sql_query:
    pass

mystring = str(session.query(Animal))

最接近上述主题的例子:

subq = session.query(Animal.id).subquery()
sql_query = session.query(ChronicTreatment).join((subq, subq.c.treatment_id=="chrFlu"))
for item in sql_query:
    pass

mystring = str(session.query(Animal))
mydf = pd.read_sql_query(mystring,engine)

也会因AttributeError而失败。在

你能帮我把这个单子分类吗?在


Tags: idsqlbasesessioncodecolumnqueryanimals
1条回答
网友
1楼 · 发布于 2024-09-28 05:28:10

首先,表定义有两个问题:

1)在treatment_association中,Integer列指向chronic_treatments.code,而{}是{}列。在

我认为在chronic_treatments中有一个整数id,这样就不会在另一个表中重复字符串代码,也有机会在以后的慢性病治疗中添加更多字段。 更新:不完全正确,您仍然可以添加更多字段,但如果您决定重命名“代码”,则更改它将更加复杂。在

2)在Animal模型中,有一个名为treatment的关系。这是令人困惑的,因为你有多对多的关系,它应该是复数-treatments。在

在解决了以上两个问题之后,应该更清楚为什么查询不起作用了。 这个(我用treatment替换了treatments

sql_query = session.query(Animal.treatments).filter(
    Animal.treatments.code == "chrFlu")

Animal.treatments表示多对多关系,它不是SQL炼金术模式,因此不能将其传递给query,也不能在^{中使用。在

下一个不能工作的原因是相同的(您将Animal.treatments传递到query。在

最后一个比较接近,您实际上需要join来获得结果。在

我认为将查询理解为SQL比较容易(而且您还需要了解SQL才能使用sqlalchemy):

^{pr2}$

它将选择animals,并通过tr_association连接chronic_treatments,并按代码过滤结果。在

有了它,就很容易使用无SQL语法重写它:

sql_query = session.query(Animal).join(Animal.treatments).filter(
    ChronicTreatment.code == "chrFlu")

这将返回你想要的-一个动物名单谁有相关的慢性治疗与给定的代码。在

相关问题 更多 >

    热门问题