Как дважды объединить детали по мастеру в SQLAlchemy? - PullRequest
3 голосов
/ 25 апреля 2011

Ситуация: у меня есть две таблицы, например, «master» и «detail», где «master» имеет два столбца, которые ссылаются на «detail»: «foo_id», «bar_id».То есть мне нужно соединить detail дважды с разными именами.Я хочу сделать:

SELECT master.id, foo.name, bar.name, other stuff ...
FROM master
JOIN detail AS foo ON foo.id = master.foo_id
JOIN detail AS bar ON bar.id = master.bar_id

как мне это сделать с помощью SQLAlchemy?

Обратите внимание, что я не использую ORM.Также я ссылаюсь на объекты базы данных из метаданных (строк), поэтому я делаю: table.c ["foo_id"] вместо table.c.foo_id (если эта информация будет иметь отношение к построению оператора).

1 Ответ

2 голосов
/ 10 мая 2011

Долго боролся с проблемой, я решил ее через пару минут после публикации моего вопроса здесь.Решением было сохранить, а затем повторно использовать все таблицы с псевдонимами.До того, как я использовал псевдоним в соединении, а затем тот же псевдоним для таблицы для извлечения ссылки на столбец в SELECT, что приводило к избыточности и разрыву: «ОТ детали AS foo, детали AS bar, master JOIN деталь ... JOIN деталь ...»

Рабочее решение:

создать пустой словарь для таблиц с псевдонимами: {"имя таблицы": объект таблицы} для каждого регистра регистрации присоединения master-detail новая таблица с псевдонимом в словаре:

detail_table = Table(name,...).alias(alias) tables[alias] = detail_table

присоединиться к следующей псевдониму таблицы:

expression = join(expression, detail_table)

При сборе полей для SELECT не получать другую таблицу (имя, ...), а получать из списка псевдонимов таблицы:

column = tables[table_name].c[column_name]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...