2023.12.30 pymysql操作

目录

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】修复 Linux 错误 - 打开文件过多

修复 Linux 错误 - 打开文件过多 在使用 Linux 操作系统时,有时会遇到一个常见的错误 - "打开文件过多"。这个错误通常发生在一个进程打开了太多的文件描述符,超过了系统的限制。本文将介绍如何识别和修复这个问题。 识别问题 要识别是否出现了"打开文件过…

什么是 JavaScript 中的生成器

JavaScript中的生成器代码是一种特殊的函数,它可以生成迭代器对象。生成器代码通过使用yield关键字来指示生成器的状态。每次调用生成器函数时,它都会返回一个迭代器对象,该对象可以用于以惰性的方式逐步产生值。 生成器代码的语法类似于普通…

Vue: 事件修饰符, 键盘事件, 鼠标事件,计算属性

目录 事件修饰符 阻止默认事件 阻止冒泡 允许触发一次 捕获模式 self passive 键盘事件 keyup & keydown 按键别名 注意tab 注意系统按键 自定义按键 鼠标事件 简介 鼠标焦点事件 计算属性 差值语法实现 methods实现 computed实现 get() set() 总…

2023-12-18 LeetCode每日一题(寻找峰值)

2023-12-18每日一题 一、题目编号 162. 寻找峰值二、题目链接 点击跳转到题目位置 三、题目描述 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返…

acwing 离散化

AcWing 802. 区间和 离散化就是使用更少的下标来表示一部份数// 例如:1,3,5 // 离散化前:0,1,2,3,4,5 // 离散化后:0,1,2注意去重方法…

信号与线性系统翻转课堂笔记19——连续/离散系统的零极点与稳定性

信号与线性系统翻转课堂笔记19——连续/离散系统的零极点与稳定性 The Flipped Classroom19 of Signals and Linear Systems 对应教材:《信号与线性系统分析(第五版)》高等教育出版社,吴大正著 一、要点 (1&#x…

解决IDEA上传Git 带有本地编译文件问题

IDEA 版本控制推送代码问题 IDEA开发过程中,使用版本控制Git、Svn或其他版本管理工具提交代码到远程经常遇到一些不重要的文件。这些文件是本地的文件,不需要上传,这个时候就需要通过设置,来改变。 问题解决 在IDEA通过设置&…

旁挂二层隧道转发小实验

WLAN配置 旁挂二层隧道转发 1.基础配置: SW1: system-view vlan batch 100 to 101interface GigabitEthernet 0/0/1 port link-type trunk port trunk pvid vlan 100 //打上管理VLAN的100标签 port trunk allow-pass vlan 100 101interface GigabitEthernet 0/…

Apollo自动驾驶:从概念到现实的里程碑

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. Apollo Client2. Apollo Server3. Apollo Federation4. Apollo Tracing5. Apollo Codegen6. Apollo Link7. 其他工具和框架结论 🚀&#x1f…

Spring整合drools

1 Spring简单整合Drools 在项目中使用Drools时往往会跟Spring整合来使用。具体整合步骤如下&#xff1a; 第一步&#xff1a;创建maven工程drools_spring并配置pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven…

Android 13 自动旋转屏幕 重启后关闭的问题

介绍 近期在Android 13 上发现当打开自动旋转屏幕后关机&#xff0c;重新启动后自动旋转屏幕关闭了 修改 路径&#xff1a;vendor/mediatek/proprietary/frameworks/base/settingsprovider/java/com/mediatek/provider/MtkSettingsExt.java public static final String ACCEL…

Windows10系统的音频不可用,使用疑难解答后提示【 一个或多个音频服务未运行】

一、问题描述 打开电脑&#xff0c;发现电脑右下角的音频图标显示为X&#xff08;即不可用&#xff0c;无法播放声音&#xff09;&#xff0c;使用音频自带的【声音问题疑难解答】&#xff08;选中音频图标&#xff0c;点击鼠标右键&#xff0c;然后选择“声音问题疑难解答(T)”…

英飞凌TC3xx之一起认识GTM系列(五)如何实现GTM与DSADC关联的配置

英飞凌TC3xx之一起认识GTM系列(五)如何实现GTM与DSADC关联的配置 1 GTM与DSADC的连接1.1 EDSADC 到 GTM 的连接1.1.1 工作原理说明1.1.2 应用举例1.2 GTM 到 EDSADC 的连接1.2.1 工作原理说明1.2.2 应用举例2 总结编者按:笔者在从事这部分开发工作的时候,看着手册上的各种通…

17-网络安全框架及模型-信息流模型(FM)

目录 信息流模型&#xff08;FM&#xff09; 1 背景概述 2 基本概念 3 基本原理 4 应用领域 5 信息流分析方法 6 优势和局限性 7 应用场景 8 挑战和机遇 信息流模型&#xff08;FM&#xff09; 1 背景概述 在当今数字化时代&#xff0c;信息的传输和交换变得越来越重…

Git 常用命令知识笔记

Git 仓库数据结构 Git 仓库由一个个的 commit 组成某些 commit 上会有一些 branch 指向它们&#xff0c;这些 branch 的本质是引用有一个特殊的引用叫做 HEAD&#xff0c;它始终指向当前的位置&#xff0c;这个位置可以是 commit&#xff0c;也可以是 branch staging area 暂存…

学习记录——BiSeNet V2

BiSeNet V2: Bilateral Network with Guided Aggregation for Real-time Semantic Segmentation BiSeNet V2:基于引导聚合的双边网络实时语义分割 摘要在语义分割中,低级细节和高级语义都是必不可少的。然而,为了加快模型推理的速度,目前的方法几乎总是牺牲底层的细节,这导…

基于时空的Ramsar湿地自动淹没映射利用Google Earth Engine

题目:Spatiotemporal‑based automated inundation mapping of Ramsar wetlands using Google Earth Engine 期刊:Scientific Reports 第一作者:Manish KumarGoyal 发表单位:University of Nebraska 发表日期:2023年 1. 摘要 研究背景:湿地是生态系统中最关键的组成…

ctfshow 新手必刷菜狗杯 谜之栅栏题解记录

知识点&#xff1a;图片比较 拿到之后&#xff0c;有两个图片&#xff0c;直观看不出什么&#xff0c;尝试用工具比较。 用010editor打开其中一个&#xff0c;010editor的工具里面就有比较文件选项&#xff0c;比较两个文件&#xff0c;发现有一处不同。题目说栅栏&#xff0c…

八股文打卡day16——计算机网络(16)

面试题&#xff1a;TCP连接是如何确保可靠性的&#xff1f; 我的回答&#xff1a; 1.数据分块控制。应用数据被分成被认为最适合传输的数据块大小&#xff0c;再发送到传输层&#xff0c;数据块被称为数据报文段或数据段。 2.序列号和确认应答。TCP为每一个数据包分配了一个序…

【Vulnhub 靶场】【Looz: 1】【简单】【20210802】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/looz-1,732/ 靶场下载&#xff1a;https://download.vulnhub.com/looz/Looz.zip 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年08月02日 文件大小&#xff1a;2.1 GB 靶场作者&#xff1a;mhz_cyber &…