常见的数据库系统都比较庞大且操作复杂,需要在目标电脑上安装数据库软件才能够正常使用,通常应用于大型数据库项目开发。而一些小型数据信息管理项目,数据量小,不需要过高的安全强度,如果使用大型数据库来开发就显得大材小用了,无形中还增添了开发难度。
正是基于这种情况,Python语言内置了 一套轻量级数据库系统,具有小巧、高效、可靠的优点,能够满足很大一部分人的开发需求!
SQLite3是Python的一个内置模块,是一套开源嵌入式关系数据库系统,它不需要独立的服务器进程,数据库就是一个.db后缀的文件,可以跨平台直接访问,非常便捷。详细特点如下:
1、基本步骤
演示代码如下:
# 导入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 sqlite3conn = 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 sqlite3conn = 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 sqlite3conn = 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 sqlite3conn = 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 sqlite3conn = 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())
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-docx模块操作Word文档”中的综合实例进行改良,这里要求从员工档案里提取相关信息,写入到数据库中进行管理。案例如下:
某公司有几十或几百员工,每名员工都有一份word文档的档案信息表,文档格式均相同,见下图:
现在想建立一个数据库,用于管理人员基本信息,要求内容有姓名、性别、出生年月等8项内容,这些内容在员工档案信息表里都有,如果采取向数据库里录入的形式,工作量太大,还容易出错,这里用程序来实现!
代码如下:
import sqlite3from docx import Documentfrom 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('数据写入完毕!!!')
程序执行后,生成数据库,查看表内容如下: