侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   356

本文实例讲述了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.connectordb = mysql.connector.connect(  host='localhost',  port='3306',  user="root",  password="123456",  database="test")

3、数据库、表操作

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

# 获取数据库的cursorcursor = 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数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

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


  • 上一条:
    基于python实现语音录入识别代码实例
    下一条:
    python实现高斯投影正反算方式
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客