我可以在SQLAlchemy ORM中使用动态关系(或VIEWS)吗?

时间:2013-11-15 13:32:03

标签: python sql orm sqlalchemy

我正在寻找一种方法,因此关系只使用表的某些行,而不是整个表。

  

我在考虑使用视图而不是原始表作为关系的基础。 视图仅包含原始表中已过滤的行集。

实施例

我想收集来自不同设备和不同用户的几位玩家的歌曲(评分,播放次数,上次播放时间)的统计信息。我使用 Python SQL Alchemy

我提出了以下表格布局(您可以查看code for the objectsSQL for the tables):

ERP

问题

对于每个Song对象,我可以轻松获取所有关联的 Stats对象。但大多数时候我只想要其中一些。我只想要StatsSong相关的Commit,例如。select path, rating... over the three joined tables。只有给定用户提交的所有提交数据或某个提交的数据。

所以我需要一些方法来过滤歌曲对象上的统计数据。

我不确定如何归档这个。

我应该使用一些自定义查询吗?但是我在哪里放置它以及如何放置它?另外:虽然这可能会给我我想要的数据(statssomething along those lines),但我不会让对象回来。

我在考虑在commits表上使用视图,只包含与给定songs匹配的行。必须动态创建视图,以便可以过滤不同的提交。而不是将此视图用作stats到{{1}}之间关系的基础。但我不知道该怎么做。

那么:关于如何解决这个问题的任何想法?

或者如何解决另一种方式?

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

from sqlalchemy.orm import object_session
# defined inside of your Song class
def stats_by_commit(self,commit):
    #this could also be implemented as a join
    return object_session(self).query(Stat)\
           .filter(Stat.song_id == self.song_id,Stat.commit_id == Commit.commit_id)

用法:

commit = db_session.query(Commit).filter_by(id=1)
for song in db_session.query(Song).filter_by(path='some_song_path'):
    for stat in song.stats_by_commit(self,commit):
        print stat.rating