Description
- Yixiaohan/show-me-the-code 第0001题 && 第0002题
- 0001 :作为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?
- 0002 :将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。
Notes
这个小项目中涉及随机字符串的形成,以及用python连接MySQL的内容。几个知识点:
random模块的使用
- random.randint(range)随机返回range范围内的一个int
- random.choice(list)从list当中随意返回一项
其他random模块相关知识可以参看Python中的random模块。
用python连接MySQL
为了用python连接MySQL,首先要下载安装MySQL Server,并安装python相关的模块。推荐安装MySQL Workbench,为MySQL提供了图形界面。相关教程可以参阅Python Programming Tutorial - 48: Install MySql Connector for Python。不得不说一句,youtube真是好啊。这几天从python到matlab再到MySQL,都是靠油管上面的教程才得以快速入门。个人而言,这种方法比自己吭哧吭哧地看官方手册不知道快到哪里去,爽到飞起。
在这里简单总结一下这个小项目中用到的相关知识:
首先要连接到数据库,使用mysql.connector模块的connect()函数,参数如下所示:
conn = mysql.connector.connect(user = "root", password = "", host = "localhost", database = "Python")
以上语句执行结果是连接到本地的Python数据库(自己之前建好的,当然也可以在此项目中现建一个)。连接到数据库后,“创建”操作游标
cursor = conn.cursor()
在python上需要通过操作游标来真正执行对数据库的操作,如CREATE TABLE, TRUNCATE TABLE, SELECT等。
cursor.execute("USE Python")
通过cursor的execute()函数真正执行MySQL操作。执行execute()函数之后并不能立即看到执行结果,需要通过fetchAll()函数接收所有的返回行。
lists = cursor.fetchall()
和MySQL相关的一点知识。这个项目中的数据库结构是Python数据库中有一个activation_code表,表中有ID和ACTIVATION_CODE两项。
如果某个值被设为是AUTO_INCREMENT,比如这个项目中的ID,那么这个值被设为NULL时,会自动从1往后排。指定某个值后,如果不重复,那么会从这个指定值往后排。0似乎和NULL 有相同功效。详情参看MySQLJIAOCHENG .
执行对所有项执行DELETE操作之后,如果再次插入,那么ID仍然会从上次的最大值往后续。只有在全表删除操作之后才会从1开始。
cursor.execute("TRUNCATE TABLE activation_code") # 全表删除
python中带参数的字符串
可以参考代码中的法1和法2。
My Code
# -*- coding:utf-8 -*-
"""
* 0001
&& 0002
* by VegB
# 问题: 没有检查生成的ACTIVATION_CODE是否有重复
* 2017/1/25
"""
import random
import mysql.connector
def createRandomString(len):
raw = ""
range1 = range(58, 65) # between 0~9 and A~Z
range2 = range(91, 97) # between A~Z and a~z
i = 0
while i < len:
seed = random.randint(48, 122)
if ((seed in range1) or (seed in range2)):
continue;
raw += chr(seed);
i += 1
# print(raw)
return raw
# 连接到数据库
conn = mysql.connector.connect(user = "root", password = "", host = "localhost", database = "Python")
cursor = conn.cursor() # 用来获得python执行Mysql命令的方法,操作游标
# cursor.execute("USE Python") # 真正执行MySQL语句,之前连接的时候已经指定是Python这个database了,这里就不用再说了
cursor.execute("TRUNCATE TABLE activation_code") # 全表删除
for i in range(0, 10):
rtn = createRandomString(10)
# 法1:
# cursor.execute("""INSERT INTO activation_code VALUE(%s, %s)""", (0, rtn)) # 插入变量的方法和scanf差不多
# 法2:
cmd = "INSERT INTO activation_code VALUE(ID = NULL, %(ACTIVATION_CODE)s)"
cursor.execute(cmd, {'ACTIVATION_CODE': rtn})
# 注意这个地方,因为activation_code中的ID设置的是AUTO_INCREMENT,所以会自动生成ID,这里就写上ID = NULL就行了
conn.commit()
cursor.execute("SELECT * from activation_code")
lists = cursor.fetchall() # fetchall()接收全部的返回结果行
for list in lists:
print(list)
conn.close()
Result
生成的10个激活码如下所示:
再来看看数据库中的情况:
可以看到数据库中成功存入了这十个激活码~开心!