[英]Is there a convenient way to alias only conflicting columns when joining tables in SQLAlchemy?
有时,在使用SQLAlchemy的声明性扩展时,将类映射到join
而不是单个表是有用的。 当列名冲突时,通常是一对多,因为默认情况下所有主键都被命名为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()
ST
具有id
, fkey
属性,每个名称映射到使用重写名称的连接中的第一个表,因此映射的类不会公开t2
的主键。 ST2
具有t1_id
, t2_id
和t2_fkey
属性。
是否有一种方便的方法来只对join
每个表的某些列进行别名,这样映射的类为大多数映射列公开了更方便的非前缀属性名称?
您可以使用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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.