2011-05-06 3 views
6

bmarks_tags의 보조 테이블을 사용하여 bmark와 태그 사이에 많은 관계가있는 배에서 작동하는 쿼리를 수행하려고합니다. 쿼리에는 여러 하위 쿼리가 필요하며 열을 DISTINCT 할 필요가 있습니다. 나중에 DISTINCT'id를 통해 다른 테이블에 조인하려고합니다.sqlalchemy : 필터 또는 절 (element)의 label() 열을 참조하십시오.

것은 내가 그것을 몇 가지 방법을 시도하고이 가장 가까운 것 같다

tagid = alias(Tag.tid.distinct()) 
test = select([bmarks_tags.c.bmark_id], 
       from_obj=[bmarks_tags.join(DBSession.query(tagid.label('tagid'))), 
         bmarks_tags.c.tag_id == tagid]) 

return DBSession.execute(qry) 

하지만 오류 얻을 :

⇝ AttributeError: '_UnaryExpression' object has no attribute 'named_with_column' 

사람 내가이 bmarks_tags를 통해 가입 수행 할 수있는 방법을 알고 있나요합니다. tag_id와 Tag.tid.distinct()의 결과?

감사

스키마 :

t = DBSession.query(Tag.tid.distinct().label('tid')).subquery('t') 
test = select([bmarks_tags.c.bmark_id], bmarks_tags.c.tag_id == t.c.tid) 
return DBSession.execute(test) 
+0

스키마를 게시하여 게시하십시오. – letitbee

+0

SELECT식이 다소 혼란 스럽습니다. 실제 SQL을 가지고 있습니까? – sayap

답변

4

뭔가 작동합니다 (요즘에는 베어 셀렉트와 함께 갈 이유가별로 없기 때문에) 다차간 관계를 설정하는 것으로 시작해야합니다 :

bmarks_tags = Table('bmark_tags', Base.metadata, 
    Column('bmark_id', Integer, ForeignKey('bmarks.bid'), primary_key=True), 
    Column('tag_id', Integer, ForeignKey('tags.tid'), primary_key=True) 
) 

class Tag(Base): 
    """Bookmarks can have many many tags""" 
    __tablename__ = "tags" 

    tid = Column(Integer, primary_key=True) 
    name = Column(Unicode(255), unique=True) 

class BMark(Base): 
    __tablename__ = 'bmarks' 
    bid = Column(Integer, primary_key=True) 
    tags = relation(Tag, secondary=bmarks_tags, backref="bmarks") 

그런 다음 쿼리를 얻고 거기에서 이동합니다

query = DBSession.query(BMark).join(BMark.tags) 

그렇지 않을 경우, 우리에게 당신은 SQLAlchemy의이 방출 만들려고 실제 SQL을 제공합니다.

+0

나는 이것이 효과가 있었을 것이라고 생각한다. 나는 쿼리에 대해 매우 다르게 끝내었다. 나는 .sid가 무엇인지 알 수있는 것을 얻기 위해 .subquery()를 놓쳤다 고 생각한다. 별칭 등은 해당 참조를 허용하지 않습니다. 누구나 전체 작업 구현을보고 싶다면 여기에서 확인할 수 있습니다. http://goo.gl/GV9x7 – Rick

+2

감사합니다. 다른 문제를 해결하기위한 중요한 힌트였습니다. 나중에 whereclause에서 레이블이 지정된 열을 유지하는 것이 었습니다. 해결 방법은 레이블 객체를 추출하여 var_col = at.c [ 'X']와 같은 두 위치에서 참조하는 것이 었습니다. label ('var_name') ... query = select ([at.c [ 'id' ], var_col], where 절 = var_col! = 없음) –

1

당신이 달성 하려는지 알 어려운,하지만 당신은 어쨌든 ORM을 사용하고 있기 때문에 :

이 같은
# this is the secondary table that ties bmarks to tags 
bmarks_tags = Table('bmark_tags', Base.metadata, 
    Column('bmark_id', Integer, ForeignKey('bmarks.bid'), primary_key=True), 
    Column('tag_id', Integer, ForeignKey('tags.tid'), primary_key=True) 
) 

class Tag(Base): 
    """Bookmarks can have many many tags""" 
    __tablename__ = "tags" 

    tid = Column(Integer, autoincrement=True, primary_key=True) 
    name = Column(Unicode(255), unique=True)