- Python 3网络爬虫实战
- 胡松涛
- 1897字
- 2021-03-26 22:27:48
3.2 关系型数据库存储
关系型数据库典型的数据结构是表,数据库是由二维表及其之间的联系所组成的一个数据组织。关系型数据库的优点体现在以下几个方面:
- 易于维护:都是使用表结构,格式一致。
- 使用方便:SQL语言通用,可用于复杂查询。
- 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
不过关系型数据库也存在以下几个方面的缺点:
- 读写性能比较差,尤其是海量数据的高效率读写。
- 固定的表结构,灵活度稍微欠缺。
- 高并发读写需求,对传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
Python作为一种主流的编程语言,提供了对关系型数据库的支持。本节重点来介绍如何使用Python操作文本型关系数据库SQLite。
SQLite 3可使用sqlite3模块与Python进行集成。sqlite3模块是由Gerhard Haring编写的。该模块提供了一个与PEP 249描述的DB-API 2.0规范兼容的SQL接口。用户不需要单独安装该模块,因为Python 3.x版本默认自带了该模块。
SQLite常用方法及作用如表3-2所示。
表3-2 SQLite常用方法及作用
3.2.1 连接数据库
要使用数据库,首先需要连接到数据库。调用SQLite3的connect()方法即可连接到指定数据库,其语法格式如下:
sqlite3.connect(database [,timeout ,other optional arguments])
其中,参数database即为需要连接的目标数据库;参数timeout为指定超时设置;参数other optional arguments为其他参数设置。执行该方法将会连接到指定数据库,如果数据库不存在,就尝试创建一个。
以下示例将演示如何连接到数据库。
【示例3-13】连接到数据库
以上代码调用connect()方法对指定数据库进行连接,并在成功连接后输出相应内容。将以上代码保存为3-13.py,执行以上代码,其结果将会如图3-13所示,并且会在当前目录下生成名为my_db.db的数据库文件。
图3-13 连接到数据库
3.2.2 创建表
表是构成数据库的基本单元,连接数据库之后,就需要在数据库中创建表。要创建表,首先需要调用connection对象的cursor()方法创建一个游标(cursor)对象。然后调用游标对象的execute()方法执行建表的语句,在数据库中创建表。该方法的语法格式如下:
cursor.execute(sql [, optional parameters])
以上代码中的参数sql为需要执行的SQL语句,参数optional parameters为执行SQL语句时需要指定的其他参数。
最后还需要调用connection对象的commit()方法提交已经执行的操作,如果用户未调用该方法,那么自上一次调用commit()方法以来所执行的任何操作对数据库连接来说都是不可见的。因此执行增、删、改之类的操作之后,一定要调用该方法提交这些操作。
下面通过一个示例来说明如何在数据库中创建表。
【示例3-14】在数据库中创建表
以上代码调用cursor()方法创建一个游标,然后调用execute()方法执行创建表的SQL语句,最后调用commit()方法提交建表操作。执行以上代码将会在当前my_db.db数据库中创建一个名为USER的表。数据库中表的内容如图3-14所示。
图3-14 在数据库中创建表
注意
在创建表时,创建的表的名称不能与数据库中已经存在的表的名称相同,否则会出错。
3.2.3 插入数据
成功创建表之后,就需要向表中插入数据。仍然是调用游标对象的execute()方法执行插入数据的SQL语句,并在执行之后调用commit()方法提交这些操作,就可以实现向表中插入数据。
【示例3-15】向表中插入数据
以上代码通过execute()方法执行SQL语句向表中插入数据。执行代码之后,表中的内容如图3-15所示。
图3-15 向表中插入数据
3.2.4 浏览数据
执行遍历表中所有信息的语句即可实现浏览表中记录的功能,同样是执行execute()方法,执行相应的SQL语句即可。
【示例3-16】浏览表中的数据
import sqlite3 as sql con=sql.connect("my_db.db") c=con.cursor() rows=c.execute("SELECT * FROM USER") for r in rows: print("ID = ", r[0]) print("NAME = ", r[1]) print("ADDRESS = ", r[2]) print("SALARY = ", r[3], "\n") con.close()
以上代码通过execute()方法执行遍历所有记录的SQL语句以执行浏览数据的操作,然后通过for遍历所有结果集,并将内容输出。执行以上代码,其结果如图3-16所示。
图3-16 浏览表中的数据
3.2.5 修改数据
执行修改已有记录的SQL语句,可以实现对指定的记录进行修改,同样是执行execute()方法,执行相应的SQL语句即可。
【示例3-17】修改表中的数据
import sqlite3 as sql con=sql.connect("my_db.db") c=con.cursor() print("修改前第二条记录为:") rows=c.execute("SELECT * FROM USER WHERE id=2") for r in rows: print("ID = ", r[0]) print("NAME = ", r[1]) print("ADDRESS = ", r[2]) print("SALARY = ", r[3], "\n") c.execute("UPDATE USER SET ADDRESS='郑州' WHERE id=2") con.commit() print("修改后第二条记录为:") rows=c.execute("SELECT * FROM USER WHERE id=2") for r in rows: print("ID = ", r[0]) print("NAME = ", r[1]) print("ADDRESS = ", r[2]) print("SALARY = ", r[3], "\n") con.close()
以上代码通过execute()方法执行修改指定记录的SQL语句来执行修改表中数据的操作,执行以上代码,修改后的记录内容如图3-17所示。
图3-17 修改表中的数据
从图3-17可以看到,指定记录的一项内容由原来的“上海”变为了“郑州”。
3.2.6 删除数据
执行删除已有记录的SQL语句即可对指定的记录进行删除,通过execute()方法执行相应的删除记录的SQL语句即可。
这里需要注意,在删除记录前要确认记录已经不再需要,因为一旦删除,记录将无法恢复。
【示例3-18】删除表中的数据
import sqlite3 as sql import sqlite3 as sql con=sql.connect("my_db.db") c=con.cursor() print("删除前所有记录为:") rows=c.execute("SELECT * FROM USER") for r in rows: print(r, "\n") c.execute("DELETE FROM USER WHERE id=2") con.commit() print("删除第二条记录后所有内容为:") rows=c.execute("SELECT * FROM USER") for r in rows: print(r, "\n") con.close()
以上代码通过execute()方法执行删除指定记录的SQL语句来执行修改表中数据的操作,执行以上代码,删除前后的记录内容如图3-18所示。
图3-18 删除表中的数据
查看图3-18的执行结果,对比删除操作前后的内容,可以看到ID为2的记录已经被删除了。