Python读书笔记-每日篇-20190221|激活码生成器(mysql存储)

问题描述: 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券),并将生成的激活码保存到MySQL数据库中?

需求分析:

  1. 需求同《Python读书笔记-每日篇-20190219|激活码生成器
  2. 激活码存储在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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值