我有一对多关系的两张桌子(专辑,图片),我想用一张图片显示每张专辑的详细信息,所以我有以下查询
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反射。我将尝试反向引用该对象并查看它是否有效。
答案 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
我没有对代码进行测试,因此有可能存在拼写错误,但希望您能得到一般的想法。