Я работаю с базой данных, которая имеет отношение, которое выглядит как:SQLAlchemy присоединиться и заказ по на нескольких таблиц
class Source(Model):
id = Identifier()
class SourceA(Source):
source_id = ForeignKey('source.id', nullable=False, primary_key=True)
name = Text(nullable=False)
class SourceB(Source):
source_id = ForeignKey('source.id', nullable=False, primary_key=True)
name = Text(nullable=False)
class SourceC(Source, ServerOptions):
source_id = ForeignKey('source.id', nullable=False, primary_key=True)
name = Text(nullable=False)
То, что я хочу сделать, это соединить все исходные таблицы, SourceA, SourceB, SourceC и затем order_by
имя.
Звук легкий для меня, но я уже стучал головой об этом, пока теперь и мои головы начинают болеть. Также я не очень хорошо знаком с SQL или sqlalchemy, поэтому было много просмотра документов, но безрезультатно. Может быть, я просто этого не вижу. This кажется близким, хотя и имеет отношение к более новой версии, чем то, что у меня есть (см. Версии ниже).
Я чувствую себя близко не то, что что означает что угодно. Вот моя последняя попытка, которая кажется хорошей вплоть до звонка order_by
.
Sources = [SourceA, SourceB, SourceC]
# list of join on Source
joins = [session.query(Source).join(source) for source in Sources]
# union the list of joins
query = joins.pop(0).union_all(*joins)
запрос кажется правильным в данный момент, насколько я могу сказать, то есть query.all()
работы. Итак, теперь я пытаюсь применить order_by
, который не выдает ошибку до тех пор, пока не вызывается .all
.
Попытка 1: Я просто использовать атрибут Я хочу
query.order_by('name').all()
# throws sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "name" does not exist
Попытка 2: Я просто использовать определенный атрибут столбца Я хочу
query.order_by(SourceA.name).all()
# throws sqlalchemy.exc.ProgrammingError: (ProgrammingError) missing FROM-clause entry for table "SourceA"
Это очевидно? Что мне не хватает? Благодаря!
версии:
sqlalchemy. версия = '0.8.1'
(PostgreSQL) 9.1.3
EDIT Я имею дело с каркасом, который хочет дескриптор объекта запроса. У меня есть простой запрос, который, как представляется, выполняет то, что я хочу, но мне все равно придется его обернуть в объект запроса. Не уверен, что это возможно. Погуглить ...
select = """
select s.*, a.name from Source d inner join SourceA a on s.id = a.Source_id
union
select s.*, b.name from Source d inner join SourceB b on s.id = b.Source_id
union
select s.*, c.name from Source d inner join SourceC c on s.id = c.Source_id
ORDER BY "name";
"""
selectText = text(select)
result = session.execute(selectText)
# how to put result into a query. maybe Query(selectText)? googling...
result.fetchall():
Используют вы [ 'inheritance'] (Http: //docs.sqlalchemy. орг/о/rel_0_9/ОРМ/inheritance.html)? – van
напечатайте 'query.order_by ('name')', это может дать вам некоторую подсказку. – rajpy
@van Я использую наследование, которое заставляет меня полагать, что без какого-либо из вышеупомянутого кода я мог бы просто выполнить запрос (источник) .order_by ('name'). All() ', но это терпит неудачу, потому что столбец 'name' не существует в базовом классе Source. 'sqlalchemy.exc.ProgrammingError: (ProgrammingError) column" name "не существует' – ralphinator80