Понимание странных результатов при разбиении на страницы двойных внешних соединений - PullRequest
1 голос
/ 01 июля 2019

Я работаю с 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.Может кто-нибудь объяснить, что мне не хватает?Может быть, двойное внешнее соединение может быть достигнуто по-разному для работы с нумерацией страниц?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...