0%

Python练习册:0002

========================

题目

    将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。

分析

这里考察的是对数据库的基本操作,这里使用PyMySQL库。

pip install pymysql

准备

  • 目前Linux 的Mysql软件为MariaDB,它是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。以Arch Linux下安装MariaDB数据库为例:
1
2
3
4
sudo pacman -S mariadb #安装
sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql #初始化mysql库
sudo systemctl start mariadb #启动MariaDB数据库
mysql -u root mysql #用root用户登录到mysql数据库,默认密码为空。

关于Mysql的常用操作可参见

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 生成激活码的函数
import uuid
def Generate_Code(counts,length=20):
key_list = []

for i in range(counts):
key = str(uuid.uuid4())[:length]
if key not in key_list:
key_list.append(key)

return key_list

import pymysql

if __name__ == "__main__":

key = Generate_Code(200,20)

#创建数据库连接
conn = pymysql.connect(
host = "127.0.0.1",
user = "root",
password = "",
database = "test",
charset = 'utf8',
cursorclass=pymysql.cursors.DictCursor)

try:
#创建一个游标对象 cursor
with conn.cursor() as cursor:

#执行 SQL,如果code表存在则删除
cursor.execute("DROP TABLE IF EXISTS code")

#创建code数据表
sql = """CREATE TABLE code(
id INT UNSIGNED AUTO_INCREMENT,
code VARCHAR(32) NOT NULL,
PRIMARY KEY(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
"""
cursor.execute(sql)

#批量插入数据
cursor.executemany("INSERT INTO code(code) VALUES(%s);",key)
#提交更改
conn.commit()

with conn.cursor() as cursor:
#查询结果
cursor.execute("SELECT * FROM code;")
print( cursor.fetchall() )

finally:
conn.close()

扩展

日常写个小玩具可以用更轻量级的SQLite3,它是一个小巧的储存在本地的数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

import uuid
def Generate_Code(counts,length=20):
key_list = []

for i in range(counts):
key = str(uuid.uuid4())[:length]
if key not in key_list:
#sqlite3 需要的[('afsd'),('feaf'),('fasd')]形式的数据
key_list.append( (key,))

return key_list
key = Generate_Code(200,20)


import sqlite3

#连接到数据库,并创建游标
conn = sqlite3.connect("test.db")
c = conn.cursor()

#如果KEY表已经存在则先删除
#c.execute("DROP TABLE IF EXISTS KEY;")

#创建KEY表
sql = """CREATE TABLE KEY(
ID INTEGER PRIMARY KEY autoincrement,
CODE TEXT NOT NULL
);"""
c.execute(sql)

#批量插入数据
c.executemany("INSERT INTO KEY VALUES(NULL,?);",key)

#更新数据库
conn.commit()

#查询KEY表内容
c.execute("SELECT * FROM KEY;")
print( c.fetchall() )

#关闭
c.close()
conn.close()

参考

欢迎关注我的其它发布渠道