【Python学习笔记】第二十五节 Python MySQL
Python 连接到 MySQL 数据库有几种不同的连接方法,而且不是所有的方法都能与不同的操作系统很好地配合.
MySQL connector/Python模块是Oracle支持的官方驱动,用于通过Python连接MySQL。该连接器完全是Python语言,而mysqlclient是用C语言编写的。它也是独立的,意味着它不需要MySQL客户端库或标准库以外的任何Python模块。
注意,MySQL Connector/Python不支持旧的MySQL服务器认证方法,这意味着4.1之前的MySQL版本不能工作。
本文实例的运行环境:
Windows 10
MySQL 8.0
一、创建数据库连接
1、首先安装mysql-connector-python模块。
python -m pip install mysql-connector
2、连接数据库:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root" # 数据库密码
)print(mydb)
运行结果
<mysql.connector.connection.MySQLConnection object at 0x000002B399503AC0>二、创建数据库
1、创建数据库使用 "CREATE DATABASE" 语句,以下创建一个名为 python_demo 的数据库:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root" # 数据库密码
)print(mydb)myCursor = mydb.cursor()myCursor.execute("CREATE DATABASE python_demo")

2、使用 "SHOW DATABASES" 语句来查看数据库是否存在:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root" # 数据库密码
)print(mydb)myCursor = mydb.cursor()# myCursor.execute("CREATE DATABASE python_demo")
myCursor.execute("SHOW DATABASES")for x in myCursor:print(x)

我们可以直接连接数据库,如果数据库不存在,会输出错误信息:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)print(mydb)三、创建数据表
创建数据表使用 "CREATE TABLE" 语句,创建数据表前,需要确保数据库已存在,以下创建一个名为 user 自增主键的数据表:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)# print(mydb)myCursor = mydb.cursor()
myCursor.execute("CREATE TABLE user (id int(11) primary key not null auto_increment,name VARCHAR(64), mobile VARCHAR(32), address VARCHAR(255))")

如果我们的表已经创建,我们需要使用 ALTER TABLE 来给表添加主键:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)# print(mydb)myCursor = mydb.cursor()
myCursor.execute("ALTER TABLE user ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")四、插入数据
插入数据使用 "INSERT INTO" 语句:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)# print(mydb)myCursor = mydb.cursor()sql = "INSERT INTO user (name, mobile,address) VALUES (%s, %s, %s)"
val = ("Lily", "13866669999", "America")
myCursor.execute(sql, val)
mydb.commit() # 提交print(myCursor.rowcount, "插入成功。")

批量插入
批量插入使用 executemany() 方法,该方法的第二个参数是一个元组列表,包含了我们要插入的数据:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)# print(mydb)myCursor = mydb.cursor()sql = "INSERT INTO user (name, mobile,address) VALUES (%s, %s, %s)"
# val = ("Lily", "13866669999", "America")val = [("LiLei", "13866668888", "China"),("Jim", "13855558888", "America"),("HanMeimei", "13811113333", "China")
]
# myCursor.execute(sql, val)
myCursor.executemany(sql, val)mydb.commit() # 提交print(myCursor.rowcount, "插入成功。")
3 插入成功。
五、查询数据
1、查询数据使用 SELECT 语句:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()myCursor.execute("SELECT * FROM user")result = myCursor.fetchall() # fetchall() 获取所有记录for x in result:print(x)

读取指定的字段数据:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()# myCursor.execute("SELECT * FROM user")
myCursor.execute("SELECT name, mobile, address FROM user")
result = myCursor.fetchall() # fetchall() 获取所有记录for x in result:print(x)

读取一条数据,可以使用 fetchone() 方法:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()# myCursor.execute("SELECT * FROM user")
myCursor.execute("SELECT name, mobile, address FROM user")
# result = myCursor.fetchall() # fetchall() 获取所有记录
result = myCursor.fetchone() # fetchall() 获取一条记录
print(result)('Lily', '13866669999', 'America')2、where 条件语句
如果我们要读取指定条件的数据,可以使用 where 语句:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()# myCursor.execute("SELECT * FROM user")
myCursor.execute("SELECT * FROM user where address ='America'")
result = myCursor.fetchall() # fetchall() 获取所有记录
# result = myCursor.fetchone() # fetchall() 获取一条记录
# print(result)
for x in result:print(x)
(1, 'Lily', '13866669999', 'America')
(3, 'Jim', '13855558888', 'America')为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义查询的条件:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()
# myCursor.execute("SELECT * FROM user where address ='America'")sql = "SELECT * FROM user where address = %s"
param = ("China",)myCursor.execute(sql, param)result = myCursor.fetchall() # fetchall() 获取所有记录for x in result:print(x)
(2, 'LiLei', '13866668888', 'China')
(4, 'HanMeimei', '13811113333', 'China')3、排序
查询结果排序可以使用 ORDER BY 语句,默认的排序方式为升序,关键字为 ASC,如果要设置降序排序,可以设置关键字 DESC。
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()
# myCursor.execute("SELECT * FROM user ORDER BY name")
sql = "SELECT * FROM user ORDER BY name"
myCursor.execute(sql)
result = myCursor.fetchall() # fetchall() 获取所有记录for x in result:print(x)
(4, 'HanMeimei', '13811113333', 'China')
(3, 'Jim', '13855558888', 'America')
(2, 'LiLei', '13866668888', 'China')
(1, 'Lily', '13866669999', 'America')降序排序实例:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()
# myCursor.execute("SELECT * FROM user ORDER BY name")
sql = "SELECT * FROM user ORDER BY address DESC "
myCursor.execute(sql)
result = myCursor.fetchall() # fetchall() 获取所有记录for x in result:print(x)
(2, 'LiLei', '13866668888', 'China')
(4, 'HanMeimei', '13811113333', 'China')
(1, 'Lily', '13866669999', 'America')
(3, 'Jim', '13855558888', 'America')4、Limit
如果我们要设置查询的数据量,可以通过 "LIMIT" 语句来指定
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()
# myCursor.execute("SELECT * FROM user ORDER BY name")
sql = "SELECT * FROM user LIMIT 2 "myCursor.execute(sql)
result = myCursor.fetchall() # fetchall() 获取所有记录for x in result:print(x)
(1, 'Lily', '13866669999', 'America')
(2, 'LiLei', '13866668888', 'China')指定起始位置,使用的关键字是 OFFSET:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()
# sql = "SELECT * FROM user LIMIT 2 "
sql = "SELECT * FROM user LIMIT 2 OFFSET 1"myCursor.execute(sql)
result = myCursor.fetchall() # fetchall() 获取所有记录for x in result:print(x)
(2, 'LiLei', '13866668888', 'China')
(3, 'Jim', '13855558888', 'America')六、删除记录
删除记录使用 "DELETE FROM" 语句:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()
sql = "DELETE FROM user WHERE name = 'Jim'"myCursor.execute(sql)
mydb.commit()print(myCursor.rowcount, " 条记录删除")
1 条记录删除
为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义删除语句的条件:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()sql = "DELETE FROM user WHERE name = %s"
param = ("HanMeimei",)myCursor.execute(sql, param)
mydb.commit()print(myCursor.rowcount, " 条记录删除")
1 条记录删除七、更新表数据
数据表更新使用 "UPDATE" 语句:

# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()sql = "UPDATE user SET name = 'Lucy' WHERE name = 'Lily'"myCursor.execute(sql)
mydb.commit()print(myCursor.rowcount, " 条记录被修改")
1 条记录被修改
为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义更新语句的条件:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()sql = "UPDATE user SET name = %s WHERE name = %s"
param = ("HanMeimei", "LiLei")myCursor.execute(sql, param)
mydb.commit()print(myCursor.rowcount, " 条记录被修改")
1 条记录被修改八、删除表
删除表使用 "DROP TABLE" 语句, IF EXISTS 关键字是用于判断表是否存在,只有在存在的情况才删除:
# coding=utf-8import mysql.connectormydb = mysql.connector.connect(host="127.0.0.1", # 数据库主机地址user="root", # 数据库用户名passwd="root", # 数据库密码database="python_demo" # 指定数据库
)myCursor = mydb.cursor()myCursor.execute("SHOW TABLES")for x in myCursor:print(x)sql = "DROP TABLE IF EXISTS user_info" # 删除数据表 user_info
myCursor.execute(sql)print(" 删除数据表 user_info")myCursor.execute("SHOW TABLES")for x in myCursor:print(x)
('user',)
('user_info',)删除数据表 user_info
('user',)
相关文章:
【Python学习笔记】第二十五节 Python MySQL
Python 连接到 MySQL 数据库有几种不同的连接方法,而且不是所有的方法都能与不同的操作系统很好地配合.MySQL connector/Python模块是Oracle支持的官方驱动,用于通过Python连接MySQL。该连接器完全是Python语言,而mysqlclient是用C语言编写的…...
折叠屏手机自带的屏幕表面层为什么不能自己撕?
计划入手折叠屏手机的小伙伴看过来,因为折叠屏手机外观的特殊形态,在日常使用中与普通直板手机屏幕的养护还是有着很大的不同,比如直板机入手后新机开箱撕膜这个操作,对于折叠屏手机来说,万万不可!除此之外…...
20.hadoop系列之Yarn资源调度器
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序 1.Yarn基础架构 Yarn主要由ResourceManager、NodeManager、ApplicationMaster和Contai…...
206页16万字城市运行“一网统管”体系建设项目需求报告
本资料来源网络,知识分享,仅供个人学习,请勿商用。完整资料领取见文末,部分资料内容: 第 一 章 应用场景示例 一.1 一卡通人员管理针对企业厂区、办公楼等场所人员出入频繁、安保问题多样化、管理环节复杂等现状&#…...
【JS】数组Array的使用
arr.length 3 通过设置数组长度,实现截取数组,改变原数组 map 循环遍历数组,不改变原数组,返回一个新的数组(可用变量接收) forEach 循环遍历数组,不改变原数组 join 把数组转化为字符串&…...
2023年,软件测试怎么样?
2022年因为各种不可抗力原因,大厂裁员,失业等等频频受到关注。 不解释,确实存在,各行各业都很难,但是,说软件测试行业不吃香,我还真不认同(不是为培训机构说好话,大环境…...
【学习笔记】NOMURA Programming Competition 2020
C - Folia 不难想到自底向上确定树的形态。可能要多尝试一下 一开始想错了好几个地方,服了 假设某一层有XXX个节点,那么上一层可能有⌈X2⌉,⌈X2⌉1,...,X\lceil\frac{X}{2}\rceil,\lceil\frac{X}{2}\rceil1,...,X⌈2X⌉,⌈2X⌉1,...,X个节点&…...
iis下常用程序的伪静态规则列表(包括wordpress、thinkphp)
shopex discuz2.0 discuz2.5 discuz3.x 淘宝客 ecshop phpwind参照http://www.west.cn/faq/list.asp?unid797通过主机面板设置即可 wordpress设置: 第一步: 1.新建一个“chineseurl.php”文件:在里面写入以下代码上传到wordpress安装目录。…...
【Python语言基础】——Python Select From
Python语言基础——Python Select From 文章目录 Python语言基础——Python Select From一、Python Select From一、Python Select From 从表中选取 如需从 MySQL 中的表中进行选择,请使用 “SELECT” 语句: 实例 从表 “customers” 中选取所有记录,并显示结果: import m…...
数据增广真有那么神奇吗?
作者:皮皮雷 来源:投稿 编辑:学姐 论文题目 How Effective is Task-Agnostic Data Augmentation for Pretrained Transformers? 论文作者 S. Longpre, Y. Wang, and C. DuBois 论文发表于 2020 EMNLP findings 摘要 任务无关的数据增广…...
常用基础硬件知识 - 判断MOS管导通
目录1. 概述2. 判断MOS管的导通1. 概述 本文主要记录下基础的硬件知识,方便自己查阅。 2. 判断MOS管的导通 在产品硬件设计中,有时需要程序控制一些电源使能。 1.原理图已经标出了G极(gate)—栅极、S极(source)—源极、D极(drain)—漏极。 如果没有标…...
2023金三银四,测试人还能找到好工作吗?
嫌看文章麻烦的朋友点这里:2023最新软件测试行业变革细谈之我们该如何应对? 按照往年的惯例,春节后复工的 3 月、4 月是人员跳槽最频繁的时候,俗称“金三银四”。然而,市场大环境的影响,很多行业感受到了一…...
c++构造函数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、构造函数1.构造函数的形式2.构造函数的调用时机3.委托构造函数4.复制构造函数二、析构函数本文仅为个人笔记 视频链接:https://www.bilibili.com/vid…...
redis 未授权访问漏洞
redis 未授权访问漏洞 目录 redis 未授权访问漏洞 漏洞描述 漏洞原因: 漏洞危害 漏洞复现: 漏洞复现 写webshell: 写计划任务:centos默认在/var/spool/cron 写ssh公钥实现ssh登录: 漏洞描述: Redis默认情况下…...
如何制作一个自定义的winpe?
winpe制作过程 获取相关资源 https://www.aliyundrive.com/s/MP58JbRsm76 文件存放位置 将压缩包存放在一个全英文目录下了,我这里选择了D:/winpe目录 解压文件 将三个压缩包进行解压到当前目录,如下图所示 创建一个mount目录,并在mount目录下分别创建boot和install目…...
QString转为2进制,8进制,10进制,16进制介绍
首先看段代码: bool ok false;QString ss "11";qDebug()<<"-----"<<ss.toInt(&ok,2)<<ss.toInt(&ok,10)<<ss.toInt(&ok,16)<<ss.toInt(&ok,8);结果: ----- 3 11 17 9 bool ok fal…...
2023-3-2-22:01随笔
好久没怎么更新技术分享博客了。去年从2022年1月3日到2023年1月份一直专注于ADAS的行车横向功能的研发与实车调试,2022年写了几篇项目经验的文章,像LQR算法(虽然和同事(志同道合,技术追求的民哥)写出的工程…...
学习红客技术必备,手把手教你成为“安防第一人”
互联网时代已悄悄来临,作为新时代的人们,我们日常生活、工作、学习方面都需要借助互联网来完成,这样,又产生一种新的问题,那就是网络安全的问题,有时我们拼命加班好不容易完成的东西,在一夜之间…...
Git系列:常见指令辨析
Git系列:常见指令辨析指令辨析工作区、暂存区、版本库傻傻分不清楚?主干和分支的关系是什么?git fetch/merge/pull辨析日志查看时,git log与git reflog的区别是?git diff和status的区别是?相关资料本文小结…...
并发编程实战-构建自定义的同步工具
文章目录1.状态依赖性的管理1.1 示例:将前提条件的失败传递给调用者1.2 示例:通过轮询与休眠来实现简单的阻塞1.3 条件队列2.使用条件队列2.1 条件谓词2.2 过早唤醒2.3 丢失的信号2.4 通知2.5 示例:阀门类2.6 子类的安全问题2.7 入口协议与出…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
