Python操作MySQL数据库实例详解【安装、连接、增删改查等】


Posted in Python onJanuary 17, 2020

本文实例讲述了Python操作MySQL数据库。分享给大家供大家参考,具体如下:

1、安装

通过Python连接MySQL数据库有很多库,这里使用官方推荐的MySQL Connector/Python库,其官网为:https://dev.mysql.com/doc/connector-python/en/。

通过pip命令安装:

pip install mysql-connector-python

默认安装的是最新的版本,我安装的是8.0.17,对应MySQL的8.0版本。MySQL统一了其相关工具的大版本号,必须相同或更高才可以兼容。例如我使用的是MySQL8.0,如果使用低于8的mysql-connector就会报错。事实上也是这样,在某些旧的文档中提示安装pip install mysql-connector,就会安装较低的版本,在连接MySQL时,会报错如下:

mysql.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported

这是由于mysql8.0使用了Use Strong Password Encryption for Authentication即强密码加密,而低版本的mysql-connector采用旧的mysql_native_password加密方式,导致无法连接,因此注意使用和数据库相兼容的版本。

2、连接

可以通过connector类的connect()方法进行数据库的连接,传入服务器、端口号、用户名、密码、数据库等参数,其中服务器与端口号可省略,默认为localhost:3306。

import mysql.connector
db = mysql.connector.connect(
  host='localhost',
  port='3306',
  user="root",
  password="123456",
  database="test"
)

3、数据库、表操作

对数据库、数据表的操作属于模式定义语言(DDL),所有DDL语句的执行都是依赖于一个叫cursor的数据结构进行操作的。通过从connect对象中获取cursor对象后就可以进行数据库、表的相关操作了。例如创建一个数据库、数据表

# 获取数据库的cursor
cursor = db.cursor()
# 创建数据库
cursor.execute("CREATE DATABASE mydatabase")
# 创建数据表
dbcursor.execute("CREATE TABLE customers (name varchar(255),address varchar(255))")
# 修改表操作
dbcursor.execute('ALTER TABLE customers ADD COLUMN id INT PRIMARY KEY AUTO_INCREMENT')
# 查询并打印数据库中的所有表
cursor.execute("show tables")
for table in cursor:
  print(table)

4、增删改

插入、删除、修改操作依旧是通过cursor对象来实现,通过cursor的execute()方法执行SQL操作,第一个参数是要执行的SQL语句,第二个参数是语句中要填充的变量。

在执行完所有的SQL操作后记得要通过数据库对象的commit()将操作事务提交到数据库,如果需要撤销则通过rollback()方法回滚操作。

SQL语句中的变量可以用%s的形式作为占位符,然后再以python中元组的形式在执行时将变量填入,如下所示:

值得注意的是无论是什么类型的数据在传入时都被当做字符串类型,然后在执行SQL操作时会将字符串转化为相应的类型,因此此处的占位符都是%s,而没有%d、%f等。

# 要执行的SQL语句
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
# 以元组的形式填入数据
val = ('Mike', 'Main street 20')
# 执行操作
cursor.execute(sql, val)
# 提交事务
db.commit()

也可以用python中字典的形式填充变量,在SQL语句中的占位符需要使用对应的变量名

# 在SQL语句中指明变量名
sql = "INSERT INTO customers (name, address) VALUES (%(name)s, %(address)s)"
# 以字典的形式填入数据
val = {
  'name': 'Alice',
  'address': 'Center street 22'
}
cursor.execute(sql, val)

如果需要一次插入多条数据,可以使用executemany()方法,将多条数据以数组的方式传给第二个参数。

通过cursor的rowcount属性可以返回成功操作的数据条数,lastrowid属性是最后一个成功插入的行的id

sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
# 以数组的形式填充数据
val = [
 ('Peter', 'Lowstreet 4'),
 ('Amy', 'Apple st 652'),
 ('Hannah', 'Mountain 21'),
]
cursor.executemany(sql, val)
print("成功插入%d条数据,最后一条的id为:%d" % (cursor.rowcount, cursor.lastrowid))

修改、删除数据的方法与插入类似,只需要把对应的SQL语句和变量值传给execute()函数即可。可以看出MySQL-connector库的操作是非常贴近原生SQL语言的。

# 修改数据
sql = "UPDATE customers SET address=%s WHERE name=%s"
val = ('Center street 21', 'Mike')
cursor.execute(sql, val)
# 删除数据
sql = "DELETE FROM customers WHERE name=%s"
val = ('Hannah',)
cursor.execute(sql, val)

5、查询

执行查询操作和之前类似,都是通过execute()执行对应的SQL语句,在执行时将相应的数据填入即可。查询结束后,结果集会保存在cursor当中,可以直接把cursor当作迭代器iterator来进行展开取得结果集中每条数据的对应字段。也可以通过cursor的fetchall()、fetchone()方法取得所有或一条结果集。

# 查询customers表中id介于6到8之间的数据并返回name、address字段
query = "SELECT name,address FROM customers WHERE id BETWEEN %s AND %s"
cursor.execute(query, (6, 8))
# 循环取出结果集中的每条数据并打印
for (name, address) in cursor:
  print("%s家的地址是%s" % (name, address))
# 输出结果为:
# Peter家的地址是Lowstreet 4
# Amy家的地址是Apple st 652
# Hannah家的地址是Mountain 21

通过原生的SQL语句可以进行更为复杂的查询操作,例如通过where设置查询条件、Order by进行字段排序、Limit设置返回结果条数、OFFSET查询结果集的偏移、Join进行表连接操作

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python 第一步 hello world
Sep 25 Python
Python牛刀小试密码爆破
Feb 03 Python
python中的闭包函数
Feb 09 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
Python+selenium点击网页上指定坐标的实例
Jul 05 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
Feb 17 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
python中的对数log函数表示及用法
Dec 09 Python
python实现高斯投影正反算方式
Jan 17 #Python
python中图像通道分离与合并实例
Jan 17 #Python
Python-opencv 双线性插值实例
Jan 17 #Python
如何通过python实现人脸识别验证
Jan 17 #Python
Python-openCV读RGB通道图实例
Jan 17 #Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 #Python
python numpy 矩阵堆叠实例
Jan 17 #Python
You might like
PHP 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
php无限分类使用concat如何实现
2015/11/05 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
php实现支付宝当面付(扫码支付)功能
2018/05/30 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
jQuery 动画基础教程
2008/12/25 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
如何使用Bootstrap创建表单
2017/03/29 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
Python 将pdf转成图片的方法
2018/04/23 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
PREMIUM-MALL法国:行李、箱包及配件在线
2019/05/30 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
JNI的定义
2012/11/25 面试题
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
社区矫正工作方案
2014/06/04 职场文书
大学生村官个人总结
2015/02/15 职场文书
综合素质评价个性与发展自我评价
2015/03/06 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
Oracle中update和select 关联操作
2022/01/18 Oracle
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript