联合Google-App-Engine中的排序

时间:2009-10-18 16:21:55

标签: python google-app-engine

我有一个班级:

class Transaction(db.Model):
    accountDebit = db.ReferenceProperty(reference_class=Account,
                                       collection_name="kontoDuguje")
    accountCredit = db.ReferenceProperty(reference_class=Account, 
                                       collection_name="kontoPotrazuje")
    amount = db.FloatProperty()
    Tran_date = db.DateProperty()
    comment = db.StringProperty()

这里是Account类的方法,我想通过它来获取所有的 特定账户的交易(与 accountDebit或accountCredit),但按日期排序:

def GetTransactions(self):
    transactions = []
    transactions_debit = db.GqlQuery('SELECT * FROM Transaction ' + 
                                    'WHERE accountDebit=:1',self)
    transactions_credit = db.GqlQuery('SELECT * FROM Transaction ' + 
                                    'WHERE accountCredit=:1',self)
    for x in transactions_debit:
        x.amount = -x.amount
        transactions.append(x)
    for x in transactions_credit:
        x.amount = x.amount
        transactions.append(x)
   return transactions

目标是使用这两种结果进行联合,但是使用限制+偏移量。考虑一下您在单个查询中无法获取超过1000行的事实......

请帮忙

1 个答案:

答案 0 :(得分:2)

你可以做一个OR(Python在应用程序级别为你巧妙地合成它),它负责“与sorty结合”。但是,如果您需要担心&gt; 1000个交易,这将无济于事(也不会抵消和限制:抵消+限额的总和是限于1000!)。你需要切片(可能是你正在排序的同一个领域,tran_date我想?)那里有几个<条件,当然这不能保证你你想要的确切限制和偏移,所以你必须超过它们并在应用程序级别切断eccess。

编辑:OR实际上并未在应用程序级别合成(IN和!=是两个操作),因此您需要自己合成(当然也在应用程序级别),例如:

def GetTransactions(account):
    transactions = list(db.GqlQuery(
        'SELECT * FROM Transaction WHERE '
        'accountDebit = :1 ORDER BY Tran_date', account))
    transactions.extend(db.GqlQuery(
        'SELECT * FROM Transaction WHERE '
        'accountCredit = :1 ORDER BY Tran_date', account))
    transactions.sort(key=operator.attrgetter('Tran_date'))
    return transactions

但重要的问题仍然是上面列出的问题。

那么游戏中的数字是多少 - 用户的典型交易次数(比如每周或每天),用户的典型最大总数,您在偏移和限制中需要的数量级别,等等?如果不知道这些数字的数量级,很难提出具体的设计选择! - )

编辑:对于每个参数的任何数量级,没有最佳甚至是合理的解决方案 - 如何有效处理每位用户每天数百万笔交易与每天每个用户处理一些交易的方式大不相同;我甚至无法想象一种在两种情况下都有意义的架构(我可能,或许,在关系环境中,但不是在非关系型,例如我们在这里 - 例如,以适当的方式处理每天数以百万计的交易,你真的想要一个交易的细粒度时间戳,而不仅仅是记录其日期所能提供的! - )。