2009-10-26 24 views
3

當使用SQLAlchemy的聲明性擴展時,有時將類映射到join而非單個表很有用。列名衝突時,通常以一對多形式出現,因爲默認情況下所有主鍵都命名爲id,您可以使用.alias()爲每個列添加其表名。如果您已經編寫了假定映射類具有非前綴名稱的代碼,那很不方便。在SQLAlchemy中連接表時,是否有一種方便的方法來僅別名衝突的列?

例如:

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Table, Column, Integer, ForeignKeyConstraint 

Base = declarative_base() 

t1 = Table('t1', 
    Base.metadata, 
    Column('id', Integer, primary_key=True)) 

t2 = Table('t2', 
    Base.metadata, 
    Column('id', Integer, primary_key=True), 
    Column('fkey', Integer), 
    ForeignKeyConstraint(['fkey'], [t1.c.id])) 

class ST(Base): 
    __table__ = t1.join(t2) 

class ST2(Base): 
    __table__ = t1.join(t2).alias() 

ST具有idfkey屬性與每個名稱映射到所述第一表中的連接使用該重寫的名稱,因此,被映射的類不暴露t2的主鍵。 ST2具有t1_id,t2_idt2_fkey屬性。

是否有一種方便的方法來僅對join中每個表中的某些列進行別名,以便映射的類爲大多數映射列公開更方便的非前綴屬性名稱?

回答

5

您可以使用其label()方法單獨爲每個列創建別名。所以它可能類似於以下(未測試):

from sqlalchemy import select 

def alias_dups(join): 
    dups = set(col.key for col in join.left.columns) & \ 
       set(col.key for col in join.right.columns) 
    columns = [] 
    for col in join.columns: 
     if col.key in dups: 
      col = col.label('%s_%s' % (col.table.name, col.key)) 
     columns.append(col) 
    return select(columns, from_obj=[join]).alias() 

class ST2(Base): 
    __table__ = alias_dups(t1.join(t2)) 
相關問題