本文将通过一个学生管理数据库系统的开发过程来展示如何系统地基于Python实现SQLite数据库编程。以下首先提出数据库系统的基本结构,以及如何通过SQLite逐步达到这些要求并进行常规操作。
01、数据表结构
该学生管理数据库系统包括4张表: 专业表、学生表、课程表和成绩表,用于实现对专业信息、学生信息、课程信息和成绩的综合管理。
1. 专业表
专业表包括专业编号和专业名称两个列,具体设置见表1。
■ 表1 专业表的结构
2. 学生表
学生表包括学号、姓名、性别、生日、专业编号、奖学金、党员、照片和备注等列,具体设置见表2。学生表中以专业编号作为外键,指向专业表中的专业编号,实施参照完整性。
■ 表2 学生表的结构
3. 课程表
课程表包括课程号、课程名称、先修课程代码、学时和学分等列,具体设置参见表3。
■ 表3 课程表的结构
4. 成绩表
成绩表包含学号、课程号和成绩三列,具体请参见表4。其中,学号和课程号共同构成为主键。该表中的学号是外键,指向学生表中的学号; 课程号是外键,指向课程表中的课程号,实施参照完整性。
■ 表4 成绩表的结构
02、学生管理数据库系统的实现
1. 数据准备
为了规范数据输入,分别用4个txt文档存储4张表原始数据。文档中的数据组织形式为: 列1值,列2值,…。以专业表为例,在对应的txt文档中,数据组织形式如下:
因此,在构建好相应的数据表结构之后,可方便地通过编写函数来统一地将txt文档中的数据导入对应数据表中。
2. 关键函数
为了减少数据库系统构建过程中代码的重复,应将可能重复执行的代码包装成函数。本系统开发中构建了以下函数。
(1) 数据表创建及数据导入函数: create_table()。
(2) 数据表结构查询函数: table_struct()。
(3) 数据表记录查询函数: table_quer()。
3. 数据库系统构建代码实现
在给出源代码之前,先简单介绍一下SQLite中的PRAGMA命令。PRAGMA是一个特殊的命令,可以查询SQLite中的非表数据,还可以修改SQLite中的参数设置。
下面给出学生管理数据库系统的实现代码。
#create stu db.py
#coding =utf-8
import sqlite3
#构建函数来实现数据表的创建及文本数据的导入
def create table(tab name, col prop list,txt path, conn, cur):
col name props =,'.join(col prop list)
cur.execute('CREATE TABLE IF NOT EXISTS %s(s)(tab name,col name props))
f = open(txt path,'r')
for x in f:
x = x.rstrip().split(',')
a=["%&s",%x[i] for iin range(len(x))]
x = ','.join(a);
cur.execute('INSERT INTO %s values(%s)(tab name,x))
f.close()
print('%s创建成功'% tab name)
print('%s导人成功'% txt path)
conn.commit()
#构建数据表结构查询函数
def table struct(cur, tab name):
cur.execute("PRAGMA table_info(%s)"% tab_name
t struct = cur.fetchall()
for item in t_struct:
for x in item:
x = str(x)
print(x,sep= '\t',end = '')
print()
#构建数据表内容查询函数
def table quer(cur,tab_name,col_names ='*',num_line = None):
cur.execute('select %s from %s%(col——names,tab_name))
Li = cur.fetchall()
for line in Li[:num_line]
for item in line:
print(item,sep='\'t,end = '')
print()
if_name__ == '_main_':
conn = sqlite3.connect('d:/test/Shift MIS.db')
cur = conn.cursor()
cur.execute(PRAGMA foreign keys = ON”)
#(1)创建专业表
tab name 1 = '专业表'
col_prop_list_1 =['专业编号 varchar(7) primary key''专业名称 varchar(7)]
txt_path_1 =专业表.txt'
create_table(tab_name_1,col prop list 1,txt_path_1,conn= conn,cur = cur)
#(2)创建学生表
tab_name_2= '学生表'
col_prop_list_2=['学号 varchar(7) primary key'
'姓名 varchar(7)'
'性别 tinyint'
'生日 text NULL'
'专业编号 varchar(7) REEERENCES 专业表(专业编号)ON UPDATE
CASCADE ON DELETE CASCADE',
奖学金 numeric NULL'
党员 tinvint NULL
照片 blob NULL'
备注 text NULL'
txt_path_2=学生表.txt
create_table(tab_name_2, col_prop list_2, txt_path_2,conn= conn,cur = cur)
#(3)创建课程表
tab_name_3 = '课程表'
col prop_1ist_3 = ['课程号varchar(7)primarvkev'
课程名称 varchar(7) NULL'
先修课程代码 varchar(7) NULL'
学时 smallint,学分 smallint']
txt_path_3 = '课程表.txt'
create_table(tab_name_3, col_prop_list_3,txt_path_3,conn = conn,cur = cur)
# (4)创建成绩表
tab_name_4 = '成绩表'
col_prop_list_4 =
['学号 varchar(7)REFERENCES 学生表(学号)ON UPDATE CASCADE ON DELETE CASCADE',课程号 varchar(7)REFERENCES 课程表(课程号)ON UPDATE CASCADE ON DELETE CASCADE',成绩 smallint NULL',
PRIMARY_KEY(学号,课程号)]
txt_path_4 = '成绩表.txt'
create_table(tab_name_4,col_prop_list_4,txt_path_4,conn = conn,cur = cur)
# 关闭链接
conn.close()
程序creat_stu_db.py的运行结果如下:
同时在“d: /test/”目录下生成数据库文件Shift_MIS.db。
4. 数据库操作
对于一个已经存在的数据库,需要先建立链接,然后通过该链接对数据库进行查询、修改等操作。例如:
由于后面需要用到create_stu_db.py文件中的相关函数,所以需要先导入该模块中的对象。
查询数据库中所有的数据表:
下面分别调用create_stu_db.py文件中定义的函数table_struct()和table_quer()查询各表的结构和表中的前10行记录。
1) 专业表查询
数据结构查询:
前10行数据查询:
2)学生表查询
数据结构查询:
前10行数据查询(包括学号、姓名、专业编号和奖学金):
3) 课程表查询
数据结构查询:
前10行数据查询:
4) 成绩表查询
数据结构查询:
前10行数据查询:
5) 综合查询
数据库创建成功之后,用户可以根据自己的需求,通过编写SQL语句进行相应的查询操作。例如,以下查询语句的执行将返回“国际贸易法”课程成绩大于或等于90分的学生的学号、姓名、课程名称和成绩,并按学号的升序排列。SQL语句如下:
>>>cur.execute(SELECT 学生表.学号,学生表.姓名,课程表.课程名称,成绩表.成绩EROM 学生表 JOIN 成绩表 JOIN 课程表
ON 学生表.学号=成绩表.学号 AND 课程表.课程号= 成绩表课程号
WHERE 成绩表成绩>= 90 and 课程表课程名称 =”国际贸易法"ORDER BY 学生表.学号 ASC''')
>>> for line in cur.fetchall():
for x in line:
print(x,sep= '\t',end = '')
print()
9706006 朱睿立 国际贸易法 90
9706012何英 国际贸易法 91
9706019 李辛怡 国际贸易法 93
9706025卜应龙 国际贸易法 94
9706026 龚晨晓 国际贸易法 93
9706028 王洁 国际贸易法 90
>>>
执行完数据库的相关操作后,通过以下代码关闭链接:
>>>conn.close()