SQLALCHEMY에서 테이블을 결합 할 때 별칭 만 분리하는 편리한 방법이 있습니까?
-
06-07-2019 - |
문제
때로는 클래스를 매핑하는 것이 유용합니다. 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()
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))
제휴하지 않습니다 StackOverflow