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下的Mysql模块MySQLdb安装详解
Apr 09 Python
python实现颜色空间转换程序(Tkinter)
Dec 31 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
Feb 24 Python
Python3最长回文子串算法示例
Mar 04 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
Mar 10 Python
Python如何输出百分比
Jul 31 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
Pycharm制作搞怪弹窗的实现代码
Feb 19 Python
用python修改excel表某一列内容的操作方法
Jun 11 Python
教你使用一行Python代码玩遍童年的小游戏
Aug 23 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
图书管理程序(一)
2006/10/09 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
2015/03/25 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
javscript对象原型的一些看法
2010/09/19 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
JS实现页面数据懒加载
2020/02/13 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
python制作花瓣网美女图片爬虫
2015/10/28 Python
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
事务机电主管工作职责
2014/02/25 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
房产分割协议书范文
2014/11/21 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
童年读书笔记
2015/06/26 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
2016年端午节寄语
2015/12/04 职场文书
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python