Python 使用Python操作数据库

程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,前面我们学习了将数据写入文件,保存在磁盘上。为了便于程序保存和读取数据,并能直接通过条件快速查询到指定的数据,数据库(Database)这种专门用于集中存储和查询的软件应运而生。

11.1.1 连接对象
数据库连接对象(Connection Object)主要提供获取数据库游标对象和提交、回滚事务的方法,以及关闭数据库连接。

1.获取连接对象
如何获取连接对象呢?这就需要使用connect()函数。该函数有多个参数,具体使用哪个参数,取决于使用的数据库类型。例如,需要访问Oracle数据库和MySQL数据库,则必须同时下载Oracle和MySQL数据库模块。这些模块在获取连接对象时,都需要使用connect()函数。connect()函数常用的参数及说明如表所示。

Python 使用Python操作数据库_第1张图片

 例如,使用PyMySQL模块连接MySQL数据库,示例代码如下:

conn = pymysql.connect(host='localhost',

                      user='user',

                      password='passwd',

                      db='test',

                      charset='utf8',

                      cursorclass=pymysql.cursors.DictCursor)

说明:上述代码中,pymysql.connect()使用的参数与表中并不完全相同。在使用时,要以具体的数据库模块为准。

2.连接对象的方法
Connect()函数返回连接对象。这个对象表示目前和数据库的会话,连接对象支持的方法如表所示。

Python 使用Python操作数据库_第2张图片

commit()方法用于提交事务,事务主要用于处理数据量大、复杂度高的数据。如果操作的是一系列的动作,比如张三给李四转账,有如下2个操作:

■ 张三账户金额减少■ 李四账户金额增加
这时使用事务可以维护数据库的完整性,保证2个操作要么全部执行,要么全部不执行。 

11.1.2 游标对象
游标对象(Cursor Object)代表数据库中的游标,用于指示抓取数据操作的上下文,主要提供执行SQL语句、调用存储过程、获取查询结果等方法。
如何获取游标对象呢?通过使用连接对象的cursor()方法,可以获取到游标对象。

游标对象的属性如下所示:

■ description:数据库列类型和值的描述信息。

■ rowcount:回返结果的行数统计信息,如SELECT、UPDATE、CALLPROC等。
游标对象的方法如表所示。

Python 使用Python操作数据库_第3张图片

 11.2 使用SQLite
与许多其他数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是一种嵌入式数据库,它的数据库就是一个文件。SQLite将整个数据库,包括定义、表、索引以及数据本身,作为一个单独的、可跨平台使用的文件存储在主机中。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中。

11.2.1 创建数据库文件
由于Python中已经内置了SQLite3,所以可以直接使用import语句导入SQLite3模块。Python操作数据库的通用的流程如图所示。

Python 使用Python操作数据库_第4张图片

 实例01 创建SQLite数据库文件
创建一个mrsoft.db的数据库文件,然后执行SQL语句创建一个user(用户表),user表包含id和name两个字段。具体代码如下:

01 import sqlite3

02 # 连接到SQLite数据库

03 # 数据库文件是mrsoft.db,如果文件不存在,会自动在当前目录创建

04 conn = sqlite3.connect('mrsoft.db')

05 # 创建一个Cursor

06 cursor = conn.cursor()

07 # 执行一条SQL语句,创建user表

08 cursor.execute('create table user (id int(10) primary key, name varchar(20))')

09 # 关闭游标

10 cursor.close()

11 # 关闭Connection

12 conn.close()
上述代码中,使用sqlite3.connect()方法连接SQLite数据库文件mrsoft.db,由于mrsoft.db文件并不存在,所以会在本实例Python代码同级目录下创建mrsoft.db文件,该文件包含了user表的相关信息。

说明:再次运行实例01时,会提示错误信息:sqlite3.OperationalError:table user alread exists,这是因为user表已经存在。

11.2.2 操作SQLite
1.新增用户数据信息
为了向数据表中新增数据,可以使用如下SQL语句:insert into 表名(字段名1,字段名2,…,字段名n) values (字段值1,字段值2,…,字段值n)
在user表中,有2个字段,字段名分别为id和name。而字段值需要根据字段的数据类型来赋值,如id是一个长度为10的整型,name是长度为20的字符串型数据。向user表中插入3条用户信息记录,则SQL语句如下:

cursor.execute('insert into user (id, name) values ("1", "MRSOFT")')

cursor.execute('insert into user (id, name) values ("2", "Andy")')

cursor.execute('insert into user (id, name) values ("3", "明日科技小助手")')

实例02 新增用户数据信息
由于在实例01中已经创建了user表,所以本实例可以直接操作user表,向user表中插入3条用户信息。此外,由于是新增数据,需要使用commit()方法提交事务。因为对于增加、修改和删除操作,使用commit()方法提交事务后,如果相应操作失败,可以使用rollback()方法回滚到操作之前的状态。新增用户数据信息具体代码如下:

01 import sqlite3

02 # 连接到SQLite数据库

03 # 数据库文件是mrsoft.db

04 # 如果文件不存在,会自动在当前目录创建

05 conn = sqlite3.connect('mrsoft.db')

06 # 创建一个Cursor

07 cursor = conn.cursor()

08 # 执行一条SQL语句,插入一条记录

09 cursor.execute('insert into user (id, name) values ("1", "MRSOFT")')

10 cursor.execute('insert into user (id, name) values ("2", "Andy")')

11 cursor.execute('insert into user (id, name) values ("3", "明日科技小助手")')

12 # 关闭游标

13 cursor.close()

14 # 提交事务

15 conn.commit()

16 # 关闭Connection

17 conn.close()
运行该实例,会向user表中插入3条记录。为验证程序是否正常运行,可以再次运行,如果提示如下信息,说明插入成功(因为user表中已经保存了上一次插入的记录,所以再次插入会报错)。sqlite3.IntegrityError: UNIQUE constraint failed: user.id

2.查看用户数据信息
查找user表中的数据可以使用如下SQL语句:select 字段名1,字段名2,字段名3,… from 表名 where 查询条件
查看用户信息的代码与插入数据信息大致相同,不同点在于使用的SQL语句不同。

此外,查询数据时通常使用如下3种方式:

■ fetchone():获取查询结果集中的下一条记录。

■ fetchmany(size):获取指定数量的记录。

■ fetchall():获取结果集的所有记录。

实例03 使用3种方式查询用户数据信息

分别使用fetchone、fetchmany和fetchall这3种方式查询用户信息,具体代码如下:

01 import sqlite3

02 # 连接到SQLite数据库,数据库文件是mrsoft.db

03 conn = sqlite3.connect('mrsoft.db')

04 # 创建一个Cursor

05 cursor = conn.cursor()

06 # 执行查询语句

07 cursor.execute('select * from user')

08 # 获取查询结果

09 result1 = cursor.fetchone()

10 print(result1)

11

12 # 关闭游标

13 cursor.close()

14 # 关闭Connection

15 conn.close()

使用fetchone()方法返回的result1为一个元组,执行结果如下:(1,'MRSOFT')

(1)修改实例03代码,将获取查询结果的语句块代码修改为:result2 = cursor.fetchmany(2) # 使用fetchmany方法查询多条数据print(result2)

使用fetchmany()方法传递一个参数,其值为2,默认为1。返回的result2为一个列表,列表中包含2个元组,运行结果如下:[(1,'MRSOFT'),(2,'Andy')]

(2)修改实例03代码,将获取查询结果的语句块代码修改为:result3 = cursor.fetchall() # 使用fetchmany方法查询多条数据print(result3)

使用fetchall()方法返回的result3为一个列表,列表中包含所有user表中数据组成的元组,运行结果如下:[(1,'MRSOFT'),(2,'Andy'),(3,'明日科技小助手')]

(3)修改实例03代码,将获取查询结果的语句块代码修改为:cursor.execute('select * from user where id > ?',(1,))

result3 = cursor.fetchall()print(result3)

在select查询语句中,使用问号作为占位符代替具体的数值,然后使用一个元组来替换问号(注意,不要忽略元组中最后的逗号)。上述查询语句等价于:

cursor.execute('select * from user where id > 1')

执行结果如下:[(2,'Andy'),(3,'明日科技小助手')]说明:使用占位符的方式可以避免SQL注入的风险,推荐使用这种方式。

3.修改用户数据信息

修改user表中的数据可以使用如下SQL语句:update 表名 set 字段名 = 字段值 where 查询条件

实例04 修改用户数据信息

将SQLite数据库中user表ID为1的数据name字段值“mrsoft”修改为“MR”,并使用fetchAll获取表中的所有数据。具体代码如下:

01 import sqlite3

02 # 连接到SQLite数据库,数据库文件是mrsoft.db

03 conn = sqlite3.connect('mrsoft.db')

04 # 创建一个Cursor:

05 cursor = conn.cursor()

06 cursor.execute('update user set

name = ? where id = ?',('MR',1))

07 cursor.execute('select * from user')

08 result = cursor.fetchall()

09 print(result)

10 # 关闭游标

11 cursor.close()

12 # 提交事务

13 conn.commit()

14 # 关闭Connection:

15 conn.close()

执行结果如下:[(1, 'MR'), (2, 'Andy'), (3, '明日科技小助手')]

4.删除用户数据信息

删除user表中的数据可以使用如下SQL语句:delete from 表名 where 查询条件

 实例05 删除用户数据信息

将SQLite数据库中user表ID为1的数据删除,并使用fetchAll获取表中的所有数据,查看删除后的结果。具体代码如下:

01 import sqlite3

02 # 连接到SQLite数据库,数据库文件是mrsoft.db

03 conn = sqlite3.connect('mrsoft.db')

04 # 创建一个Cursor:

05 cursor = conn.cursor()

06 cursor.execute('delete from user where id = ?',(1,))

07 cursor.execute('select * from user')

08 result = cursor.fetchall()

09 print(result)

10 # 关闭游标

11 cursor.close()

12 # 提交事务

13 conn.commit()

14 # 关闭Connection:

15 conn.close()

执行上述代码后,user表中ID为1的数据将被删除。运行结果如下:[(2, 'Andy'), (3, '明日科技小助手')]

11.3 使用MySQL

11.3.1 下载安装MySQL

MySQL是一款开源的数据库软件,由于其免费特性得到了全世界用户的喜爱,是目前使用人数最多的数据库。

1.下载MySQL

(1)在浏览器的地址栏中输入地址“https://dev.mysql.com/downloads/windows/installer/8.0.html”,并按下键,将进入到当前最新版本MySQL 8.0的下载

页面,选择离线安装包,单击“Download”按钮下载,进入开始下载页面,如果有MySQL的账户,可以单击Login按钮,登录账户后下载,如果 没有可以直接单击

下方的“No thanks, just start my download.”超链接,跳过注册步骤,直接下载。

2.安装MySQL

下载完成以后,开始安装MySQL。双击安装文件,在安装界面中勾选“I accept the license terms”,点击“next”,进入选择设置类型界面。

在选择设置中有5种类型,说明如下:

■ Developer Default:安装MySQL服务器以及开发MySQL应用所需的工具。工具包括开发和管理服务器的GUI工作台、访问操作数据的Excel插件、与Visual Studio集成开发的插件、通过NET/Java/C/C++/OBDC等访问数据的连接器、例子和教程、开发文档。

■ Server only:仅安装MySQL服务器,适用于部署MySQL服务器。

■ Client only:仅安装客户端,适用于基于已存在的MySQL服务器进行MySQL应用开发的情况。

■ Full:安装MySQL所有可用组件。

■ Custom:自定义需要安装的组件。

MySQL会默认选择“Developer Default”类型,这里选择“Server only”类型,选择默认选项,单击“Next”按钮进行安装。

3.设置环境变量

安装完成以后,默认的安装路径是“C:\Program Files\MySQL\MySQL Server 8.0\bin”。下面设置环境变量,以便在任意目录下使用MySQL命令。右键单击“计算

机”→选择“属性”,打开控制面板主页,选择“高级系统设置”→选择“环境变量”→选择“PATH”→单击“编辑”。将“C:\Program Files\MySQL\MySQL Server 8.0\bin”

写在变量值中。

4.启动MySQL

使用MySQL数据库前,需要先启动MySQL。在cmd窗口中,输入命令行“net start mysq180”,来启动MySQL 8.0。启动成功后,使用账户和密码进入MySQL。输

入命令“mysql –u root -p”,接着提示“Enter password:”,输入密码,即可进入MySQL。

Python 使用Python操作数据库_第5张图片

 5.使用Navicat for MySQL管理软件

在命令提示符下操作MySQL数据库的方式对初学者并不友好,而且需要有专业的SQL语言知识,所以各种MySQL图形化管理工具应运而生,其中Navicat for

MySQL就是一个广受好评的桌面版MySQL数据库管理和开发工具。它使用图形化的用户界面,可以让用户使用和管理更为轻松。

官方网址:https://www.navicat.com.cn。

首先下载、安装Navicat for MySQL,然后新建MySQL连接

Python 使用Python操作数据库_第6张图片

 接下来,输入连接信息:输入连接名“studyPython”,输入主机名后IP地址“localhost”或“127.0.0.1”,输入密码为“root”,如图所示。

Python 使用Python操作数据库_第7张图片

单击“确定”按钮,创建完成。此时,双击“localhost”,即进入“localhost”数据库,如图所示。

Python 使用Python操作数据库_第8张图片

 下面使用Navicat 创建一个名为“mrsoft”的数据库,步骤为:右键单击“studyPython”→选择“新建数据库”→填写数据库信息。

Python 使用Python操作数据库_第9张图片

 11.3.2 安装PyMySQL

由于MySQL服务器以独立的进程运行,并通过网络对外服务,所以,需要支持Python的MySQL驱动来连接到MySQL服务器。在Python中支持MySQL的数据库模

块有很多,我们选择使用PyMySQL。

PyMySQL的安装比较简单,在cmd中执行如下命令:pip install PyMySQL

11.3.3 连接数据库

使用数据库的第一步是连接数据库。接下来使用PyMySQL连接数据库。由于PyMySQL也遵循Python Database API 2.0规范,所以操作MySQL数据库的方式与

SQLite相似。我们可以通过类比的方式来学习。

实例06 使用PyMySQL连接数据库

前面我们已经创建了一个MySQL连接“studyPython”,并且在安装数据库时设置了数据库的用户名“root”和密码“root”。

下面通过connect()方法连接MySQL数据库mrsoft,具体代码如下:

01 import pymysql

02

03 # 打开数据库连接,参数1:主机名或IP;参数2:用户名;参数3:密码;参数4:数据库名称

04 db = pymysql.connect("localhost", "root", "root", "mrsoft")

05 # 使用cursor()方法创建一个游标对象cursor

06 cursor = db.cursor()

07 # 使用execute()方法执行SQL查询

08 cursor.execute("SELECT VERSION()")

09 # 使用fetchone()方法获取单条数据

10 data = cursor.fetchone()

11 print ("Database version : %s " % data)

12 # 关闭数据库连接

13 db.close()

上述代码中,首先使用connect()方法连接数据库,然后使用cursor()方法创建游标,接着使用execute()方法执行SQL语句查看MySQL数据库版本,然后使用

fetchone()方法获取数据,最后使用close()方法关闭数据库连接。执行结果如下:Database version : 8.0.21-log

11.3.4 创建数据表

数据库连接成功以后,我们就可以为数据库创建数据表了。下面通过一个实例,使用execute()方法来为数据库创建表books图书表。

实例07 创建books图书表
books表包含id(主键)、name(图书名称),category(图书分类),price(图书价格)和publish_time(出版时间)5个字段。创建books表的SQL语句如下:

CREATE TABLE books (

  id int(8) NOT NULL AUTO_INCREMENT,

  name varchar(50) NOT NULL,

  category varchar(50) NOT NULL,

  price decimal(10,2) DEFAULT NULL,

  publish_time date DEFAULT NULL,

  PRIMARY KEY (id)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

在创建数据表前,使用如下语句:DROP TABLE IF EXISTS `books`;

如果mrsoft数据库中已经存在books,那么先删除books,然后再创建books数据表。具体代码如下:

01 import pymysql

02

03 # 打开数据库连接

04 db = pymysql.connect("localhost", "root", "root", "mrsoft")

05 # 使用cursor()方法创建一个游标对象cursor

06 cursor = db.cursor()

07 # 使用 execute()方法执行SQL,如果表存在则删除

08 cursor.execute("DROP TABLE IF EXISTS books")

09 # 使用预处理语句创建表

10 sql = """

11 CREATE TABLE books (

12   id int(8) NOT NULL AUTO_INCREMENT,

13   name varchar(50) NOT NULL,

14   category varchar(50) NOT NULL,

15   price decimal(10,2) DEFAULT NULL,

16   publish_time date DEFAULT NULL,

17   PRIMARY KEY (id)

18 ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

19 """

20 # 执行SQL语句

21 cursor.execute(sql)

22 # 关闭数据库连接

23 db.close()

运行上述代码后,mrsoft数据库下就已经创建了一个books表。打开Navicat(如果已经打开,则按下键刷新),发现mrsoft数据库下多了一个books表,右键

单击books,选择设计表,效果如图所示。

Python 使用Python操作数据库_第10张图片

 11.3.5 操作MySQL数据表

MySQL数据表的操作主要包括数据的增删改查,与操作SQLite类似,这里我们通过一个实例讲解如何向books表中新增数据,至于修改、查找和删除数据则不再赘

述。

实例08 向books图书表添加图书数据

在向books图书表中插入图书数据时,可以使用excute()方法添加一条记录,也可以使用executemany()方法批量添加多条记录,executemany()方法的语法格式如下:executemany(operation, seq_of_params)

■ operation:操作的SQL语句。■ seq_of_params:参数序列。
executemany()方法批量添加多条记录的具体代码如下:

01 import pymysql

02

03 # 打开数据库连接

04 db = pymysql.connect("localhost", "root", "root", "mrsoft",charset="utf8")

05 # 使用cursor()方法获取操作游标

06 cursor = db.cursor()

07 # 数据列表

08 data = [("零基础学Python",'Python','79.80','2018-5-20'),

09         ("Python从入门到精通",'Python','69.80','2018-6-18'),

10         ("零基础学PHP",'PHP','69.80','2017-5-21'),

11         ("PHP项目开发实战入门",'PHP','79.80','2016-5-21'),

12         ("零基础学Java",'Java','69.80','2017-5-21'),

13         ]

14 try:

15     # 执行sql语句,插入多条数据

16     cursor.executemany("insert into books(name, category, price, publish_time) values (%s,%s,%s,%s)", data)

17     # 提交数据

18     db.commit()

19 except:

20     # 发生错误时回滚

21     db.rollback()

22

23 # 关闭数据库连接

24 db.close()注意:

(1)使用connect()方法连接数据库时,额外设置字符集charset=utf-8,可以防止插入中文时出错。

(2)在使用insert语句插入数据时,使用%s作为占位符,可以防止SQL注入。

运行上述代码,在Navicat中查看books表数据,如图所示。

Python 使用Python操作数据库_第11张图片

 11.5 小结
本章主要介绍了使用Python操作数据库的基础知识。通过本章的学习,读者能够理解Python数据库编程接口,掌握Python操作数据库的通用流程及数据库连接对象的常用方法,并具备独立完成设计数据库的能力。

你可能感兴趣的:(Python,python)