目录
1.Pymysql
1.1连接pymysql
1.2 查询数据
1.3增删改操作
2. Pymysql数据库练习
2.1 代码实现
3.数据库练习2
假设之前已有用户登录的方法,但是该方法没有记录日志。现在想通过装饰器来增强原有功能
1.Pymysql
总结:
fetchall(): 获取所有查询到的内容。返回结果是嵌套的元组
fetchone(): 获取一条数据。返回结果就是一个非嵌套的元组
fetchmany(num): 返回结果是元组嵌套,底层也是有游标的。如果不传递参数num,默认读取一条数据
注意: 与文件读取类似,读取查询的数据内容的时候,底层有个游标。你读取到了什么地方,就会移动到那个地方。后续会接着从那个地方开始读
注意: execute的结果,代表的是影响的行数,并不是满足条件的数据条数
1.1连接pymysql
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()
1.2 查询数据
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() # 关闭连接
1.3增删改操作
import pymysqltry:# 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()
2. Pymysql数据库练习
需求:模拟用户登录网站。获取用户键盘输入的用户名和密码,先在用户数据库中检查输入信息是否匹配。如果登录成功,在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;
2.1 代码实现
"""需求:模拟用户登录网站。获取用户键盘输入的用户名和密码,先在用户数据库中检查输入信息是否匹配。如果登录成功,在MySQL的日志表中记录一条信息:某某某,什么时候登录了网站需求拆解:1- 获取用户键盘输入的用户名和密码2- 拿着用户输入的信息,去数据库查找相关内容select count(1) as cnt from user_info where username='' and password='';3- 如果查找到了对应数据:登录成功。也就是第二步的cnt=14- 如果查找不到对应的数据:登录失败,也就是第二步的cnt=05- 如果找到了,就在日志表中增加一条日志记录
"""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 = 0print("登录失败")
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()
3.数据库练习2
假设之前已有用户登录的方法,但是该方法没有记录日志。现在想通过装饰器来增强原有功能
原有登录方法如下:
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 = 0print("登录失败")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 resultreturn 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==1log_result = user_login(username,password)
print("登录结果:",log_result)