嵌入式数据库的名称来自其独特的运行模式。这种数据库嵌入了应用程序进程中,消除了与客户机/服务器配置相关的开销。嵌入式数据库实际上是轻量级的,在运行时需要较少的内存。嵌入式数据库是使用精简代码编写的,对于嵌入式设备而言,其运行速度更快,效果更理想。
嵌入式运行模式允许嵌入式数据库通过 SQL 来轻松管理应用程序数据,而不依靠原始的文本文件。最为常见的嵌入式数据库是 SQLite 数据库。SQLite 是一个嵌入式数据库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上广泛部署的 SQL 数据库引擎。
Python 操作 SQLite 数据库同操作 XML 一样,直接引用 SQLite3 类,不需要在 PyCharm 中进行安装。
Python使用execute()方法创建SQLite数据库文件
创建 student.db 数据库文件,并创建 Mstudent 数据表(包括 id、name、age、xuehao、banji 几个字段),代码如下:
import sqlite3
#连接到SQLite数据库
#如果文件不存在,则会自动在当前目录下创建该文件
conn = sqlite3.connect('student.db')
#创建一个游标对象
cursor = conn.cursor()
#创建Mstudent数据表
cursor.execute('create table Mstudent(id int(10) primary key, name varchar(50), age varchar(50), xuehao varchar(50), banji varchar(50))')
#关闭游标
cursor.close()
#关闭数据库连接
conn.close()
在连接 SQLite 数据库的过程中,首先判断对应的数据库文件是否存在,如果不存在则会自动创建该数据库文件,然后在此数据库中进行操作。
Python操作SQLite数据库
对 SQLite 数据库的操作包括增、删、改、查,与操作 MySQL 数据库类似。在这里主要讲解如何向 Mstudent 数据表中新增数据和查找数据,删除和修改操作请读者自行实践。新增数据的代码如下:
import sqlite3
#连接到 SQLite 数据库
conn = sqlite3.connect('student.db')
#创建一个游标对象
cursor = conn.cursor()
#继续执行一条SQL语句,插入一条记录
cursor.execute('insert into Mstudent(id, name, age, xuehao, banji) values("1", "zhangsan1", "20", "180901", "1809")')
conn.commit ()
#数据列表
data = [("2", "zhangsan2", "20", "180902", "1809"),
("3", "zhangsan3", "20", "180903", "1809"),
("4", "zhangsan4", "20", "180904", "1809"),
]
try:
#执行SQL语句,插入多条数据
cursor.executemany ("insert into Mstudent(id, name, age, xuehao,banji) values(?, ?, ?, ?, ?)", data)
#提交数据
conn.commit()
except:
#发生错误回滚
conn.rollback()
#关闭游标
cursor.close()
#提交事务
conn.commit()
#关闭数据库连接
conn.close()
从上述代码中可以看到,如果只提交一条数据,则可以使用 execute( ) 方法;如果要批量提交数据,则需要使用 executemany( ) 方法。在批量提交数据时要注意使用事务提交,避免数据提交失败,产生不可控的结果。
由编程接口 API 可以知道,查找数据有 3 种方法,分别为 fetchone( )、fetchmany(size)、fetchall( )。下面通过一个示例学习这 3 种方法,代码如下:
import sqlite3
#连接到 SQLite 数据库
conn = sqlite3.connect('student.db')
#创建一个游标对象
cursor = conn.cursor()
#继续执行一条SQL语句,插入一条记录
cursor.execute('select * from Mstudent')
#fetchone()方法
result1=cursor.fetchone()
print ("result1=",result1)
#fetchmany(size)方法
cursor.execute('select * from Mstudent')
result2=cursor.fetchmany(3)
print("result2=", result2)
#frfetchall()方法
cursor.execute('select * from Mstudent')
result3=cursor.fetchall()
print("result3",result3)
#关闭游标
cursor.close()
#关闭数据库连接
conn.close()
程序运行结果为:
result1=(1, 'zhangsan1', 20, '180901', '1809')
result2=[(1, 'zhangsan1', 20, '180901', '1809'), (2, 'zhangsan2', 20, '180902', '1809')]
result3 [(1, 'zhangsan1', 20, '180901', '1809'), (2, 'zhangsan2', 20, '180902', '1809'), (4, 'zhangsan4', 20, '180904', '1809')]
从运行结果中比较直观地看到,fetchone( ) 方法获取到一条记录,fetchmany(size) 方法获取到指定条数的结果集,fetchall( ) 方法获取到所有结果集。在获取结果时,游标会被下移,所以在每次使用之前需要重新执行 execute( ) 方法,重置游标位置。