2011-05-06 7 views
6

Bmarks_tags ikincil bir tabloya sahip bmarks ve etiketler arasında çok - çok ilişki gemisinde çalışan bir sorguyu yapmaya çalışıyorum. Sorgu birkaç alt soruyu içerir ve bir sütun DISTINCT ihtiyacım var. Daha sonra bunu DISTINCT'd ids aracılığıyla başka bir masaya katılmak istiyorum.sqlalchemy: bir filtre veya clauselement öğesinde etiketleme() 'd sütunu

bunu bir kaç yoldan denedim ve bu en yakın görünüyor:

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) 

Ama bir hata alıyorum:

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

Herkes ben bmarks_tags genelinde katılmak gerçekleştirebilirsiniz biliyor mu. tag_id ve Tag.tid.distinct() 'nin sonucu?

Teşekkür

Şema:

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

Şemalarınızı gönderebilmemiz için lütfen gönderin. – letitbee

+0

SELECT ifadesi oldukça kafa karıştırıcı görünüyor. Gerçek SQL var mı? – sayap

cevap

4

şey çalışmalıdır (ve bu günlerde çıplak seçimler yapmak için artık fazla bir neden yok), muhtemelen çoktan çoğa bir ilişki kurarak başlamalısınız:

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") 

Sonra sorgu almak ve oradan devam:

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

Değilse, bize sqlalchemy yayarlar yapmaya çalışıyoruz gerçek sql verir.

+0

Bence bu işe yarayacaktı. Sorguyu çok farklı bir şekilde ele aldım. Sanırım .s.tquid'in ne olduğunu bilen bir şey elde etmeme yardım etmek için .subquery() 'yi kaçırıyordum. Bir takma ad, vb. Bu referansa izin vermez. Herhangi bir kişi tam olarak çalışmayı uygulamayı görmek istiyorsa, buradan kontrol edebilirsiniz: http://goo.gl/GV9x7 – Rick

+2

Bunun için teşekkürler. Farklı bir problemi çözmem için önemli bir ipucuydu, daha sonra bir yerde bir etiketlenmiş bir sütun elde etmekti. Çözüm, etiket nesnesini çıkarmak ve her iki yerde de ona başvurmaktı, örneğin, var_col = at.c ['X']. Label ('var_name') ... query = select ([at.c ['id') ], var_col], whereclause = var_col! = Yok) –

1

Size başarmak için çalışıyoruz ne söylemek zor, ancak her durumda ORM kullandığınız tarihi:

böyle
# 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)