Sqlite   发布时间:2022-05-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了QQwry到Sqlite3(续)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
下面是用于查询转成sqlite3的qqwry的python代码
'''
Created on 2010-5-4

@author: Ben
@mail: ben.pang.china@gmail.com
'''

import os,sys,re
import sqlite3
from converter import b2I,dbname

def int2Ip(i):
    """IP字符串转换成IP对象"""
    i = int(i)
    return IP( "{}.{}.{}.{}".format( i >> 24,i  >> 16 & 0xFF,i  >> 8 & 0xFF,i & 0xFF ) )

def ip2Int(ip):
    """IP字符串转换成Integer"""
    if ipm.match(ip):
        return b2I( reversed(List( map( int,ip.split(".") ) )) )

# local variables
ipm = re.compile( "^((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)$" )
conn = None

def init():
    global conn
    sqlite3.register_converter("ip",int2Ip)
    conn = sqlite3.connect(dbname,detect_types = sqlite3.PARSE_ColnameS);
    
class IP:
    def __init__(self,ip):
        """IP类,存放IP地址,并验证IP字符串是否有效"""
        if not ipm.match(ip):
            raise ValueError( "invalID ip value:" + ip )
        self.ip = ip
    
    def __str__(self):
        return self.ip

if __name__ == '__main__':
    if os.path.exists(dbName) and len(sys.argv) == 2 and ipm.match(sys.argv[1]):
        init()
        cur = conn.cursor()
        cur.execute("""
        SELECT start_ip as "s [ip]",end_ip as "e [ip]",country.name,area.name
        FROM ipaddr,country,area WHERE (? betweeN start_ip AND end_ip) AND cID = country.ID AND aID = area.ID;
        """,(ip2Int(sys.argv[1]),) )
        
        for r in cur:
            print("""
            start ip: {} ~ {}
            {}
            """.format(*r))
        
        conn.close()
    else:
        print("not found ipdb for" + dbname,file = sys.stderr )
很不幸,经过尝试转成sqlite3的QQwry的压缩率并没有我想的那么高,整个库文件有31M,是QQwry原格式的3倍.
下面是sql脚本
CREATE table IF NOT EXISTS country (
    ID IntegeR PRIMary KEY,@R_338_4687@T NOT NulL UNIQUE
);

CREATE table IF NOT EXISTS area (
    ID IntegeR PRIMary KEY,@R_338_4687@T NOT NulL UNIQUE
);

CREATE table IF NOT EXISTS ipaddr (
    start_ip IntegeR PRIMARK KEY,end_ip IntegeR NOT NulL UNIQUE,cID IntegeR NOT NulL,aID IntegeR DEFAulT NulL
);

CREATE INDEX IF NOT EXISTS ipIDx ON ipaddr (start_ip,end_ip)
因为在sqlite3里把IP转成Integer了,所以可以看到上面的代码中注册了一个convertor用于转换,如果觉得不方便还可以注册funtion vIEwIP,然后create view,使用注册的函数显示IP,这会增加开销,但可以满足使用习惯
像这样
create view ipvIEw as SELECT vIEwIP(start_ip),... FROM ipaddr....

OK.

大佬总结

以上是大佬教程为你收集整理的QQwry到Sqlite3(续)全部内容,希望文章能够帮你解决QQwry到Sqlite3(续)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: