目录
假设之前已有用户登录的方法,但是该方法没有记录日志。现在想通过装饰器来增强原有功能
总结:
fetchall(): 获取所有查询到的内容。返回结果是嵌套的元组
fetchone(): 获取一条数据。返回结果就是一个非嵌套的元组
fetchmany(num): 返回结果是元组嵌套,底层也是有游标的。如果不传递参数num,默认读取一条数据
注意: 与文件读取类似,读取查询的数据内容的时候,底层有个游标。你读取到了什么地方,就会移动到那个地方。后续会接着从那个地方开始读
注意: execute的结果,代表的是影响的行数,并不是满足条件的数据条数
import pymysql
# 1 创建连接
conn = pymysql.connect(
host='127.0.0.1',port=3306,
user='root',password='xxxxxx',
charset='utf8'
)
# 2 通过连接创建游标
cur = conn.cursor()
# 3 通过游标来执行sql语句
select_sql = 'select * from bi_db.daily_all_pf_orders'
result = cur.execute(select_sql)
print(result)
# 提交事务
conn.commit()
# 4 关闭游标
cur.close()
# 5 关闭连接
conn.close()
import pymysql
# 建立与数据库的连接
conn1 = pymysql.connect(
host='192.168.88.100',
port=3306,
user='root',
password='123456',
db='shopnc_db'
)
conn2 = pymysql.connect(
host='192.168.88.100',
port=3306,
user='root',
password='123456',
db='bi_db'
)
# 2.创建游标对象
c1 = conn1.cursor()
# 3.编写sql语句
sql = "select * from shopnc_db.product"
# 4.执行sql语句
c1.execute(sql)
# 5.获取结果集
result = c1.fetchall() #获取所有结果集
print(result)
# 6.关闭连接
conn1.close() # 关闭连接
import pymysql
try:
# 1 获取连接
# conn实际上是全局变量,而不是局部变量
conn = pymysql.connect(
host='127.0.0.1',port=3306,database='stu_test',
user='root',password='xxxxxxx',charset='utf8'
)
# 2 通过连接创建游标
cur = conn.cursor()
# 开启事务
conn.begin()
# 3 执行sql语句
#
sql = 'alter table stu1 change class CLASS varchar(255)'
result = cur.execute(sql)
print(result)
conn.commit()
except Exception as e:
conn.rollback()
print(e)
finally:
# 4- 关闭游标
cur.close()
# 5- 关闭连接
conn.close()
需求:模拟用户登录网站。获取用户键盘输入的用户名和密码,先在用户数据库中检查输入信息是否匹配。如果登录成功,在MySQL的日志表中记录一条信息:某某某,什么时候登录了网站
1- 用户信息表结构如下
create table day08.user_info(
?? ?id int NOT NULL AUTO_INCREMENT,
?? ?username varchar(20),
?? ?password varchar(20),
? ? PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 添加样例数据:
insert into day08.user_info(username,password) values('张三','123');?
insert into day08.user_info(username,password) values('李四','456');?
?????????2- 日志表结构如下
?create table day08.web_log(
?? ?id int NOT NULL AUTO_INCREMENT,
?? ?username varchar(20),
? ? login_time datetime,
? ? PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
"""
需求:模拟用户登录网站。获取用户键盘输入的用户名和密码,先在用户数据库中检查输入信息是否匹配。如果登录成功,在MySQL的日志表中记录一条信息:某某某,什么时候登录了网站
需求拆解:
1- 获取用户键盘输入的用户名和密码
2- 拿着用户输入的信息,去数据库查找相关内容
select count(1) as cnt from user_info where username='' and password='';
3- 如果查找到了对应数据:登录成功。也就是第二步的cnt=1
4- 如果查找不到对应的数据:登录失败,也就是第二步的cnt=0
5- 如果找到了,就在日志表中增加一条日志记录
"""
import pymysql
# 1 - 获取用户键盘输入的用户名和密码
username = input("请输入用户名:")
password = input("请输入密码:")
# 2 - 拿着用户输入的信息,去数据库查找相关内容
# 2.1- 获取数据库连接
conn = pymysql.connect(host='192.168.88.161',port=3306,database='day08',user='root',password='123456',charset='utf8')
# 2.2- 通过连接获取游标
cur = conn.cursor()
# 2.3- 执行查询SQL语句
query_user_sql = f'select count(1) as cnt from user_info where username="{username}" and password="{password}"'
# print(query_user_sql)
# 注意:execute的结果,代表的是影响的行数,并不是满足条件的数据条数
result = cur.execute(query_user_sql)
# 通过游标获取具体的数据条数
user_num_tup = cur.fetchall()
user_num = user_num_tup[0][0]
if user_num==0:
# 3 - 如果查找不到对应的数据:登录失败,也就是第二步的cnt = 0
print("登录失败")
else:
# 4 - 如果查找到了对应数据:登录成功。也就是第二步的cnt = 1
# 5 - 如果找到了,就在日志表中增加一条日志记录
insert_sql = f"insert into web_log (username,login_time) values ('{username}',current_time())"
cur.execute(insert_sql)
# 手动提交事务
conn.commit()
# 2.4- 关闭游标
cur.close()
# 2.5- 关闭连接
conn.close()
?原有登录方法如下:
def user_login(username,password):
sql = f'select count(1) as cnt from user_info where username="{username}" and password="{password}"'
result = cur.execute(sql)
user_num_tup = cur.fetchall()
user_num = user_num_tup[0][0]
return user_num==1
增强后的代码:
import pymysql
# 1 - 获取用户键盘输入的用户名和密码
username = input("请输入用户名:")
password = input("请输入密码:")
# 2 - 拿着用户输入的信息,去数据库查找相关内容
# 2.1- 获取数据库连接
conn = pymysql.connect(host='192.168.88.161',port=3306,database='day08',user='root',password='123456',charset='utf8')
# 2.2- 通过连接获取游标
cur = conn.cursor()
# 定义日志记录的装饰器
def log(func):
def wrapper(username,password):
result = func(username,password)
if not result:
# 3 - 如果查找不到对应的数据:登录失败,也就是第二步的cnt = 0
print("登录失败")
else:
# 4 - 如果查找到了对应数据:登录成功。也就是第二步的cnt = 1
# 5 - 如果找到了,就在日志表中增加一条日志记录
insert_sql = f"insert into web_log (username,login_time) values ('{username}',current_time())"
cur.execute(insert_sql)
# 手动提交事务
conn.commit()
return result
return wrapper
@log
def user_login(username,password):
"""
用来判断用户是否登录成功
:param username: 用户名
:param password: 密码
:return: True:登录成功;False:登录失败
"""
# 2.3- 执行查询SQL语句
sql = f'select count(1) as cnt from user_info where username="{username}" and password="{password}"'
# print(sql)
# 注意:execute的结果,代表的是影响的行数,并不是满足条件的数据条数
result = cur.execute(sql)
# 通过游标获取具体的数据条数
user_num_tup = cur.fetchall()
user_num = user_num_tup[0][0]
return user_num==1
log_result = user_login(username,password)
print("登录结果:",log_result)