select语句中的子查询

时间:2010-12-31 01:48:03

标签: sqlalchemy pylons

我有一对多关系的两张桌子(专辑,图片),我想用一张图片显示每张专辑的详细信息,所以我有以下查询

select albums.name
    , (
      select pictures.path 
      from pictures 
      where pictures.albumid = albums.id 
      limit 1
    ) as picture 
from albums 
where ...

现在我正在努力用Pylons在sqlalchemy上创建这个我尝试做以下事情

picture = Session.query(model.Picture)

sub_q = picture.filter_by(albumid = model.Album.id).limit(1).subquery()

album_q = Session.query(model.Album, sub_q)

result = album_q.all()

但它会创建以下语句,显示不正确的图片,因为子表中包含的表专辑

select albums.name
    , (
      select pictures.path 
      from pictures, albums 
      where pictures.albumid = albums.id
    ) 
from albums 
where ...

我做错了吗?这在sqlalchemy中甚至可能吗?

完美无缺。对不起,我忘了说我正在使用sqlalchemy反射。我将尝试反向引用该对象并查看它是否有效。

1 个答案:

答案 0 :(得分:1)

如果我理解这个问题的基本前提(诚然,它有点不清楚),使用relationships听起来可能会更好地完成这一点。从我正在收集的内容来看,一张图片有一张专辑,但一张专辑有很多图片?无论如何,这有点无关紧要,因为关系概念在这里很重要。

您尚未指定模型的设置方式,但使用declarative语法可以定义如下表格:

class Album(Base):
    __tablename__ = 'albums'
    id = Column(Integer, Sequence('album_id_sequence'), primary_key=True)

class Picture(Base):
    __tablename__ = 'pictures'
    id = Column(Integer, Sequence('picture_id_sequence'), primary_key=True)
    albumid = Column(Integer, ForeignKey('albums.id'))
    picture = Column(String(99))
    album = relationship('Album', backref=backref('pictures'))

Sqlalchemy然后为您完成所有艰苦的工作。现在每个'图片'都有一个'相册'属性,可以通过'picture.album'调用。在代码中,这看起来像:

pictures = session.query(Picture).all()
for picture in pictures:
    for album in picture.albums:
        # do stuff with album

反之亦然,如果你有一张专辑,你可以得到一张图片(这就是关系定义中的backref所做的):

albums = session.query(Album).all()
for album in albums:
    album.picture  # the picture object related to the album

我没有对代码进行测试,因此有可能存在拼写错误,但希望您能得到一般的想法。