当前位置: 首页 > news >正文

Python - 100天从新手到大师:第四十四Python接入MySQL数据库

Python接入MySQL数据库

在 Python3 中,我们可以使用mysqlclient或者pymysql三方库来接入 MySQL 数据库并实现数据持久化操作。二者的用法完全相同,只是导入的模块名不一样。我们推荐大家使用纯 Python 的三方库pymysql,因为它更容易安装成功。下面我们仍然以之前创建的名为hrs的数据库为例,为大家演示如何通过 Python 程序操作 MySQL 数据库实现数据持久化操作。

接入MySQL

首先,我们可以在命令行或者 PyCharm 的终端中通过下面的命令安装pymysql,如果需要接入 MySQL 8,还需要安装一个名为cryptography的三方库来支持 MySQL 8 的密码认证方式。

pip install pymysql cryptography

使用pymysql操作 MySQL 的步骤如下所示:

  1. 创建连接。MySQL 服务器启动后,提供了基于 TCP (传输控制协议)的网络服务。我们可以通过pymysql模块的connect函数连接 MySQL 服务器。在调用connect函数时,需要指定主机(host)、端口(port)、用户名(user)、口令(password)、数据库(database)、字符集(charset)等参数,该函数会返回一个Connection对象。
  2. 获取游标。连接 MySQL 服务器成功后,接下来要做的就是向数据库服务器发送 SQL 语句,MySQL 会执行接收到的 SQL 并将执行结果通过网络返回。要实现这项操作,需要先通过连接对象的cursor方法获取游标(Cursor)对象。
  3. 发出 SQL。通过游标对象的execute方法,我们可以向数据库发出 SQL 语句。
  4. 如果执行insertdeleteupdate操作,需要根据实际情况提交或回滚事务。因为创建连接时,默认开启了事务环境,在操作完成后,需要使用连接对象的commitrollback方法,实现事务的提交或回滚,rollback方法通常会放在异常捕获代码块except中。如果执行select操作,需要通过游标对象抓取查询的结果,对应的方法有三个,分别是:fetchonefetchmanyfetchall。其中fetchone方法会抓取到一条记录,并以元组或字典的方式返回;fetchmanyfetchall方法会抓取到多条记录,以嵌套元组或列表装字典的方式返回。
  5. 关闭连接。在完成持久化操作后,请不要忘记关闭连接,释放外部资源。我们通常会在finally代码块中使用连接对象的close方法来关闭连接。

代码实操

下面,我们通过代码实操的方式为大家演示上面说的五个步骤。

插入数据
import pymysqlno = int(input('部门编号: '))
name = input('部门名称: ')
location = input('部门所在地: ')# 1. 创建连接(Connection)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='guest', password='Guest.618',database='hrs', charset='utf8mb4')
try:# 2. 获取游标对象(Cursor)with conn.cursor() as cursor:# 3. 通过游标对象向数据库服务器发出SQL语句affected_rows = cursor.execute('insert into `tb_dept` values (%s, %s, %s)',(no, name, location))if affected_rows == 1:print('新增部门成功!!!')# 4. 提交事务(transaction)conn.commit()
except pymysql.MySQLError as err:# 4. 回滚事务conn.rollback()print(type(err), err)
finally:# 5. 关闭连接释放资源conn.close()

说明:上面的127.0.0.1称为回环地址,它代表的是本机。下面的guest是我提前创建好的用户,该用户拥有对hrs数据库的insertdeleteupdateselect权限。我们不建议大家在项目中直接使用root超级管理员账号访问数据库,这样做实在是太危险了。我们可以使用下面的命令创建名为guest的用户并为其授权。

create user 'guest'@'%' identified by 'Guest.618';
grant insert, delete, update, select on `hrs`.* to 'guest'@'%';

如果要插入大量数据,建议使用游标对象的executemany方法做批处理(一个insert操作后面跟上多组数据),大家可以尝试向一张表插入10000条记录,然后看看不使用批处理一条条的插入和使用批处理有什么差别。游标对象的executemany方法第一个参数仍然是 SQL 语句,第二个参数可以是包含多组数据的列表或元组。

删除数据
import pymysqlno = int(input('部门编号: '))# 1. 创建连接(Connection)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='guest', password='Guest.618',database='hrs', charset='utf8mb4',autocommit=True)
try:# 2. 获取游标对象(Cursor)with conn.cursor() as cursor:# 3. 通过游标对象向数据库服务器发出SQL语句affected_rows = cursor.execute('delete from `tb_dept` where `dno`=%s',(no, ))if affected_rows == 1:print('删除部门成功!!!')
finally:# 5. 关闭连接释放资源conn.close()

说明:如果不希望每次 SQL 操作之后手动提交或回滚事务,可以connect函数中加一个名为autocommit的参数并将它的值设置为True,表示每次执行 SQL 成功后自动提交。但是我们建议大家手动提交或回滚,这样可以根据实际业务需要来构造事务环境。如果不愿意捕获异常并进行处理,可以在try代码块后直接跟finally块,省略except意味着发生异常时,代码会直接崩溃并将异常栈显示在终端中。

更新数据
import pymysqlno = int(input('部门编号: '))
name = input('部门名称: ')
location = input('部门所在地: ')# 1. 创建连接(Connection)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='guest', password='Guest.618',database='hrs', charset='utf8mb4')
try:# 2. 获取游标对象(Cursor)with conn.cursor() as cursor:# 3. 通过游标对象向数据库服务器发出SQL语句affected_rows = cursor.execute('update `tb_dept` set `dname`=%s, `dloc`=%s where `dno`=%s',(name, location, no))if affected_rows == 1:print('更新部门信息成功!!!')# 4. 提交事务conn.commit()
except pymysql.MySQLError as err:# 4. 回滚事务conn.rollback()print(type(err), err)
finally:# 5. 关闭连接释放资源conn.close()
查询数据
  1. 查询部门表的数据。
import pymysql# 1. 创建连接(Connection)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='guest', password='Guest.618',database='hrs', charset='utf8mb4')
try:# 2. 获取游标对象(Cursor)with conn.cursor() as cursor:# 3. 通过游标对象向数据库服务器发出SQL语句cursor.execute('select `dno`, `dname`, `dloc` from `tb_dept`')# 4. 通过游标对象抓取数据row = cursor.fetchone()while row:print(row)row = cursor.fetchone()
except pymysql.MySQLError as err:print(type(err), err)
finally:# 5. 关闭连接释放资源conn.close()

说明:上面的代码中,我们通过构造一个while循环实现了逐行抓取查询结果的操作。这种方式特别适合查询结果有非常多行的场景。因为如果使用fetchall一次性将所有记录抓取到一个嵌套元组中,会造成非常大的内存开销,这在很多场景下并不是一个好主意。如果不愿意使用while循环,还可以考虑使用iter函数构造一个迭代器来逐行抓取数据,有兴趣的读者可以自行研究。

  1. 分页查询员工表的数据。
import pymysqlpage = int(input('页码: '))
size = int(input('大小: '))# 1. 创建连接(Connection)
con = pymysql.connect(host='127.0.0.1', port=3306,user='guest', password='Guest.618',database='hrs', charset='utf8')
try:# 2. 获取游标对象(Cursor)with con.cursor(pymysql.cursors.DictCursor) as cursor:# 3. 通过游标对象向数据库服务器发出SQL语句cursor.execute('select `eno`, `ename`, `job`, `sal` from `tb_emp` order by `sal` desc limit %s,%s',((page - 1) * size, size))# 4. 通过游标对象抓取数据for emp_dict in cursor.fetchall():print(emp_dict)
finally:# 5. 关闭连接释放资源con.close()

案例讲解

下面我们为大家讲解一个将数据库表数据导出到 Excel 文件的例子,我们需要先安装openpyxl三方库,命令如下所示。

pip install openpyxl

接下来,我们通过下面的代码实现了将数据库hrs中所有员工的编号、姓名、职位、月薪、补贴和部门名称导出到一个 Excel 文件中。

import openpyxl
import pymysql# 创建工作簿对象
workbook = openpyxl.Workbook()
# 获得默认的工作表
sheet = workbook.active
# 修改工作表的标题
sheet.title = '员工基本信息'
# 给工作表添加表头
sheet.append(('工号', '姓名', '职位', '月薪', '补贴', '部门'))
# 创建连接(Connection)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='guest', password='Guest.618',database='hrs', charset='utf8mb4')
try:# 获取游标对象(Cursor)with conn.cursor() as cursor:# 通过游标对象执行SQL语句cursor.execute('select `eno`, `ename`, `job`, `sal`, coalesce(`comm`, 0), `dname` ''from `tb_emp` natural join `tb_dept`')# 通过游标抓取数据row = cursor.fetchone()while row:# 将数据逐行写入工作表中sheet.append(row)row = cursor.fetchone()# 保存工作簿workbook.save('hrs.xlsx')
except pymysql.MySQLError as err:print(err)
finally:# 关闭连接释放资源conn.close()

大家可以参考上面的例子,试一试把 Excel 文件的数据导入到指定数据库的指定表中,看看是否可以成功。

http://www.dtcms.com/a/450782.html

相关文章:

  • 俱乐部网站方案前程无忧做网站多少钱
  • 视频号视频下载助手appwordpress seo.php
  • 中国建设银行信用卡网站首页网站空间可以通过什么获取
  • Transformer(三)---编码器部分实现
  • DevEco Studio安装
  • C51-指针函数(返回指针的函数)
  • 遵义网站建设公司电话多少网站域名变更怎么查询
  • 上海网站设计建设wordpress的交叉表单
  • 网站正在建设 下载站长之家短链接生成
  • 杭州住房建设部官方网站室内设计培训班快速
  • Doris专题7- 索引
  • 建设银行境外购物网站荣耀手机商城官方网站入口
  • 哪些调查网站可以做问卷赚钱传统文化网站建设方案
  • 成都食品网站开发学校网站需求
  • C++基础:(七)模版初阶:从泛型编程到类模板
  • 【CV理论】什么是Marr的视觉理论?
  • cakephp网站开发框架gta5网站建设中
  • 广西建设局网站首页it行业35岁后都干嘛
  • 成都私人做网站建设做企业网站软件
  • 网站优化排名软件宁波正规站内优化seo
  • 德阳建设局网站首页amh wordpress 邮件
  • 怎么做才能使网站ip增多WordPress按钮跳转插件
  • wordpress怎样建立多站点电子商务企业网站建设实训报告
  • 玉门市住房和城乡建设局网站商品房合同备案查询入口
  • 10.3.2 Fireware内核空间架构实现
  • 不属于常用网站建设的是网络工程考研方向
  • 建立网站的风险图片免费转链接
  • windows10前段网站建设用html制作个人博客
  • Typora免费版本分享
  • 百度宿迁市建设局网站北京微网站建设