天天看点

Python学习笔记 | 使用SQLite3模块灵活高效实现小型数据库应用

常见的数据库系统都比较庞大且操作复杂,需要在目标电脑上安装数据库软件才能够正常使用,通常应用于大型数据库项目开发。而一些小型数据信息管理项目,数据量小,不需要过高的安全强度,如果使用大型数据库来开发就显得大材小用了,无形中还增添了开发难度。

正是基于这种情况,Python语言内置了 一套轻量级数据库系统,具有小巧、高效、可靠的优点,能够满足很大一部分人的开发需求!

Python学习笔记 | 使用SQLite3模块灵活高效实现小型数据库应用

一、SQLite3模块简介

SQLite3是Python的一个内置模块,是一套开源嵌入式关系数据库系统,它不需要独立的服务器进程,数据库就是一个.db后缀的文件,可以跨平台直接访问,非常便捷。详细特点如下:

  • 无需安装、零配置、不需要启动服务
  • 不需要单独文件系统,数据库存储在单一文件中
  • 支持事务操作
  • 服务器和客户端在同一进程空间运行,不需要独立的服务器进程
  • 小巧,灵活,高效,可靠

二、SQLite3模块的使用方法

1、基本步骤

  • 导入SQLite3模块
  • 连接数据库
  • 创建游标对象
  • 编写SQL语句
  • 执行SQL语句
  • 提交事务
  • 关闭游标
  • 关闭数据库连接

演示代码如下:

# 导入sqlit3模块
import sqlite3

# 创建连接,新建或打开数据库
conn = sqlite3.connect('demo.db')

# 创建游标对象
cur = conn.cursor()

# 编制SQL语句,创建一个包含三个字段的表,其中pno是自动递增的,不需要输入
sql = '''create table if not exists t_person(
        pno INTEGER primary key autoincrement,
        pname VARCHAR not null,
        age INTEGER)'''

# 执行sql语句,编写sql语句很容易出错,因此采取异常处理
try:
    cur.execute(sql)  # 执行sql语句
    print('创建表成功!')
except Exception as err:
    print(err)
    print('创建表失败!')
finally:
    cur.close()  # 关闭游标
    conn.close()  # 关闭连接           

2、向表中插入数据

import sqlite3

conn = sqlite3.connect('demo.db')
cur = conn.cursor()

# t_person(pname,age)表示向这两个字段插入数据,values(?,?)里的问号是先占位
# 在调用时再给出具体值,这样处理不仅灵活,还可以防止sql注入
sql = 'insert into t_person(pname,age) values (?,?)'

try:
    cur.execute(sql, ('张三', 23))  # 插入一行数据
    cur.executemany(sql,[('李四',24),('王五',22),('赵六',25)])  # 插入多行数据
    conn.commit()  # 提交事务,向表中写入
    print('插入数据成功!')
except Exception as err:
    print(err)
    print('插入数据失败!')
    conn.rollback()  # 事务回滚,返回到执行sql语句前的状态
finally:
    cur.close()
    conn.close()           

3、从表中读取数据

import sqlite3

conn = sqlite3.connect('demo.db')
cur = conn.cursor()
sql = 'select * from t_person'

try:
    cur.execute(sql)
    # fetchall方法用于取得所有结果,fetchone是取得一条结果
    result = cur.fetchall()
    for i in result:
        print(i)
except Exception as err:
    print(err)
    print('查询失败!')
finally:
    cur.close()
    conn.close()           

4、修改表中数据

import sqlite3

conn = sqlite3.connect('demo.db')
cur = conn.cursor()
sql = 'update t_person set age=? where pno=?'
try:
    cur.execute(sql, (26, 1))  # 修改指定序号的年龄内容
    conn.commit()
    print('修改数据成功!')
except Exception as err:
    print(err)
    print('修改数据失败!')
    conn.rollback()
finally:
    cur.close()
    conn.close()           

5、删除表中数据

import sqlite3

conn = sqlite3.connect('demo.db')
cur = conn.cursor()
sql = 'delete from t_person where pno=?'  # 删除指定序号的一行数据
try:
    cur.execute(sql, (2,))  # 元组只有一个值时,必须在值后面加逗号
    conn.commit()
    print('删除数据成功!')
except Exception as err:
    print(err)
    print('删除数据失败!')
    conn.rollback()
finally:
    cur.close()
    conn.close()           

6、其它常用操作

  • 查询数据库中包含的所有表
import sqlite3

conn = sqlite3.connect('demo.db')
cur = conn.cursor()

sql = 'select name from sqlite_master where type="table"'
cur.execute(sql)
tables = cur.fetchall()
print(tables)           
  • 删除数据库中的表
cur.execute('drop table tablename')           
  • 查询表结构
cur.execute('pragma table_info(t_person)')
print(cur.fetchall())           
  • 查询前10条记录
cur.execute('select * from t_person limit 0,10')           
  • 查询表中不重复字段
cur.execute('select distinct pname from t_person')           

7、技巧分享

当创建了数据库之后,在pycharm界面左侧边栏当前项目下方会显示数据库名称,鼠标左键双击需要操作的数据库名称,就会弹出数据库控制台console窗口,在这个窗口里面就可以直接输入SQL语句,点击控制台窗口的左上角的绿色运行按钮就会执行SQL语句,用来调试数据库非常方便,免得反复写完整的python代码进行调试输出。

并且,在数据库控制台里书写SQL代码时,会有代码辅助提示,免得记不住关键字而反复查阅。可以在控制台里书写并调试SQL语句,然后再将SQL语句复制粘贴到程序代码中,方便快捷,确保代码执行无误!

数据库控制台界面如下:

Python学习笔记 | 使用SQLite3模块灵活高效实现小型数据库应用

SQL控制台界面

三、综合实例

现在对上一篇“办公自动化之使用python-docx模块操作Word文档”中的综合实例进行改良,这里要求从员工档案里提取相关信息,写入到数据库中进行管理。案例如下:

某公司有几十或几百员工,每名员工都有一份word文档的档案信息表,文档格式均相同,见下图:

Python学习笔记 | 使用SQLite3模块灵活高效实现小型数据库应用

个人档案信息表

现在想建立一个数据库,用于管理人员基本信息,要求内容有姓名、性别、出生年月等8项内容,这些内容在员工档案信息表里都有,如果采取向数据库里录入的形式,工作量太大,还容易出错,这里用程序来实现!

代码如下:

import sqlite3
from docx import Document
from pathlib import Path


# 自定义函数,返回word表格指定行列的单元格内容
def result(row, col):
    cell = table.rows[row].cells
    return cell[col].text


# 创建数据库,库名dossier.db,表名t_person
# 字段:pno序号,pname姓名,gender性别,birth出生年月,nation民族,parth入党时间,job参加工作事件,pro职称,school毕业院校
conn = sqlite3.connect('dossier.db')
cur = conn.cursor()
sql = '''create table if not exists t_person(pno INTEGER primary key autoincrement,
        pname VARCHAR not null,gender VARCHAR,birth VARCHAR,nation VARCHAR,parth VARCHAR,
        job VARCHAR,pro VARCHAR,school VARCHAR)'''
try:
    cur.execute(sql)
except Exception as err:
    print(err)
    print('创建表失败!')

# 获取所有档案信息文件名
path = Path('档案信息')  # 创建路径对象
files = list(path.glob('*.docx'))  # 遍历指定路径下所有docx文件,并转换成列表

# 从个人档案文件中读取相关信息并写入到数据库中
for file in files:  # 遍历有得到的所文件
    doc = Document(file)  # 打开文档
    table = doc.tables[0]  # 指定读取的表格
    # 利用自定义函数result读取文档中指定位置的内容,放置到元组中
    person =(result(0, 1), result(0, 3), result(0, 5), result(1, 1), result(2, 1), result(2, 3), result(3, 1),
           result(4, 5))

    # 将个人信息写入到数据库中
    sql = 'insert into t_person(pname,gender,birth,nation,parth,job,pro,school) values (?,?,?,?,?,?,?,?)'
    try:
        cur.execute(sql, person)  # 插入一行数据
        conn.commit()  # 提交事务,向表中写入
    except Exception as err:
        print(err)
        print('插入数据失败!')
        conn.rollback()  # 事务回滚,返回到执行sql语句前的状态

# 关闭数据库相关对象
cur.close()
conn.close()
print('数据写入完毕!!!')           

程序执行后,生成数据库,查看表内容如下:

Python学习笔记 | 使用SQLite3模块灵活高效实现小型数据库应用

新建的人员信息表