问题描述: 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券),并将生成的激活码保存到MySQL数据库中?
需求分析:
- 需求同《Python读书笔记-每日篇-20190219|激活码生成器》
- 激活码存储在MySQL数据库中
代码编写:
编写数据库存储接口mydb.py
#! /usr/bin/env python3
# Filename: db.py
# -*- coding:utf-8 -*-
mydb_conf ={"HOST":"192.168.9.130",
'USER':"root",
"PASSWD":"china",
"SCHEMA":"python_daily"
}
gift_table = """CREATE TABLE IF NOT EXISTS gift(
serial varchar(128) not null,
used tinyint(1) default 0,
primary key (serial)
)engine =innodb"""
import pymysql
class mysql_api(object):
#数据里配置文件
mydb_conf = ''
db_conn = ''
def __init__(self, mydb_conf):
self.mydb_conf = mydb_conf
try:
self.db_conn = pymysql.connect(mydb_conf['HOST'],mydb_conf['USER'],mydb_conf['PASSWD'])
except:
print("数据库连接失败:%s"%repr(self.mydb_conf))
raise
self.__table_check()
def __table_check(self):
mycursor = self.db_conn.cursor()
try:
#检查数据库是否存在
mycursor.execute(f'{"create database if not exists "}{self.mydb_conf["SCHEMA"]}')
#选择数据库
self.db_conn.select_db(self.mydb_conf['SCHEMA'])
#检查表格是否存在
mycursor.execute(gift_table)
except Exception as e:
print('Error to create database or table:',e)
finally:
mycursor.close()
def insert_serial(self,serials):
if len(serials) ==0:
return
insert_serial = "insert into gift (serial) values(%s)"
mycursor = self.db_conn.cursor()
try:
mycursor.executemany(insert_serial,serials)
assert mycursor.rowcount ==len(serials),f'{"insert num:"}{mycursor.rowcount}'
self.db_conn.commit()
except Exception as e:
self.db_conn.rollback()
print(f'{"insert table error:"}{insert_serial}',"\n",e)
finally:
mycursor.close()
def query_serial(self,serial):
mycursor = self.db_conn.cursor()
query = "select count(1) from gift where serial ='%s'"%serial
try:
mycursor.execute(query)
except Exception as e:
print('db query error!\n',e)
return False
else:
rs = mycursor.fetchone()
return rs[0] > 0
finally:
mycursor.close()
def close_conn(self):
self.db_conn.close()
if __name__ == "__main__":
mydb = mysql_api(mydb_conf)
serials = [1,2,3]
mydb.insert_serial(serials)
print(mydb.query_serial(1))
mydb.close_conn()
产生需要的激活码generater2.py
#! /usr/bin/env python3
# Filename : generator.py
import string,random
from com.lreis.daily import mydb
from com.lreis.random.random_test import rand
#产生随机码的域
field = string.ascii_letters + string.digits
class generator(object):
#激活码
data = []
#本次激活码需要数量
need_num = 0
#本次激活码生成数量
cur_num = 0
#激活码长度需求
length = 0
def __init__(self, length =16,need_num=100):
self.length = length
self.need_num = need_num
def generate(self):
mysql_db = mydb.mysql_api(mydb.mydb_conf)
while self.cur_num < self.need_num:
#生成一个随机码
rand = self.__get_one()
if mysql_db.query_serial(rand):
continue
self.data.append(rand)
self.cur_num +=1
mysql_db.insert_serial(self.data)
return self.data
def __get_one(self):
rand = ''.join(random.sample(field,self.length))
while(rand in self.data):
rand = random.sample(field,self.length)
if __name__ == "__main__":
print("[激活码]=>%s"%(str(rand)))
return rand
if __name__ == "__main__":
generator = generator()
#生成100个激活码
datas = generator.generate()
print(datas)