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?: 进程的字段类型是否可能设置为stringtextinteger 以外的任何内容?

    你的第二个问题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() 不工作的主要内容,如果未能解决你的问题,请参考以下文章

没有 web2py 的 DAL

是否有 web2py 的 DAL 的命名约定列表?

默认情况下,级联上的 web2py 数据库抽象层 (DAL) 引用是啥?

将 MySQL 查询转换为在 web2py DAL 中使用

Web2py DAL 查找最新日期的记录

在 web2py DAL 中查询空值