转换MySQL查询以在web2py DAL中使用

时间:2012-05-02 15:01:57

标签: python mysql data-access-layer web2py

n测试(非web2py)程序,我正在使用调用SELECT SUBSTRING_INDEX的MySQL查询。在web2py的DAL规范中将其转换为正确用法的最简单方法是什么?

查询如下:

http://pastie.textmate.org/3848916

SELECT SUBSTRING_INDEX( ipaddress, '.', 3 ) AS first_three_octet, count( * ) AS ipCount, updated
            FROM ips
            GROUP BY SUBSTRING_INDEX( ipaddress, '.', 3 )
            HAVING ipCount = 254 
            ORDER BY ipCount DESC 

仅供参考 - 我在此期间将这些代码整合在一起,以实现我的目标:

def ListFullRanges():
    import re
    f3o = '(\d{1,3}\.\d{1,3}\.\d{1,3})'
    fullrange = []

    rg1 = re.compile(f3o,re.IGNORECASE|re.DOTALL)
    for row in db(db.ips).select():
        m = rg1.findall(row.ipaddress)
        if not m[0] in fullrange:
            if db(db.ips.ipaddress.startswith(m[0])).count() == 254:
                fullrange.append(m[0])
    print fullrange

    return dict(fr=fullrange)

1 个答案:

答案 0 :(得分:1)

有时会出现非常复杂的查询,这些查询专门针对单个数据库引擎而制作。虽然不是“完美”的解决方案,但您可以使用已经为MySQL构建的查询:

db.executesql(
        "SELECT SUBSTRING_INDEX( ipaddress, '.', 3 ) AS first_three_octet, count( * ) AS ipCount, updated
        FROM ips
        GROUP BY SUBSTRING_INDEX( ipaddress, '.', 3 )
        HAVING ipCount = 254 
        ORDER BY ipCount DESC", as_dict=True
)

这将返回一个字典列表,这将与您使用DAL查询获得的字典类似。使用executionql也更快。唯一的缺点是它可能只适用于MySQL,你不能在SQLFORM中使用它。但如果你只打算使用MySQL,那么这可能是最好的解决方案。