在SQLAlchemy中连接表时,是否有一种方便的方法来只对冲突的列进行别名?

joe*_*ker 3 python alias join sqlalchemy

有时,join在使用SQLAlchemy的声明性扩展时,将类映射到一个表而不是单个表是有用的.当列名冲突时,通常是一对多,因为id默认情况下命名所有主键,您可以使用.alias()其表名为每列添加前缀.如果您已经编写了假定您的映射类具有非前缀名称的代码,则这很不方便.

例如:

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()
Run Code Online (Sandbox Code Playgroud)

SThas id,fkey具有每个名称的属性映射到使用重写名称的连接中的第一个表,因此映射的类不会公开t2主键.ST2t1_id,t2_id而且t2_fkey性质.

是否有一种方便的方法来对每个表中的某些列进行别名,join因此映射的类为大多数映射列公开了更方便的非前缀属性名称?

Den*_*ach 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))
Run Code Online (Sandbox Code Playgroud)