这一篇教程,我们一起来了解一些数据库相关的知识。
这里我们所接触的是关系型数据库。
当前主流的关系型数据库有Oracle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL。
那么,什么是关系型数据库?
关系型数据库,是指采用了关系模型来组织数据的数据库。关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。
这句话不好理解,看起来有些晕。
实际上,你可以把关系型数据库想象成一个Excel工作簿,工作簿的名称就相当于数据库的名称,工作簿中包含的工作表就是二维数据表。同一个工作簿中的工作表之间存在联系,从而形成了工作簿的数据组织。
除了要知道这些内容,我们还要了解一些相关的概念:
- 关系:可以理解为一张二维数据表,关系名就是数据表的名称。例如班级数据库中的成绩表。
- 元组:可以理解为二维数据表中的一行,它是数据库中的一条记录。例如成绩表中某一名学生的成绩记录。
- 属性:可以理解为二维数据表中的一列,它是数据库中的一个字段。例如成绩表中的学号。
- 域:是指属性的取值范围,也就是数据库中某一列的取值限制。例如某一成绩要在0~100之间。
- 关键字:是指一组可以唯一标识元组的属性。它是数据库中的主键,主键可以是一个或多个。例如学号是唯一的。
- 关系模式:是指对关系的描述,也就是数据库中的表结构。格式为:关系名(属性1,属性2,…)。例如:成绩表(学号,姓名,语文,数学)
了解了关系型数据库的一些基本概念,接下来我们来看如何使用关系型数据库。
作为一篇入门教程,我们从一个相对快捷、简单的数据库SQLite来入手。
Python官方文档中对SQLite的介绍如下:
SQLite是一个C语言库,它提供了一个轻量级的基于磁盘的数据库,不需要单独的服务器进程,并且允许使用SQL查询语言的非标准变体来访问数据库。一些应用程序可以使用SQLite进行内部数据存储。还可以使用SQLite对应用程序进行原型化,然后将代码移植到更大的数据库,如PostgreSQL或Oracle。
这个数据库不用单独安装,因为Python3中已经包含这个数据库引擎,并且在Python标准库中包含了对这个数据库进行操作的PySqlite模块(标准库中模块名为sqlite3),所以使用起来非常方便。
对于这个数据库的基本操作,在本篇教程中主要涉及以下内容:
- 创建/连接数据库
- 打开游标
- 创建表结构
- 操作数据(增、删、改、查)
- 提交事务
- 关闭游标链接
一、创建/连接数据库
不管是使用一个已有的数据库(.db文件),还是创建一个新的数据库,我们都需要和数据库进行连接。
然后通过连接对象进行后续操作。
这里我们可以使用connect()函数。
这个函数能够创建数据库连接对象,并且当数据库不存在时,创建新的数据库。
示例代码:(创建数据库student)
import sqlite3 conn = sqlite3.connect('student.db')
二、创建游标
当完成一个新数据库的创建,接下来就是在数据库中添加新的数据表以及表中的数据。
但是,创建表以及对表中数据的操作,我们都需要执行相应的SQL(Structured Query Language:结构化查询语言)语句。
而执行SQL语句,我们需要先打开游标,通过游标执行SQL语句。
示例代码:
cur = conn.cursor()
三、表结构
打开游标之后,我们就可以通过游标的execute()方法执行SQL(Structured Query Language:结构化查询语言)语句了。
这里我们创建成绩表“score”。
如果已存在同名数据表,会无法完成新数据表的创建,所以在创建之前,我们需要先删除已有的数据表,再创建新的数据表。
删除数据表的SQL语句为:DROP TABLE IF EXISTS 表名
创建数据表的SQL语句为:
CREATE TABLE 表名(
字段名 数据类型 PRIMARY KEY[主键,一个或多个字段],
字段名 数据类型 约束[可选],
……
字段名 数据类型
)
创建数据表时,我们需要定义表名,然后定义表中(括号中)的字段名、数据类型以及相关的约束。
关于数据类型,SQLite具有以下五种数据类型:
- NULL:空值。
- INTEGER:带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
- REAL:浮点数,存储为8-byte IEEE浮点数。
- TEXT:字符串文本。
- BLOB:二进制对象。
另外还要注意,被指定为主键的列,列值不可有重复。
除了数据类型,我们还可以给字段值添加约束,例如不能为空值、数值必须在某一区间等。
约束的类型包含以下几种:
- PRIMARY KEY:主键约束,唯一标识数据库表中的每条记录。
- NOT NULL:非空约束,确保某列不能有 NULL 值。
- DEFAULT:默认约束,当某列没有指定值时,为该列提供默认值。
- UNIQUE:唯一约束,确保某列中所有的值互不相同。
- CHECK:检查约束,确保某列中所有的值满足指定的条件。
那么,参照着上方的SQL语句知识,我们将删除表以及创建表结构的语句添加到代码中。
示例代码:(删除/创建表score)
cur.execute('DROP TABLE IF EXISTS score') cur.execute(''' CREATE TABLE score( StuId INTEGER PRIMARY KEY NOT NULL, StuName TEXT NOT NULL, ChineseScore REAL DEFAULT 0 CHECK(ChineseScore>=0 AND ChineseScore<=100), MathScore REAL DEFAULT 0 CHECK(MathScore>=0 AND MathScore<=100) ) ''')
上方代码中,表结构中共4个字段:
- StuId:学号,整数,主键,非空字段
- StuName:姓名,文本,非空字段
- ChineseScore:语文成绩,浮点数,默认值为0,值必须大于等于0并且小于等于100
- MathScore:数学成绩,浮点数,默认值为0,值必须大于等于0并且小于等于100
四、添加数据
通过之前的步骤,完成了表的创建,但这时还只是一个空表。
我们需要使用这个表存储数据,就要把数据添加到表中。
添加数据的SQL语句为:INSERT INTO 表名 [(列1,列2,…)] VALUES (值1,值2,…)
如果添加一行数据时,不指定仅为某些列添加数据,可以省略指定列的部分。
例如,为成绩表score添加一行数据:’INSERT INTO score VALUES(20712420205,”小楼”,100,100)’
注意:SQL语句中的值如果是字符串需要加上双引号。
接下来,我们将一个文本文档“score.txt”中的数据逐行读取,并添加到为这个数据表中。【点此下载】
文档的内容如下:
‘20712420001’,’吴陈’,92,93
‘20712420002’,’刘捷’,81,97
‘20712420003’,’万刚’,82,65
(省略部分内容)
如上所示,文档中每一行数据都是逗号分隔,学号和姓名带有单引号,语文成绩和数学成绩均为数字。
根据表中相应字段的数据类型,很明显学号带有引号,不符合INTEGER类型。
所以,我们需要在将每一行数据插入到数据表之前,先进行数据的修改,去除字段值两侧的单引号。
示例代码:
query = 'INSERT INTO score VALUES(?,?,?,?)' # 定义SQL语句 with open(r'C:\Users\Administrator\Desktop\score.txt') as file: # 打开文件 for line in file: # 读取文件每一行 values = [i.strip("'") for i in line.split(',')] # 以逗号为分隔符,将每一行内容变为值,去除单引号后存入列表。 conn.execute(query, values) # 将列表中的值代入SQL语句,并执行SQL语句。
上方代码中,定义SQL语句时使用了字段标记“?”,类似于格式化字符串时字符串中的“%”。
当我们使用execute()方法时,可以通过第2个可选参数parameters,将需要添加的值以列表的形式(代码中的values)传入。
五、提交事务
但是,当我们运行写好的代码,会发现数据表仍然是空表。
这是因为,我们只做了数据的修改,但是没有提交。
所以,我们还需要加上一句提交事务的代码。
示例代码:
conn.commit()
六、关闭游标与连接
当我们不再使用游标游标和连接,我们要确保它们正常的关闭。
示例代码:
cur.close() conn.close()
不过,如果程序发生异常,怎么确保它们被关闭了呢?
可以通过try:…except:…finally:…的处理,将关闭语句写在finally的语句块中。
示例代码:(完整代码)
import sqlite3 conn = sqlite3.connect('student.db') try: cur = conn.cursor() cur.execute('DROP TABLE IF EXISTS score') cur.execute(''' CREATE TABLE score( StuId INTEGER PRIMARY KEY NOT NULL, StuName TEXT NOT NULL, ChineseScore REAL DEFAULT 0 CHECK(ChineseScore>=0 AND ChineseScore<=100), MathScore REAL DEFAULT 0 CHECK(ChineseScore>=0 AND ChineseScore<=100) ) ''') query = 'INSERT INTO score VALUES(?,?,?,?)' # 定义SQL语句 with open(r'C:\Users\Administrator\Desktop\score.txt') as file: # 打开文件 for line in file: # 读取文件每一行 values = [i.strip("'") for i in line.split(',')] # 以逗号为分隔符,将每一行内容变为值,去除单引号后存入列表。 conn.execute(query, values) # 将列表中的值代入SQL语句,并执行SQL语句。 conn.commit() except: raise finally: cur.close() conn.close()
以上是本篇教程的内容,在下一篇教程中,我们来一起学习更多的数据库操作。
本节知识点:
1、关系型数据库简介;
2、SQLite数据库;
3、创建数据库与数据表;
4、添加数据到数据表。
本节英文单词与中文释义:
1、connect:连接
2、cursor:指针/游标
3、commit:提交
4、exist:存在
5、drop:放弃
6、table:表
7、create:创建
8、primary:主要的
9、unique:唯一的
10、check:检查
11、insert into:插入 到
12、score:分数
转载请注明:魔力Python » Python3萌新入门笔记(45)