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的记录已经被删除了。