gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:26 24 4
gpt4 key购买 nike

有时在使用 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 具有 idfkey 属性,每个名称映射到连接中使用覆盖名称的第一个表,因此映射类不公开 t2 的主键。 ST2 具有 t1_idt2_idt2_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))

关于python - 在 SQLAlchemy 中连接表时,是否有一种方便的方法来仅对冲突的列进行别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1627429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com