Sqlalchemy select语句中的子查询

Sqlalchemy select语句中的子查询,sqlalchemy,pylons,Sqlalchemy,Pylons,我有两个一对多关系的表(相册、图片),我想用一张图片显示每个相册的详细信息,因此我有以下查询 select albums.name , ( select pictures.path from pictures where pictures.albumid = albums.id limit 1 ) as picture from albums where ... 现在我正在努力用sqlalchemy创建这个挂架,我试着做

我有两个一对多关系的表(相册、图片),我想用一张图片显示每个相册的详细信息,因此我有以下查询

select albums.name
    , (
      select pictures.path 
      from pictures 
      where pictures.albumid = albums.id 
      limit 1
    ) as picture 
from albums 
where ...
现在我正在努力用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()
但它会创建以下语句,显示不正确的图片,因为子查询中包含表albums

select albums.name
    , (
      select pictures.path 
      from pictures, albums 
      where pictures.albumid = albums.id
    ) 
from albums 
where ...
我做错了吗?这在sqlalchemy中可能吗


那很好用。很抱歉,我忘了说我正在使用sqlalchemy反射。我将尝试反向引用对象,看看它是否有效。

如果我理解这个问题的基本前提(承认它有点不清楚),使用它听起来可能会更好。从我收集的资料来看,一张图片有一个相册,但是一张相册有很多图片?无论如何,这有点不相关,因为关系概念在这里很重要

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

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所做的):


我还没有测试过代码,所以可能会有拼写错误,但希望你能了解大概的意思。

如果我理解这个问题的基本前提(承认有点不清楚),那么使用可能会更好。从我收集的资料来看,一张图片有一个相册,但是一张相册有很多图片?无论如何,这有点不相关,因为关系概念在这里很重要

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

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所做的):

我还没有测试过代码,所以可能会有拼写错误,但希望你能大致了解一下