Как дважды объединить детали на главном сервере в SQLAlchemy?

#python #join #sqlalchemy

#python #Присоединиться #sqlalchemy

Вопрос:

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

 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. Если вы нашли рабочее решение; опубликуйте его как ответ (не как обновление вопроса).

Ответ №1:

Довольно долго борясь с проблемой, я решил ее через пару минут после публикации моего вопроса здесь. Решением было сохранить, а затем повторно использовать все таблицы с псевдонимами. Раньше я использовал псевдоним в join, а затем тот же псевдоним для таблицы для извлечения ссылки на столбец в SELECT, что приводило к избыточности и нарушению ‘ИЗ detail КАК foo , detail КАК bar, master JOIN detail … ОБЪЕДИНИТЬ детали …»

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

создайте пустой словарь для таблиц с псевдонимами: { «table name»: Table object } для каждого объединения master-detail зарегистрируйте новую таблицу с псевдонимом в словаре:

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

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

 expression = join(expression, detail_table)
  

При сборе полей для ВЫБОРА не получайте другую таблицу (имя, …), а получайте из списка таблиц с псевдонимами:

 column = tables[table_name].c[column_name]