从标题判断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
:
这个很高兴地返回未过滤的动物列表:
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
而失败。在
你能帮我把这个单子分类吗?在
首先,表定义有两个问题:
1)在}是{}列。在
treatment_association
中,Integer
列指向chronic_treatments.code
,而{我认为在
chronic_treatments
中有一个整数id
,这样就不会在另一个表中重复字符串代码,也有机会在以后的慢性病治疗中添加更多字段。 更新:不完全正确,您仍然可以添加更多字段,但如果您决定重命名“代码”,则更改它将更加复杂。在2)在
Animal
模型中,有一个名为treatment
的关系。这是令人困惑的,因为你有多对多的关系,它应该是复数-treatments
。在在解决了以上两个问题之后,应该更清楚为什么查询不起作用了。 这个(我用
treatment
替换了treatments
:Animal.treatments
表示多对多关系,它不是SQL炼金术模式,因此不能将其传递给query
,也不能在^{下一个不能工作的原因是相同的(您将
Animal.treatments
传递到query
。在最后一个比较接近,您实际上需要
join
来获得结果。在我认为将查询理解为SQL比较容易(而且您还需要了解SQL才能使用sqlalchemy):
^{pr2}$它将选择
animals
,并通过tr_association
连接chronic_treatments
,并按代码过滤结果。在有了它,就很容易使用无SQL语法重写它:
这将返回你想要的-一个动物名单谁有相关的慢性治疗与给定的代码。在
相关问题 更多 >
编程相关推荐