2014-09-04 5 views
2

Я присоединяюсь 3 таблицы в SQLAlchemy Ядра и выбрать все столбцы следующим образом:Выбор столбцов из Mulitple соединения таблиц в SQLAlchemy Сердечник

rows = self.db.execute(self.execs.join(
         self.orders.join(self.instruments) 
        ).select(whereClause)).reduce_columns()) 

Он работает хорошо, но если я хочу, чтобы выбрать подмножество столбцов:

reqdCols = [order.c.id, exec.c.last_modified, instruments.type] 
rows = self.db.execute(self.execs.join(
         self.orders.join(self.instruments) 
        ).select(reqdCols, whereClause)).reduce_columns()) 

Он не работает и дает следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/apps/qtdist/pkgs/pub/cpython/python-2.7.6/lib/python2.7/site-packages/sqlalchemy/sql/selectable.py", line 807, in select 
    return Select(collist, whereclause, from_obj=[self], **kwargs) 
    File "/apps/qtdist/pkgs/pub/cpython/python-2.7.6/lib/python2.7/site-packages/sqlalchemy/sql/selectable.py", line 2219, in __init__ 
    whereclause).self_group(against=operators._asbool) 
    File "/apps/qtdist/pkgs/pub/cpython/python-2.7.6/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 3438, in _literal_as_text 
    "SQL expression object or string expected." 
sqlalchemy.exc.ArgumentError: SQL expression object or string expected. 

альтернативы можно было бы использовать выберите инст Свинец из Join.select и сделать его неявным присоединиться где статьи:

joinConditions = (orders.c.colx == execs.colx) & (execs.c.coly == instruments.c.coly) 
select(reqdCols).where(and_(whereClause, joinConditions) 

Но я предпочел бы явно присоединиться к более неявным соображениям производительности. Есть ли способ выбрать подмножество столбцов, используя явные объединения?

+0

вы пожалуйста, дайте полный отслеживающий? – Nilesh

+0

Где инициализируется 'whereClause'? – Nilesh

+0

Я упростил это. В фактическом коде whereClause на самом деле является кортежем предложений и вызывается как: select (и _ (* whereClauses)). Кроме того, stacktrace выполняется из python REPL без предложения where, поскольку я сначала пытаюсь его интерпретировать. – apoorvkul

ответ

3

Это может быть сделано следующим образом:

j = join(table1, table2) #optional third argument is join on part like table1.c.c1 == table2.c.c1 

r = db.execute(select([table1.c.x, table2.c.y]).select_from(j) 
Смежные вопросы