我有一门课:
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行的事实...
请帮帮忙
发布于 2009-10-19 00:20:45
您可以执行OR (Python在应用程序级别费力地为您合成它),它负责“与排序的并集”。但是,如果您需要担心> 1000个事务,这将没有帮助(也不会有offset和limit: offset + limit的总和限制为1000!)。您将需要对某些内容进行切片(假设与排序所依据的字段相同,我猜是tran_date?)有几个<条件,当然不能保证你想要的确切的限制和偏移量,所以你必须稍微超出它们,并在应用程序级别上切掉进程。
编辑: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但最大的问题仍然是上面概述的那些。
如果不知道这些数字的数量级,很难提出具体的设计选择!-)
编辑:对于这些参数中的任何数量级,都没有最优的,甚至是合理的解决方案--您如何有效地处理每个用户每天数百万的事务将与您处理每个用户每天几个事务的方式截然不同;我甚至无法想象在这两种情况下都有意义的体系结构(我可能,也许是在关系上下文中,但不是在像我们这里这样的非关系上下文中--例如,为了适当地处理每天数百万个事务的情况,您确实希望在事务上有一个更细粒度的时间戳,而不仅仅是记录它的日期!)。
https://stackoverflow.com/questions/1585299
复制相似问题