【问题标题】:help with datastore query数据存储查询帮助
【发布时间】:2011-05-15 18:10:15
【问题描述】:

您好,我正在尝试列出包含给定艺术家的歌曲的播放列表,我有其键名,我的模型是:

**playlist**
songs = db.ListProperty(db.Key)

**Song**
artist = db.ReferenceProperty(Artist,collection_name='songs')

**Artist**
Key Name = john-lennon

所以播放列表包含歌曲键的列表,而歌曲包含对艺术家的引用。

任何帮助将不胜感激,到目前为止,我的查询一直很简单,所以我现在有点迷失了 :-)

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore gql


    【解决方案1】:

    你不能用 GAE 做这样的查询。数据存储区不是关系型数据库,不做 JOIN 之类的事情。

    您能做的最好的事情是获取所有歌手为约翰列侬的歌曲,然后找到这些歌曲的播放列表:

    songs = GqlQuery('SELECT __key__ FROM song WHERE artist = :1', 'john-lennon')
    playlists = GqlQuery('SELECT * FROM playlist WHERE songs IN :1', songs)
    

    请注意,如果您有超过 30 首约翰列侬的歌曲,即使这样也会有问题 - 正如文档所述:

    注意:IN 和 != 运算符在后台使用多个查询。例如,IN 运算符对列表中的每个项目执行单独的基础数据存储查询。返回的实体是所有底层数据存储查询的交叉产品的结果,并且已删除重复数据。任何单个 GQL 查询最多允许 30 个数据存储区查询。

    【讨论】: