SQLAlchemy select из двух таблиц с нулевым LEFT JOIN возвращает пустой результат - PullRequest
0 голосов
/ 02 мая 2018

У меня есть две таблицы sql. Таблица 1 (идентификатор, имя) и Таблица 2 с (идентификатор, имя, table1_id)

 sql = text('SELECT t1.*, t2.* FROM table1 t1 '
               'LEFT JOIN table2 t2 ON t1.id=t2.table1_id ')
query = db.session.query(Table1, Table2).from_statement(sql).params()
table1_table2_tuple_list = query.all()

Если результат запроса sql равен

67, 'some name', 1, 'some name in table 2', 67

Тогда все в порядке, и у меня есть [(<Table1>, <Table2>)] для table1_table2_tuple_list

Но Если результат запроса sql: (также весь другой код для этого результата)

67, 'some name', Null, Null, Null

Тогда вместо получения [(<Table1>, None)] Я получаю [(None, None)]

Если я немного изменю свой код:

sql = text('SELECT t1.*, t2.id, t2.name,t1.id FROM table1 t1 '
               'LEFT JOIN table2 t2 ON t1.id=t2.table1_id ')
query = db.session.query(Table1, Table2, Table1.id).from_statement(sql).params()
table1_table2_tuple_list = query.all()

Тогда я получаю:

[<Table1>, <Table2>, 1]

Но в этом случае я даже не уверен, правильно ли это, потому что я сопоставляю два столбца из sql с моделью Table2, которая имеет три столбца. Совершенно не уверен, почему это работает, но все кажется на месте. Тем не менее, это не то, что я хочу, потому что я не хочу возвращаться к этому запросу и указывать снова и снова новые столбцы, если таковые имеются для Table2

Мне нужен способ выбрать одну из двух таблиц с чистым sql и сопоставить результат с моими моделями. Также я хочу получить результат даже в тех случаях, когда одна из таблиц не имеет значения в столбцах результатов. Надеюсь, мне ясно. Моя цель - получить

[(<Table1>, None)]

, когда запрос для всех столбцов (SELECT t1.*, t2.*), и есть LEFT JOIN с добавленным нулем.

1 Ответ

0 голосов
/ 05 мая 2018

Проблема в том, что ваши таблицы имеют столбцы с одинаковыми именами. SqlAlchemy после выполнения вашего запроса пытается сопоставить результирующие столбцы по именам (не по позициям) и выбрать подходящее совпадение (в этом случае SA сопоставляет столбцы таблицы2 с полями таблицы1 и наоборот). Есть способ указать соответствие с .columns () методом , но я бы посоветовал вам рассмотреть возможность использования orm-functions SqlAlchemy вместо этого всякий раз, когда у вас нет веских причин против этого.

...