百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Python使用MySQL指南(python mysql教程)

mhr18 2024-10-16 10:35 25 浏览 0 评论

MySQL 是一款非常典型的关系型数据库,其数据通过二维表来存放,所以数据都是按照行列组成在表里,一列就是一个字段,一行就是一条数据。常见的除了 MySQL 以外还有 Oracle,DB2 等。本文将以 MySQL 为基础介绍 Python 如何使用 pymysql 库来操作关系型数据库。

开始使用

pymysql 是 Python3 中推荐使用的数据库操作库。因此在使用之前需要安装该库。

安装 pymsql操作库

pip install pymysql

pymysql 快速上手

import pymysql

db = pymysql.connect(host='localhost', 
                     user='root', 
                     password='root')
cursor = db.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS `test`")
cursor.execute("USE `test`")
cursor.execute(
    "CREATE TABLE IF NOT EXISTS `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL,`email` varchar(255) NOT NULL,`password` varchar(255) NOT NULL,PRIMARY KEY (`id`))")
cursor.execute(
    "INSERT INTO `test` (`name`, `email`, `password`) VALUES ('test', 'test', 'test')")
db.commit()
db.close()
print("Done")

如上边代码中, 通过使用 connect 方法来创建一个 MySQL 的连接对象,在创建之前需要传递 host (数据库地址),user(用户名)和 password(密码) 三个参数。同时还可以指定 port 端口(默认为 3306,可以不传),database(使用的数据库, 可不传, 但需后后续手动指定)。连接成功后调用 cursor 方法获取数据库的游标,此时就可以使用 execute 方法来执行数据库 sql 语句了,执行成功后需调用 commit close 提交事务关闭连接,此时,我们去查看数据库,就可以看到数据成功插入到数据库中,如下图:

表操作及数据增删改(CUD)

pymysql 中在执行数据库操作时,需要先调用 cursor 方法来获取 MySQL 操作游标后续都使用游标来执行相应的 SQL 语句

创建数据库

创建数据库的过程非常简单,只需要获取到游标后,执行创建库的 sql 即可

cursor = db.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS `test`")

需要注意的是,在创建的连接的时候可以指定要操作哪个数据库(database 参数),游标默认会使用该库,如果需要使用新创建的库,需要手动调用 cursor.execute("USE `test`") 来指定要执行的库。不过如果在创建连接的时候没有指定数据库,那手动指定使用哪个库,就是一个必须的步骤不能省略

创建表

在指定使用哪个库后,即可执行创建表的 SQL 语句来完成表创建。

cursor.execute(
    "CREATE TABLE IF NOT EXISTS `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL,`email` varchar(255) NOT NULL,`password` varchar(255) NOT NULL,PRIMARY KEY (`id`))")

需要注意的是,在执行完 execute 后,需要继续调用 commit 方法才能实现数据插入。后续更新,删除等操作也需要 commit 才可以生效。

修改数据

修改数据依然执行相应的 sql 语句就行,并且在修改成功后返回执行修改的条数,因此可以根据返回值判断是否执行成功。

count = cursor.execute("update test set password = 'test2' where id = 2")

删除数据

删除数据和修改操作相同,也能获取到删除的条数,用于判断是否删除成功。

count = cursor.execute("delete from test where id = 2")
  1. execute 方法还可以使用占位符来执行 SQL,只需要在 SQL 语句中使用%s 占位,并在参数 args 里设置占位的填充数据(参数为元组)即可。
cursor.execute("update test set password = %s where id = %s", ("test", 1))
  1. 对数据库执行操作完成后, 始终需要调用commit方法,否则可能会导致数据丢失的情况。

查询数据

数据库中最为重要的功能就是查询,使用 pymsql 执行查询时,会有一些不同,需要使用到 fetch ,fetchall 和 fetchmany 方法。

import pymysql

db = pymysql.connect(host='localhost', 
                     user='root', 
                     password='root', 
                     port=3306, 
                     database='test')
cursor = db.cursor()
sql_str = "select * from test"
res = cursor.execute(sql_str)
one = cursor.fetchone()

print(res)
print(one)

# 2
# (1, 'test', 'test', 'test')

如上边代码所示,依然使用 connect 获取数据库的连接, 使用 cursor 获取到数据库的游标,需要注意的是,使用 execute 执行查询 sql 语句后,获得的结果是结果条数,并不是结果内容,需要使用 fetch*方法来获取里边的内容。

fetchone:该方法可以获取到结果的第一条数据,返回的内容会存到一个元组中,需要注意的是,每次调用 fetchone 都会使查询游标向下移动,直到没有任何数据时,返回 None,因此可以使用 while 循环一直调用 fetchone 方法来获取所有的数据。

fetchall:该方法可以获取到所有的数据,查询的结果每条数据集结果都会被存放到元组中。

fetchmany:该方法用于获取指定条数的数据结果,参数 size 可以指定查询的条数。

使用查询功能时,需要注意以下问题:

1. fetch*方法中获取到的数据,在元组中和数据库中的字段顺序是一一对应的。

2. 每次调用 fetch 方法都会使游标向下移动,因此,组合使用 fetch 方法需要注意实际获取到的可能与预想的情况不一致。比如,调用完 fetchone 后再调用 fetchall,则 fetchall 获取的结果中就会少了 fetchone 的数据,根本原因就是游标被移动了。

事务回滚

事务机制是数据库确保数据一致性的重要功能,简单的理解为,当同时执行多个数据库操作的时候,要么都完成,要么都失败,不允许有部分成功的情况,这就是事务的最基础表现。因此在上边的增,删,改的代码逻辑中,执行完成后必须要调用一次 commit,就相当于将当前的事务提交。因此如果需要确保事务的一致性,就需要确保所有的操作都需要再同一个事务下来完成,只要中途有一次完成了 commit,则当前事务就会被提前终止。

因此这里就引出一个非常重要的概念,事务回滚。当同一个事务下,其中一条执行出错的时候,就需要回滚当前事务,在 pymysql 中使用 rollback 来完成事务的回滚

import pymysql

db = pymysql.connect(host='localhost', user='root', password='root', port=3306, database='test')
cursor = db.cursor()
try:
    cursor.execute("INSERT INTO `test` (`name`, `email`, `password`) VALUES ('test0', 'test0', 'test0')")
    1 / 0
    cursor.execute("INSERT INTO `test` (`name`, `email`, `password`) VALUES ('test1', 'test1', 'test1')")
    db.commit()
    print("success")
except:
    print("error")
    db.rollback()

db.close()

如上述代码中,在同一个事务中执行两条插入数据操作,其中在第一条和第二条中间故意放置一个引起错误的代码,此时,由于代码错误引起异常被捕获,进入到 except 块中,执行 rollbac 回滚当前事务,因此第一条执行成功的数据也不会被记录到库中。只有当两条同时执行成功,并且调用了 commit 才可以完成数据插入。

相关推荐

【预警通报】关于WebLogic存在远程代码执行高危漏洞的预警通报

近日,Oracle官方发布了2021年1月关键补丁更新公告CPU(CriticalPatchUpdate),共修复了包括CVE-2021-2109(WeblogicServer远程代码执行漏洞)...

医院信息系统突发应急演练记录(医院信息化应急演练)

信息系统突发事件应急预案演练记录演练内容信息系统突发事件应急预案演练参与人员信息科参与科室:全院各部门日期xxxx-xx-xx时间20:00至24:00地点信息科记录:xxx1、...

一文掌握怎么利用Shell+Python实现完美版的多数据源备份程序

简介:在当今数字化时代,无论是企业还是个人,数据的安全性和业务的连续性都是至关重要的。数据一旦丢失,可能会造成无法估量的损失。因此,如何有效地对分布在不同位置的数据进行备份,尤其是异地备份,成为了一个...

docker搭建系统环境(docker搭建centos)

Docker安装(CentOS7)1.卸载旧版Docker#检查已安装版本yumlistinstalled|grepdocker#卸载旧版本yumremove-ydocker.x...

基础篇:数据库 SQL 入门教程(sql数据库入门书籍推荐)

SQL介绍什么是SQLSQL指结构化查询语言,是用于访问和处理数据库的标准的计算机语言。它使我们有能力访问数据库,可与多种数据库程序协同工作,如MSAccess、DB2、Informix、M...

Java21杀手级新特性!3行代码性能翻倍

导语某券商系统用这招,交易延迟从12ms降到0.8ms!本文揭秘Oracle官方未公开的Record模式匹配+虚拟线程深度优化+向量API神操作,代码量直降70%!一、Record模式匹配(代码量↓8...

一文读懂JDK21的虚拟线程(java虚拟线程)

概述JDK21已于2023年9月19日发布,作为Oracle标准Java实现的一个LTS版本发布,发布了15想新特性,其中虚拟线程呼声较高。虚拟线程是JDK21中引入的一项重要特性,它是一种轻量级的...

效率!MacOS下超级好用的Linux虚拟工具:Lima

对于MacOS用户来说,搭建Linux虚拟环境一直是件让人头疼的事。无论是VirtualBox还是商业的VMware,都显得过于笨重且配置复杂。今天,我们要介绍一个轻巧方便的纯命令行Linux虚拟工具...

所谓SaaS(所谓三维目标一般都应包括)

2010年前后,一个科技媒体的主编写一些关于云计算的概念性问题,就可以作为头版头条了。那时候的云计算,更多的还停留在一些概念性的问题上。而基于云计算而生的SaaS更是“养在深闺人未识”,一度成为被IT...

ORA-00600 「25027」 「x」报错(报错0xc0000001)

问题现象:在用到LOB大对象的业务中,进行数据的插入,失败了,在报警文件中报错:ORA-00600:内部错误代码,参数:[25027],[10],[0],[],[],[],[],[...

安卓7源码编译(安卓源码编译环境lunch失败,uname命令找不到)

前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...

编译安卓源码(编译安卓源码 电脑配置)

前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...

360 Vulcan Team首战告捷 以17.5万美金强势领跑2019“天府杯“

2019年11月16日,由360集团、百度、腾讯、阿里巴巴、清华大学与中科院等多家企业和研究机构在成都联合主办了2019“天府杯”国际网络安全大赛暨2019天府国际网络安全高峰论坛。而开幕当日最激荡人...

Syslog 日志分析与异常检测技巧(syslog发送日志配置)

系统日志包含有助于分析网络设备整体运行状况的重要信息。然而,理解并从中提取有效数据往往颇具挑战。本文将详解从基础命令行工具到专业日志管理软件的全流程分析技巧,助你高效挖掘Syslog日志价值。Gr...

从Oracle演进看数据库技术的发展(从oracle演进看数据库技术的发展的过程)

数据库技术发展本质上是应用需求驱动与基础架构演进的双向奔赴,如何分析其技术发展的脉络和方向?考虑到oracle数据库仍然是这个领域的王者,以其为例,管中窥豹,对其从Oracle8i到23ai版本的核...

取消回复欢迎 发表评论: