双色球笔记2--保存所有双色球号码到MySQL

 

1、功能

本代码主要将双色球所有数据保存到mysql数据库,双色球总种类为17721088。笔者8G I7笔记本大约插入了10天,下面代码中包含两中方法,Insert_SSQ 和Insert_SSQ2,前者依次插入所有数据,后者依次从最大id+1开始插入,后者较实用。

本方法基本实现了数据存入MySQL,但效率太慢,可考虑通过分表、关闭索引等方式提高数据插入效率,后续将在此方面加以改进。

 

2、代码

# -*- coding:utf-8 -*-
import pymysql
import traceback

#######mysql驱动
#pip install PyMySQL
#######
########## mysql用法 start

'''
另外关于db这个连接对象,除了可以实例化一个游标对象之外,还可以进行commit(),rollback()等操作。

  游标对象的执行和返回数据
  就像上面例子中提到的那样,cursor可以调用execute来执行一定的SQL语句,也可以fetchone或者fetchall来得到返回的数据。接下来详细看一下cursor的各个方法:
  callproc(procname[,args])  调用一个叫做procname的存储过程
  close()  游标也有关闭方法,游标被关闭之后就不能再移动,更不能被fetch
  execute(query[,args])  query是一个SQL串,args是一个序列或者映射,将依次为query中的变量赋值。关于query串中的变量设置下面会细讲。这个方法返回的值是影响的行数(比如查询SQL就返回查询到了多少行,增删SQL就返回增删了多少行)
  executemany(query[,args])  这个方法和execute是类似的,只不过它是重复好几次执行execute,args也是一个“相同长度序列的序列”,每一次执行都把一个序列中的项对应到query的变量中去。据说executemany在效率上比execute高出很多, 在批量插入、批量更新时可以考虑使用。需要注意的是,这个方法是一个整体,如果想要进行多次查询操作用这个方法的话往往只能得到最后一个参数约束到SQL中得到的结果集
  fetchone/fetchall()  获得一行/所有行结果
  fetchmany([size])  size指出了我到底要获取多少行的数据,如果能够返回的行数小于要求的行数的话,就以少的为准。
  nextset()  放弃所有结果集中结果直接跳到下个结果集(如果有的话)。如果没有更多结果集就返回None,否则返回True,接下来的fetch操作将会从新结果集返回数据了。所谓结果集,就是比如连着执行两条SQL语句的话,如果不调用nextset,那么fetch来fetch去总是只能得到第一个语句的结果内容,调用了这个之后就可以看到下一个语句执行结果的内容了。
  rowcount  这个属性代表了上一次execute*方法得到结果的结果行数,如果是-1则代表了上一次返回结果没有结果集且行数无法确定。

  query字符串中的变量设置
  query中可以设置变量来动态地生成一些SQL语句,从而使得操作更加灵活多变。query中的变量大多数时候用在查询操作里面,因为没有统一的格式规定,设定变量的方法有很多种形式。比如可以用?,格式化字符串,数字等等。下面统一用格式化字符串的形式来表示。
  比如"select Sno,Sname from Student where Sno=%s"
  “select * from Client where level > %d and gid = %s"
  这些变量可以和execute*方法的args参数进行配合以具体化。对于execute方法而言,因为只执行一次SQL,所有它的args只需要一个元组(序列),元组各元素和SQL串中的变量一一对应。而对于executemany方法,args是一系列上面那样的元组组成的一个元组(序列),相当于以一个循环依次把大元组中的各个小元组约束进SQL执行
'''
########## mysql用法 end

class MysqlClass():
db = None
host = 'localhost'
usr = 'root'
pwd = 'YourPwd'
dbname = 'Lottery'
port = 3306
charset = 'utf8'

def ShowVersion(self):
db = pymysql.connect(self.host, self.usr, self.pwd, self.dbname, self.port)
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print("Database version : %s " % data)
# 关闭数据库连接
db.close()

def OpenDB(self):
'''
打开mysql:
'''
self.db = pymysql.connect(host = self.host, user = self.usr, passwd = self.pwd, db = self.dbname,charset = self.charset)
#print('Open MySQL!')

def CloseDB(self):
"""
关闭sql
"""
self.db.close()
#print('Close MySQL!')
def ExcuteSQL(self,str_sql):
self.OpenDB()
try:
cursor = self.db.cursor()
cursor.execute(str_sql)
cursor.close()
self.db.commit()
except:
self.db.rollback()
traceback.print_exc()
self.CloseDB()

def GetMaxId(self):
sql_1 = "select max(id) from SSQ"
maxnum = 0
try:
cursor = self.db.cursor()
cursor.execute(sql_1)
ret1 = cursor.fetchone()
maxnum = ret1[0]#返回为tupple
cursor.close()
except :
self.db.rollback()
traceback.print_exc()
return maxnum

def Insert_SSQ(self, data_dict):
''' 插入双色球数据 '''
self.OpenDB()
num = 0
#求num的数量
sql_1 = "select count(id) from SSQ"
try:
cursor = self.db.cursor()
cursor.execute(sql_1)
ret1 = cursor.fetchone()
num = ret1[0]#返回为tupple
cursor.close()
except :
self.db.rollback()
traceback.print_exc()
#排除相同内容:查看是否相同,相同则不插入(日期和标题)
if(num>0):
cursor = self.db.cursor()
sql_2 = 'select * from SSQ where t1=%d and t2=%d and t3=%d and t4=%d and t5=%d and t6=%d and t7=%d '%(data_dict['t1'],data_dict['t2'],data_dict['t3'],data_dict['t4'],data_dict['t5'],data_dict['t6'],data_dict['t7'])
cursor.execute(sql_2)
ret2 = cursor.fetchall()
cursor.close()
if(len(ret2)>0):
print('该数据已经存在!')
return
num += 1
#插入数据
sql_3 = "INSERT INTO SSQ(id,t1,t2,t3,t4,t5,t6,t7) \
VALUES (%d,%d,%d,%d,%d,%d,%d,%d)"%(num,data_dict['t1'],data_dict['t2'],data_dict['t3'],data_dict['t4'],data_dict['t5'],data_dict['t6'],data_dict['t7'])
try:
# 执行sql语句
cursor = self.db.cursor()
cursor.execute(sql_3)
cursor.close()
# 提交到数据库执行
self.db.commit()
except:
# 发生错误时回滚
print(data_dict)
self.db.rollback()
traceback.print_exc()
self.CloseDB()

def Insert_SSQ2(self, data_dict):
''' 插入双色球数据
从最大num+1处开始插入
'''
sql_3 = "INSERT INTO SSQ(id,t1,t2,t3,t4,t5,t6,t7) \
VALUES (%d,%d,%d,%d,%d,%d,%d,%d)"%(data_dict['id'],data_dict['t1'],data_dict['t2'],data_dict['t3'],data_dict['t4'],data_dict['t5'],data_dict['t6'],data_dict['t7'])
try:
# 执行sql语句
cursor = self.db.cursor()
cursor.execute(sql_3)
cursor.close()
# 提交到数据库执行
self.db.commit()
except:
# 发生错误时回滚
print(data_dict)
self.db.rollback()
traceback.print_exc()

def GetAllSSQ_ToSQL():
count=0
sqltmp = MysqlClass()
sqltmp.OpenDB()

maxnum = sqltmp.GetMaxId()

for i1 in range(1,29):
for i2 in range(i1+1,30):
for i3 in range(i2+1,31):
for i4 in range(i3+1,32):
for i5 in range(i4+1,33):
for i6 in range(i5+1,34):
for i7 in range(1,17):
count+=1
if(count<=maxnum):
continue
ssq_dict={'id':count,'t1':i1,'t2':i2,'t3':i3,'t4':i4,'t5':i5,'t6':i6,'t7':i7}
sqltmp.Insert_SSQ2(ssq_dict)
sqltmp.CloseDB()
print("All SSQ:",count)

if __name__ == '__main__':
print('MySqlDBHelper!\n')
temp = MysqlClass()

######1、显示版本号
#temp.ShowVersion()
######1、end

######2
GetAllSSQ_ToSQL()
######2 end

3、说明

本代码当前测试环境为python3.5,MySQL 5.7.13