我正在使用Flask和SQLAlchemy,但偶然发现了我不了解的行为。当我使用.outerjoin()
和.paginate()
构建查询时,直到今天,当我创建一个具有相互关联的双outerjoin
的查询时,一切都很好,就像下面的简化示例代码({{1 }}是对SQLAlchemy的引用。类db
与First
具有一对多关系,而Second
与Second
是一对一的关系。
出于测试目的,我准备了三个搜索查询。前两个Third
和search_1
一直都能正常工作。但是search_2
仅在与相同的search_3
记录相关的两个Second
记录才起作用。如果与First
相关的Second
多于一个,则查询返回的记录数通常较少(但不如使用.join代替.outerjoin的记录少),在某些情况下,查询返回的记录数甚至更高First
表中的记录数。即使使用不同的排序顺序(总是按First
模型的列),记录的奇怪数量也在改变。
First
如果使用class First(db.Model):
__tablename__ = 'first'
id = db.Column(db.Integer, primary_key=True)
date_create = db.Column(db.DateTime, default=datetime.utcnow)
date_update = db.Column(db.DateTime)
class Second(db.Model):
__tablename__ = 'second'
id = db.Column(db.Integer, primary_key=True)
first_id = db.Column(db.Integer, db.ForeignKey('first.id'))
third_id = db.Column(db.Integer, db.ForeignKey('third.id'))
class Third(db.Model):
__tablename__ = 'third'
id = db.Column(db.Integer, primary_key=True)
date_create = db.Column(db.DateTime, default=datetime.utcnow)
# prepare base query to reuse later
outer_base = First.query \
.outerjoin(Second, Second.first_id == First.id) \
.outerjoin(Third, Third.id == Second.third_id) \
.order_by(First.id.asc())
# works well
search_1 = First.query.order_by(First.id.asc()).paginate(1, 10, False)
# works well
search_2 = outer_base.all()
# odd as hell...
search_3 = outer_base.paginate(1, 10, False)
表创建了任何关系,我只希望能够根据First
中的值过滤Third
条记录。谁能解释一下我在想什么?也许可以通过分页来实现双重外部连接吗?