0

テスト (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)
4

1 に答える 1

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 クエリを使用して得られるものと似ています。また、executesql を使用する方が高速です。これの唯一の欠点は、MySQL でのみ機能する可能性が高く、SQLFORM では使用できないことです。ただし、MySQL の使用のみを計画している場合は、これが最適なソリューションである可能性があります。

于 2012-05-02T19:05:23.020 に答える