кросс-соединение в sqlalchemy 1.3 - PullRequest
0 голосов

Я не могу понять, как соединить две таблицы с перекрестным соединением. Раньше, на sqlalchemy версии 1.1.4 я делаю это так:

A = Table1.sa 
B = Table2.sa
my_query = A.query().join(B, literal(True))

Но после обновления до версии 1.3 возникает исключение:

sqlalchemy.exc.InvalidRequestError: Невозможно определить, к какому предложению FROM присоединиться, существует несколько FROMS, которые могут присоединиться к этому объекту. Попробуйте добавить явное предложение ON, чтобы помочь устранить неоднозначность.

Я понимаю, что это значит, что я должен сделать что-то подобное:

my_query = A.query().join(B, A.fireign_key_id = B.id)

Но у таблицы A нет внешнего ключа для таблицы B.

Как связать две таблицы с перекрестным соединением и без внешнего ключа? Спасибо.

Ответы [ 3 ]

0 голосов

Спасибо за все ответы. Возникло исключение, поскольку запрос не может определить, какая таблица оставлена, и в запрос (...) использовать поля таблицы B. После того, как я явно указал левую таблицу, это исключение исчезло.

my_query = A.query(...).join(B, A.id != None)
0 голосов
/ 13 мая 2019

Самый простой способ выполнить перекрестное объединение - это выбрать одну из двух таблиц без какого-либо фильтра для выполнения объединения ANSI:

my_query = session.query(A, B)

В результате получится декартово произведение (перекрестное соединение) ваших сущностей A и B. Обходных путей не требуется.

0 голосов
/ 10 марта 2019

В перекрестном соединении не используются условия соединения, поэтому между Table1 и Table2 не может быть ВКЛ. При перекрестном соединении каждая строка из T1 объединяется со всеми строками из T2. Вы уверены, что используете Cross join?

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