2010-12-29 3 views
2

SqlAlchemyの生成構文を使用して匿名でエイリアス化されたテーブルを照会するときに、SqlAlchemyで匿名でエイリアス化されたテーブルを結合した列を指定する方法

スキーマは、1対多の2つのテーブル、あります

user = Table('user', meta, 
    Column('id', Integer, primary_key=True, autoincrement = False), 
    Column('name', String), 
    Column('department_id', Integer, ForeignKey('department.id')) 
) 

department = Table('department', meta, 
    Column('id', Integer, primary_key=True, autoincrement = True), 
    Column('name', String) 
) 

単一のテーブルのクエリが動作します。

# alias the tables anonymously 
u = user.alias() 
d = department.alias() 

# single table select works 
q = select([ 
    u.c.id.label('UserId'), 
    u.c.name.label('User'), 
    ]) 
r = conn.execute(q).fetchall() 
log.debug(r[0].keys()) 
# [u'UserId', u'User'] 

しかし、エイリアステーブルを結合するとき、彼らは名前を変更している、と私を新しい名前がどのようになるか分からないので、列を指定することはできません。

# join the 2 aliased tables 
from_ = u.join(d) 
log.debug(from_.c.keys()) 
# [u'%(172847020 user)s_id', u'%(172847020 user)s_name', u'%(172847020 user)s_department_id', u'%(172846668 department)s_id', u'%(172846668 department)s_name'] 

# this does not work 
q = select([ 
    from_.c.user_id.label('UserId'), 
    from_.c.user_name.label('User'), 
    from_.c.department_name.label('Department'), 
    ]) 
r = conn.execute(q).fetchall() 
log.debug(r[0].keys()) 

これをどのように機能させることができますか?

はここで完全なテストコードです:

import logging 
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey 
from sqlalchemy.sql import * 

log = logging.getLogger('generative_test') 
logging.basicConfig(level=logging.DEBUG, 
     format='%(asctime)s,%(msecs)03d %(levelname)s [%(filename)s.%(funcName)s @ %(lineno)d.%(thread)d] %(message)s') 

engine = create_engine('sqlite:///:memory:', echo = False, echo_pool = False) 
meta = MetaData() 
meta.bind = engine 

user = Table('user', meta, 
    Column('id', Integer, primary_key=True, autoincrement = False), 
    Column('name', String), 
    Column('department_id', Integer, ForeignKey('department.id')) 
) 

department = Table('department', meta, 
    Column('id', Integer, primary_key=True, autoincrement = True), 
    Column('name', String) 
) 

meta.create_all(engine) 
conn = engine.connect() 

conn.execute(department.insert(),[ 
    {'name':'bosses'}, 
    {'name':'peons'}, 
]) 
conn.execute(user.insert(),[ 
    {'name':'Mr. Slate','department_id':1}, 
    {'name': 'Fred','department_id':2}, 
    {'name': 'Barney','department_id':2}, 
]) 

# alias the tables anonymously 
u = user.alias() 
d = department.alias() 

# single table select works 
q = select([ 
    u.c.id.label('UserId'), 
    u.c.name.label('User'), 
    ]) 
r = conn.execute(q).fetchall() 
log.debug(r[0].keys()) 
# [u'UserId', u'User'] 

# join the 2 aliased tables 
from_ = u.join(d) 
log.debug(from_.c.keys()) 
# [u'%(172847020 user)s_id', u'%(172847020 user)s_name', u'%(172847020 user)s_department_id', u'%(172846668 department)s_id', u'%(172846668 department)s_name'] 

# this does not work 
q = select([ 
    from_.c.user_id.label('UserId'), 
    from_.c.user_name.label('User'), 
    from_.c.department_name.label('Department'), 
    ]) 
r = conn.execute(q).fetchall() 
log.debug(r[0].keys()) 

答えて

2
q = select([ 
    u.c.id.label('UserId'), 
    u.c.name.label('User'), 
    d.c.name.label('Department'), 
], from_obj=u.join(d)) 
+0

くそー、from_objのPARAM忘れ。ありがとう! – Hollister

関連する問題