Я работаю с Flask и SQLAlchemy, и я натыкаюсь на поведение, я не понимаю.Когда я создаю запрос с .outerjoin()
и .paginate()
, все это работает хорошо до сегодняшнего дня, когда я создал запрос с двойным outerjoin
, связанным друг с другом, как в приведенном ниже упрощенном коде (db
является ссылкой на SQLAlchemy).Класс First
имеет отношение один-ко-многим с Second
, а Second
- одно-к-одному с Third
.
Для целей тестирования я подготовил три поисковых запроса.Первые два search_1
и search_2
работают хорошо все время.Но search_3
работает только до тех пор, пока не появятся две записи Second
, относящиеся к одной и той же записи First
.Когда существует более одного Second
, связанного с First
, запрос возвращает в основном меньшее количество записей (но не такое низкое, как при использовании .join вместо .outerjoin), а в некоторых случаях даже выше, чем количество записей в 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
если есть какое-либо отношение, созданное с использованием таблицы Second
.Может кто-нибудь объяснить, что мне не хватает?Может быть, двойное внешнее соединение может быть достигнуто по-разному для работы с нумерацией страниц?