对两个外部联接进行分页时了解奇怪的结果

时间:2019-07-01 16:54:22

标签: flask-sqlalchemy

我正在使用Flask和SQLAlchemy,但偶然发现了我不了解的行为。当我使用.outerjoin().paginate()构建查询时,直到今天,当我创建一个具有相互关联的双outerjoin的查询时,一切都很好,就像下面的简化示例代码({{1 }}是对SQLAlchemy的引用。类dbFirst具有一对多关系,而SecondSecond是一对一的关系。

出于测试目的,我准备了三个搜索查询。前两个Thirdsearch_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条记录。谁能解释一下我在想什么?也许可以通过分页来实现双重外部连接吗?

0 个答案:

没有答案