SQLALCHEMY에서 테이블을 결합 할 때 별칭 만 분리하는 편리한 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/1627429

  •  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))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top