1、整理今天所学的知识点
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
1.类的封装
import pymysql
class MysqlHelper:
"""pymysql助手类"""
def __init__(self, host, database, user, password, port=3306, charset='utf8'):
"""初始化参数"""
self.host = host
self.port = port
self.database = database
self.user = user
self.password = password
self.charset = charset
def connect(self):
"""初始化连接对象和执行对象"""
self.conn = pymysql.connect(host=self.host, port=self.port,
database=self.database, user=self.user,
password=self.password,
charset=self.charset)
self.cursor = self.conn.cursor()
def close(self):
"""关闭"""
self.cursor.close()
self.conn.close()
def select_one(self, sql, params=[]):
"""查询单个"""
result = None
try:
self.connect()
self.cursor.execute(sql, params)
result = self.cursor.fetchone()
print(result)
self.close()
except Exception as e:
print('error',e)
return result
def select_all(self, sql, params=[]):
"""查询多个"""
result = ()
try:
self.connect()
self.cursor.execute(sql, params)
result = self.cursor.fetchall()
self.close()
except Exception as e:
print(e)
return result
def __edit(self, sql, params):
"""增删改"""
count = 0
try:
self.connect()
count = self.cursor.execute(sql, params)
self.conn.commit()
self.close()
except Exception as e:
print(e)
return count
def insert(self, sql, params=None):
"""新增"""
return self.__edit(sql, params)
def update(self, sql, params=None):
"""修改"""
return self.__edit(sql, params)
def delete(self, sql, params=None):
"""删除"""
return self.__edit(sql, params)
def f1():
# 1、创建对象
helper = MysqlHelper(host='192.168.0.138', user='root', password='root', database='mydb')
# 2、调用功能:查询
ret = helper.select_one('select * from student where id=%s', [1])
print(ret)
def f2():
# 1、创建对象
helper = MysqlHelper(host='192.168.0.138', user='root', password='root', database='mydb')
# 2、调用功能:删除
ret = helper.delete('delete from student')
print(ret)
def f3():
# 1、创建对象
helper = MysqlHelper(host='192.168.0.138', user='root', password='root', database='mydb')
# 2、调用功能:删除
ret = helper.insert('insert into student(name,pwd,hiredate,addres) VALUE ("laowang","123456","1996-10-28","uu")')
print(ret)
def f4():
# 1、创建对象
helper = MysqlHelper(host='192.168.0.138', user='root', password='root', database='mydb')
# 2、调用功能:查询
ret = helper.select_all('select * from student')
for row in ret:
print(row)
def f5():
# 1、创建对象
helper = MysqlHelper(host='192.168.0.138', user='root', password='root', database='mydb')
# 2、调用功能:查询
ret = helper.update('update student set name = "小明" where id = 1')
print(ret)
if __name__ == '__main__':
f1()
# f2()
# f3()
# f4()
# f5()
、、、、、、、、、、、、、、、、、、、、、、、、、
2.加密
• 注意:需要对密码进行加密
• 如果使用md5加密,则密码包含32个字符
• 如果使用sha1加密,则密码包含40个字符,这里使用这种方式
、、、md5加密方式:
import hashlib
pwd = '123456'
my_md5 = hashlib.md5()
my_md5.update(pwd.encode('utf-8'))
print(my_md5.hexdigest())
sha1加密方式:
import hashlib
pwd = '123456'
my_sha1 = hashlib.sha1(pwd.encode('utf-8'))
print(my_sha1.hexdigest())
创建表
create table userinfos(
id int primary key auto_increment,
uname varchar(20),
upwd char(40),
isdelete bit default 0
);
加入测试数据
• 插入如下数据,用户名为123,密码为123,这是sha1加密后的值
insert into userinfos values(0,'123','40bd001563085fc35165329ea1ff5c5ecbdbbeef',0);
接收输入并验证
• 创建testLogin.py文件,引入hashlib模块、MysqlHelper模块
• 接收输入
• 根据用户名查询,如果未查到则提示用户名不存在
• 如果查到则匹配密码是否相等,如果相等则提示登录成功
• 如果不相等则提示密码错误
#encoding=utf-8
from MysqlHelper import MysqlHelper
from hashlib import sha1
sname=input("请输入用户名:")
spwd=input("请输入密码:")
s1=sha1()
s1.update(spwd)
spwdSha1=s1.hexdigest()
sql="select upwd from userinfos where uname=%s"
params=[sname]
sqlhelper=MysqlHelper('localhost',3306,'test1','root','mysql')
userinfo=sqlhelper.get_one(sql,params)
if userinfo==None:
print('用户名错误')
elif userinfo[0]==spwdSha1:
print('登录成功')
else:
print('密码错误')
、、、、、、、、、、、、、、、、、、、、、、、、、、、、
3.系统变量和会话变量
系统变量:系统内部定义的变量,系统变量针对所有用户(MySQL客户端)有效。
查看系统所有变量:show variables [like ‘pattern’];
会话变量:会话变量也称之为用户变量,会话变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
4.判断、循环和函数
基本语法
If在Mysql中有两种基本用法
1、 用在select查询当中,当做一种条件来进行判断
基本语法:if(条件,为真结果,为假结果)
2、 用在复杂的语句块中(函数/存储过程/触发器)
基本语法
If 条件表达式 then
满足条件要执行的语句;
End if;
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
复合语法
复合语法:代码的判断存在两面性,两面都有对应的代码执行。
基本语法:
If 条件表达式 then
满足条件要执行的语句;
Else
不满足条件要执行的语句;
//如果还有其他分支(细分),可以在里面再使用if
If 条件表达式 then
//满足要执行的语句
End if;
End if;
、、、、、、、、、、、、、、、、、、、、、、、、、、
While循环
基本语法
循环体都是需要在大型代码块中使用
基本语法
While 条件 do
要循环执行的代码;
End while;
结构标识符
结构标识符:为某些特定的结构进行命名,然后为的是在某些地方使用名字
基本语法
标识名字:While 条件 do
循环体
End while [标识名字];
标识符的存在主要是为了循环体中使用循环控制。在mysql中没有continue和break,有自己的关键字替代:
Iterate:迭代,就是以下的代码不执行,重新开始循环(continue)
Leave:离开,整个循环终止(break)
标识名字:While 条件 do
If 条件判断 then
循环控制;
Iterate/leave 标识名字;
End if;
循环体
End while [标识名字];
函数
在mysql中,函数分为两类:系统函数(内置函数)和自定义函数
不管是内置函数还是用户自定义函数,都是使用select 函数名(参数列表);
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
2、完成一个迷你超市系统
1、用户表(用户名,密码) 用户名唯一
2、商品表(商品名,单价,数量,进货日期)商品名唯一
3、注册功能
1、用户名非空验证
2、用户名唯一验证
3、密码非空验证
4、密码长度必须在6-10之间
5、密码加密后存入数据库
4、登陆功能
5、登陆成功后,提示用户选择功能并实现
1、查询所有商品
2、根据商品名模糊查询
3、根据价格区间查询
4、修改商品
5、删除商品
6、退出
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
import hashlib
import pymysql
from datetime import datetime
def insert_u():
"""新增学生信息"""
# 输入数据
while True:
name = input('姓名:')
ret = judge_name(name)
if ret == 1:
print('用户名不能为空,请重新输入。')
elif ret == 2:
print('用户名已存在,请重新输入。')
else:
break
while True:
pwd = input('密码:')
ret = judge_pwd(pwd)
if ret == 1:
print('密码不能为空,请重新输入。')
elif ret == 0:
if len(pwd)<6 or len(pwd)>10:
print('密码长度必须在6到10位之间')
else:
break
# 1、获取数据库连接对象
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'insert into s_user(name,pwd) values(%s,%s)'
params = [name, encryption(pwd)]
# 4、执行sql语句
my_cursor.execute(sql, params)
# 5、提交
my_conn.commit()
# 6、关闭
my_cursor.close()
my_conn.close()
print('OK')
def insert_c():
name = input('请输入商品名')
price = input('请输入商品价格')
number = input('请输入商品数量')
stock_date = input('请输入商品进货日期')
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'insert into merc(name,price,number,stock_date) values(%s,%s,%s,%s)'
params = [name,price,number,stock_date]
# 4、执行sql语句
my_cursor.execute(sql, params)
# 5、提交
my_conn.commit()
# 6、关闭
my_cursor.close()
my_conn.close()
print('OK')
def judge_name(name):
"""
判断用户名
1、非空
2、唯一
如果空 返回1
如果重复 返回2
如果合法 返回0
"""
# 判断是否为空
if name.strip() == '':
return 1
# 1、获取数据库连接对象
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'select count(*) from s_user where name = %s'
params = [name]
# 4、执行sql语句
my_cursor.execute(sql, params)
# 5、获取查询结果
row = my_cursor.fetchone()
print(row[0])
# 6、关闭
my_cursor.close()
my_conn.close()
# 7、判断
if row[0] == 0:
return 0
else:
return 2
def judge_pwd(pwd):
"""
判断密码
1、非空
如果空 返回1
如果合法 返回0
"""
# 判断是否为空
if pwd.strip() == '':
return 1
else:
return 0
def encryption(pwd):
my_md5 = hashlib.md5()
my_md5.update(pwd.encode('utf-8'))
ret = my_md5.hexdigest()
return ret
def login():
name = input('请输入用户名')
pwd = input('请输入密码')
# 1、获取数据库连接对象
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'select count(*) from s_user where name = %s and pwd = %s'
params = [name,encryption(pwd)]
# 4、执行sql语句
my_cursor.execute(sql, params)
# 5、获取查询结果
row = my_cursor.fetchone()
print(row)
if row[0]==0:
print('失败')
else:
print('成功')
def select_u():
"""查询所有学生信息"""
# 1、获取数据库连接对象
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'select * from s_user'
# 4、执行sql语句
my_cursor.execute(sql)
# 5、获取查询结果
rows = my_cursor.fetchall()
for sid, name, pwd in rows:
print(name, pwd)
# 6、关闭
my_cursor.close()
my_conn.close()
def select_c():
"""查询所有学生信息"""
# 1、获取数据库连接对象
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'select * from merc'
# 4、执行sql语句
my_cursor.execute(sql)
# 5、获取查询结果
rows = my_cursor.fetchall()
for sid, name, price ,number,stock_date in rows:
print(name, price ,number,stock_date)
# 6、关闭
my_cursor.close()
my_conn.close()
def dim(di):
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'select * from merc where name like %s'
parsm = [di]
# 4、执行sql语句
my_cursor.execute(sql,parsm)
# 5、获取查询结果
rows = my_cursor.fetchall()
for sid, name, price, number, stock_date in rows:
print(name, price, number, stock_date)
# 6、关闭
my_cursor.close()
my_conn.close()
def section(se,sec):
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'select * from merc where price BETWEEN %s and %s'
parsm = [se,sec]
# 4、执行sql语句
my_cursor.execute(sql, parsm)
# 5、获取查询结果
rows = my_cursor.fetchall()
for sid, name, price, number, stock_date in rows:
print(name, price, number, stock_date)
# 6、关闭
my_cursor.close()
my_conn.close()
def update(up,num):
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
print(up, num)
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'update merc set %s where id = %s'
parsm = [up,num]
# 4、执行sql语句
my_cursor.execute(sql,parsm)
# 5、获取查询结果
rows = my_cursor.fetchall()
for sid, name, price, number, stock_date in rows:
print(name, price, number, stock_date)
# 6、关闭
my_conn.commit()
my_cursor.close()
my_conn.close()
def delete_c(dele):
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'delete from merc where id = %s'
print(dele)
parsm = [dele]
# 4、执行sql语句
my_cursor.execute(sql,parsm)
# 5、获取查询结果
rows = my_cursor.fetchall()
for sid, name, price, number, stock_date in rows:
print(name, price, number, stock_date)
# 6、关闭
my_conn.commit()
my_cursor.close()
my_conn.close()
def delete_u(dele):
my_conn = pymysql.connect(host='192.168.0.138',
user='root', password='root',
database='mydb', port=3306,
charset='utf8')
# 2、获取执行sql的对象
my_cursor = my_conn.cursor()
# 3、准备sql语句和参数
sql = 'delete from s_user where id = %s'
print(dele)
parsm = [dele]
# 4、执行sql语句
my_cursor.execute(sql,parsm)
# 5、获取查询结果
rows = my_cursor.fetchall()
for sid, name, price, number, stock_date in rows:
print(name, price, number, stock_date)
# 6、关闭
my_conn.commit()
my_cursor.close()
my_conn.close()
if __name__ == '__main__':
while True:
choice = input('请选择数字\t\t\t\t1:新增\t2、查询所有\t3、模糊查询\t4、价格区间查询\t5、修改商品\t6、登录\t7、删除\t8、退出')
if choice == '1':
add = input('请输入要添加的:1添加用户名,2添加商品')
if add == '1':
insert_u()
elif add == '2':
insert_c()
elif choice == '2':
cho = input('请输入你要查询的:1查询用户,2查询商品')
if cho =='1':
select_u()
elif cho=='2':
select_c()
elif choice == '3':
dim('%花%')
elif choice == '4':
section(1,100)
elif choice == '5':
update('price="17"',5)
elif choice =='6':
login()
elif choice =='7':
dee = input("请输入你要删除的:1代表用户,2代表商品")
if dee == '1':
delete_u(1)
elif dee == '2':
delete_c(1)
elif choice =='8':
break
else:
continue