#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]