我得到了这个多对多的设计
class Parent(Base):
__tablename__ = "parent"
id = Column(Integer, primary_key=True)
parent_number = Column(String)
start_date = Column(DateTime, primary_key=True)
end_date = Column(DateTime)
children= relationship("Child", lazy="selectin")
class Child(Base):
__tablename__ = "child"
id = Column(Integer, primary_key=True)
start_date = Column(DateTime, primary_key=True)
end_date = Column(DateTime)
parent_id = Column(Integer, ForeignKey("parent.id"))
这两个模型都有一个start_date
和end_date
来注册每一行的有效日期范围,从而产生一个复合主键.
我想要做的是能够构造满足start_date
和end_date
上的条件的Parent
对象以及子array.
我try 了一个简单的查询,比如
session.query(Parent)
.filter(Parent.parent_number == '1234')
.filter(Parent.start_date > given_date & Parent.end_date < given_date)
这会导致两个查询
SELECT *
FROM Parent
WHERE parent_number = '1234' AND start_date > '2024-02-14' AND end_date < '2024-02-14'
SELECT Parent.id, Parent.start_date, Child.*
FROM Parent
JOIN Child ON Child.parent_id = Parent.id
WHERE (Parent.id, Parent.start_date) IN ((id_of_previous_parent, start_date_of_previous_parent))
第一个查询很好,但对于第二个查询,我希望类似于
SELECT Parent.id, Parent.start_date, Child.*
FROM Parent
JOIN Child ON Child.parent_id = Parent.id
WHERE (Parent.id, Parent.start_date) IN ((id_of_previous_parent, start_date_of_previous_parent)) AND Child.start_date > '2024-02-14' AND Child.end_date < '2024-02-14'
我试过这个天真的问题
session.query(Parent)
.filter(Parent.parent_number == '1234')
.filter(Parent.start_date > given_date & Parent.end_date < given_date)
.filter(Child.start_date > given_date & Child.end_date < given_date)
但它只改变了第一个查询.
我还try 加入如下查询
session.query(Parent)
.join(Child)
.filter(Parent.parent_number == '1234')
.filter(Parent.start_date > given_date & Parent.end_date < given_date)
.filter(Child.start_date > given_date & Child.end_date < given_date)
没有结果.