Python语言是一种流行的开源编程语言,不仅表达能力强,提供了高效的数据结构,还能简单有效地面向对象编程。我们使用Python进行web开发、网络爬虫、数据挖掘、人工智能等研究时,不可避免的要连接数据库来存储或读取数据。
Python DB-API是Python访问数据库的统一接口规范
在没有Python DB-API之前,各数据库之间的应用接口非常混乱,实现各不相同。由于最层用的数据库技术不同,所以在应用程序层就要针对特定的数据库进行特定的编码,如果项目需要更换数据库时,则需要做大量的修改,非常不便。Python DB-API 的出现就是为了解决这样的问题。 DB-API 是一个规范,它定义了一系列必须的对象和数据库存取方式,以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。Python所有的数据库接口程序都在一定程度上遵守 Python DB-API 规范。由于DB-API 为不同的数据库提供了一致的访问接口, 在不同的数据库之间移植代码成为一件轻松的事情。
DB-API使用了一个两层体系结构,其中顶层提供了一个抽象接口,该接口可以泛用于所有支持的数据库引擎;而底层则是有一些特定引擎的驱动程序构成,这些驱动程序负责处理与特定引擎有关的细节。使用Python DB-API与任何底层数据库交互时,不需要关心这个底层数据库技术,也不需要丢弃现有的代码。
使用Python DB-API访问数据库的流程
为了使用Python程序来访问数据库,必须有相应的驱动程序来处理特定的数据库系统。
- 调用驱动程序中的connect()方法创建数据库连接,它会返回一个连接对象,这个连接对象就像在Python和数据库之间搭起了通信的桥梁。
- 获得连接对象之后,调用该对象的cursor()方法来创建一个游标对象,这个游标对象就像是在Python和数据库之间运输货物的汽车。
- 调用游标对象的execute()方法可以向数据库服务器发送SQL命令,调用游标对象的fetch*()方法可以获取结果集中的记录,获取记录时就像从货车上装卸货物。
- SQL命令执行完毕后,调用游标对象的close()方法关闭游标。
- 最后,调用连接对象的close()方法关闭服务器的连接。
实操演示
环境准备
本文所用操作环境
操作系统 Windows 10 数据库 MySQL 8.0 Python 3.9.7 pip 21.3.1
1、安装pymysql
pymysql是封装了MySQL驱动的Python第三方库。
环境要求:Python version >= 3.4
在annaconda promt安装pymysql,输入
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
安装成功后,导入pymysql
import pymysql
2、创建连接对象,连接mysql数据库
使用pymysql的connect()方法创建数据库连接对象
pymysql.connect(**arg) 参数设置:
con=pymysql.connect(host='localhost',password='1234',port=3306,user='root',charset='utf8')
执行成功后,会返回一个连接对象con,我们就可以使用Python访问MySQL数据库了。 但是要向数据库发送SQL命令以及从数据库接收结果,还需要使用连接对象的cursor()方法来创建一个游标。
connection对象支持的方法:
3、创建游标对象
游标是Python和MySQL数据库交互的对象,只有引入游标后,才能在Python程序中调用SQL命令。 在上一步创建好连接对象con之后,只需要调用该连接对象的cursor()方法就可以创建游标。
cur=con.cursor()
执行成功后,会返回一个游标对象cur,用于执行SQL命令并返回MySQL的执行结果。 创建好游标对象,还需要使用该游标对象的execute()方法向MySQL发送SQL命令,MySQL服务器接收后解析SQL语句才能返回结果。
cursor对象支持的方法:
4、执行SQL命令
在上一步创建好游标对象cur之后,使用该游标对象的execute()方法来执行SQL语句。
cur.execute('show databases')
执行成功后,这条SQL语句会被发送到MySQL服务器,但是执行结果并不会立即显示,必须要请求结果。
5、获取执行结果
在上一步执行SQL命令后,需要使用游标对象的fetchone()、fetchmany()或fetchall()方法来返回执行结果。
cur.fetchone()
cur.fetchmany(2)
cur.fetchall()
需要注意的是fetchall()方法返回的是客户端缓冲区还没有被影响的记录,并且返回的数据类型是一个元组。
select查询数据
insert\update\delete更新数据
当使用insert\update\delete操作时,由于写数据库是一个开销很大的操作,所以数据库管理系统会缓存操作,然后再一次性应用全部写入,那么,刚刚写入的数据可能就访问不到。但是可以通过连接对象的commit()方法来强制写入数据库,这样就可以解决访问不到的问题。
6、关闭游标
Python与数据库的交互完成后,需要使用游标对象的close()方法关闭游标。
cur.close()
7、关闭连接
Python与数据库连接完毕后,需要使用连接对象的close()方法关闭连接。
con.close()
|