web2py:DAL find() 不工作
Posted
技术标签:
【中文标题】web2py:DAL find() 不工作【英文标题】:web2py: DAL find() not working 【发布时间】:2016-01-14 00:49:45 【问题描述】:tl;dr:阅读最后一段
我有一个函数应该在一个列表中返回三个row
对象。行对象如下:
mining
属于当前savestate
对于列表中的三个成员,process
分别为 1、2 或 3
其中最大的finish_date
挖矿与保存状态没有直接关系,所以我必须通过名为turn
的表来跟踪正确的保存状态。关系如下:savestate 1:n turn 1:1挖矿。
这是我目前所拥有的:
def get_latest_minings(save_id):
return_list = []
#get all turn.ids that belong to this savestate:
savestate_turns = [s.id for s in db(db.turn.savestate_id == save_id).select(db.turn.id)]
#get all minings that belong to these turns:
save_minings = db(db.mining.turn_id.belongs(savestate_turns)).select()
#loop to get three objects:
for i in range(1,4):
#from save_minings, get all minings, whose process is i:
line_minings = save_minings.find(lambda row: row.process == i)
#initialize loop variables:
latest_date = 0
latest = None
#loop to find the biggest finish_date:
for m in line_minings:
if m.finish_date > latest_date:
latest_date = m.finish_date
latest = m
#add the row with the biggest finish_date to the list:
return_list.append(latest)
#return locals() for testing purposes:
return locals()
#actual return:
#return return_list
然而,这并没有按预期工作。这是它返回的内容:
https://www.dropbox.com/s/ns6mq9414vw25s9/get_latest_minings.png?dl=0
我已经运行了一些单独的测试,我发现问题出在以下行:line_minings = save_minings.find(lambda row: row.process == i)
。其他每一行都正常工作。这里有什么问题?另一个问题:这可以进一步优化吗?我对追踪正确的保存状态特别好奇。
【问题讨论】:
【参考方案1】:关于你的第一个问题What is wrong here?
:
进程的字段类型是否可能设置为string
或text
或integer
以外的任何内容?
你的第二个问题can this be optimized more?
:是的。大概。
手头没有其他代码,这里有一个镜头:
def get_latest_minings(save_id):
# from the minings that belong to this savestate:
query = (db.mining.turn_id == db.turn.id) & (db.turn.savestate_id == save_id)
# [optional] if you want to restrict the process ids only to be 1,2 or 3.
# given your output, you only have 1 and 2 so it would be useless
# again, mind the datatype, don't compare strings to integers.
# but for completion, i'll stick to your original functionality
query &= (db.mining.process.belongs([1,2,3]))
# get the latest finish date per mining process
maxdate = db.mining.finish_date.max()
save_minings = db(query).select(maxdate, db.mining.process, groupby=db.mining.process)
# create a lookup structure with processid as key
last_date_lookup = row.mining.process:row[maxdate] for row in save_minings
# query the lookup structure per process id or None if not available
return [last_date_lookup.get(pid) for pid in range(1,4)]
当然,它未经测试,甚至没有解析或任何东西,但我希望它有所帮助。
还请记住,web2py 的 DAL 可能会出现错误,无法找到某个字段。我注意到在查询连接表时需要以不同方式查询返回的行。大多数情况下,您可以在row.mining.process
中看到这一点,其中使用了表名而不是row.process
,这在仅查询mining
表时非常有用。
【讨论】:
以上是关于web2py:DAL find() 不工作的主要内容,如果未能解决你的问题,请参考以下文章