import sqlite3 ##可以在 Python 程序中使用 SQLite 数据库
import time
class IPPool(object):
##存储ip的数据库,包括两张表ip_table和all_ip_table
##insert和建表语句绑定在一起
def __init__(self,table_name):
self.__table_name = table_name
self.__database_name = "IP.db" ##IPPool对应的数据库为IP.db
##初始化类,传入参数table_name
def create(self):
conn = sqlite3.connect(self.__database_name, isolation_level = None)
conn.execute(
"create table if not exists %s(IP CHAR(20) UNIQUE, PORT INTEGER, ADDRESS CHAR(50), TYPE CHAR(50), PROTOCOL CHAR(50))"
% self.__table_name)
print("IP.db数据库下%s表建表成功" % self.__table_name)
##建表语句
def insert(self, ip):
conn = sqlite3.connect(self.__database_name, isolation_level = None)
#isolation_level是事务隔离级别,默认是需要自己commit才能修改数据库,置为None则自动每次修改都提交
for one in ip:
conn.execute(
"insert or ignore into %s(IP, PORT, ADDRESS, TYPE, PROTOCOL) values (?,?,?,?,?)"
% (self.__table_name),
(one[0], one[1], one[2], one[3], one[4]))
conn.commit() #提交insert 但是已经设置isolaion_level为None,所以应该不需要
conn.close()
def select(self,random_flag = False):
conn = sqlite3.connect(self.__database_name,isolation_level = None)
##连接数据库
cur=conn.cursor()
#cursor用于接受返回的结果
if random_flag:
cur.execute(
"select * from %s order by random() limit 1"
% self.__table_name)
result = cur.fetchone()
#如果是random_flag为T则随机抽取一条记录并返回
else:
cur.execute("select * from %s" % self.__table_name)
result = cur.fetchall()
cur.close()
conn.close()
return result
def delete(self, IP = ('1',1,'1','1','1'), delete_all=False):
conn = sqlite3.connect(self.__database_name,isolation_level = None)
if not delete_all:
n = conn.execute("delete from %s where IP=?" % self.__table_name,
(IP[0],))
#逗号不能省,元组元素只有一个的时候一定要加
print("删除了",n.rowcount,"行记录")
else:
n = conn.execute("delete from %s" % self.__table_name)
print("删除了全部记录,共",n.rowcount,"行")
conn.close()
if __name__ == "__main__":
conn = sqlite3.connect("IP.db",isolation_level = None)
cur = conn.cursor()
cur.execute("select count(1) from validation_ip_table ")
print(cur.fetchall())