Python:关于GQuery结果集的DISTINCT(GQL,GAE)

时间:2008-10-27 07:13:12

标签: python sql google-app-engine distinct gql

想象一下,您在Google App Engine数据存储区中有一个实体,为匿名用户存储链接。 您希望执行以下不支持的SQL查询:

SELECT DISTINCT user_hash FROM links

相反,您可以使用:

user = db.GqlQuery("SELECT user_hash FROM links")

如何使用Python 最有效来过滤结果,以便返回DISTINCT结果集? 如何计算DISTINCT结果集?

4 个答案:

答案 0 :(得分:5)

恢复此问题以完成:

DISTINCT关键字已在release 1.7.4中引入。

您可以找到更新的GQL参考(例如Python)here

答案 1 :(得分:3)

一套是解决这个问题的好方法:

>>> a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com']
>>> b = set(a)
>>> b
set(['livejournal.com', 'google.com', 'stackoverflow.com'])
>>> 

第一个答案的一个建议是,设置和决策更快地检索独特结果,列表中的成员资格是O(n)而O(1)对于其他类型,所以如果你想要存储其他数据,或者执行诸如创建提到的unique_results列表之类的操作,最好执行以下操作:

unique_results = {}
>>> for item in a:
    unique_results[item] = ''


>>> unique_results
{'livejournal.com': '', 'google.com': '', 'stackoverflow.com': ''}

答案 2 :(得分:1)

一种选择是将结果放入一个设定对象:

http://www.python.org/doc/2.6/library/sets.html#sets.Set

结果集将仅包含传递给它的不同值。

如果不这样做,建立一个只包含唯一对象的新列表就行了。类似的东西:

unique_results = []
for obj in user:
    if obj not in unique_results:
        unique_results.append(obj)

也可以将for循环压缩成列表推导。

答案 3 :(得分:0)

很抱歉把这个问题弄清楚,但是在GAE我无法比较那样的对象,我必须使用.key()进行比较,如下:

请注意,效率非常低:

def unique_result(array):
    urk={} #unique results with key
    for c in array:
        if c.key() not in urwk:
            urk[str(c.key())]=c
    return urk.values()

如果有人有更好的解决方案,请分享。