SQLite3 可使用 sqlite3 模块与 Python 进行集成。
sqlite3 模块是由 Gerhard Haring 编写的。它提供了一个与 PEP 249 描述的 DB-API 2.0 规范兼容的 SQL 接口。
您不需要单独安装该模块,因为 Python 2.5.x 以上版本默认自带了该模块。
为了使用 sqlite3 模块,您首先必须创建一个表示数据库的连接对象,然后您可以有选择地创建光标对象,这将帮助您执行所有的 SQL 语句。
import sqlite3
conn = sqlite3.connect(‘test.db‘) #连接到SQlite数据库 #数据库文件是test.db,不存在,则自动创建
cursor = conn.cursor() #创建一个cursor
优点
轻量级:SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态 库,就可以享受它的全部功能。而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB
绿色软件:SQLite的另外一个特点是绿色:它的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”。所以在部署的时候能够省去不少麻烦
单一文件:所谓的“单一文件”,就是数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。这个文件可以copy到其它目录或其它机器上,也照用不误
跨平台/可移植性:
如果光支持主流操作系统,那就没啥好吹嘘的了。除了主流操作系统,SQLite还支持了很多冷门的操作系统。我个人比较感兴趣的是它对很多嵌入式系统(比如Android、WindowsMobile、Symbin、Palm、VxWorks等)的支持
内存数据库(in-memory database):
这年头,内存越来越便宜,很多普通PC都开始以GB为单位来衡量内存(服务器就更甭提了)。这时候,SQLite的内存数据库特性就越发显得好用。
SQLite的API不区分当前操作的数据库是在内存还是在文件(对于存储介质是透明的)。所以如果你觉得磁盘I/O有可能成为瓶颈的话,可以考虑切换 为内存方式。切换的时候,操作SQLite的代码基本不用大改,只要在开始时把文件Load到内存,结束时把内存的数据库Dump回文件就OK了。在这种情况下,前面提到的“onlinebackup API”就派上用场了,聪明的同学应该明白我为啥这么期待backup功能了吧
缺点
并发访问的锁机制:
SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错
SQL标准支持不全:
在它的官方网站上,具体列举了不支持哪些SQL92标准。我个人感觉比较不爽的是不支持外键约束。
网络文件系统(以下简称NFS):
有时候需要访问其它机器上的SQLite数据库文件,就会把数据库文件放置到网络共享目录上。这时候你就要小心了。当SQLite文件放置于NFS时,在并发读写的情况下可能会出问题(比如数据损坏)。原因据说是由于某些NFS的文件锁实现上有Bug
数据库连接对象
打开数据库时返回的对象 conn 就是一个数据库连接对象,它可以有以下操作:
commit()--事务提交
rollback()--事务回滚
close()--关闭一个数据库连接
cursor()--创建一个游标
关于commit(),如果isolation_level
隔离级别默认,那么每次对数据库的操作,都需要使用该命令,你也可以设置isolation_level
=None,这样就变为自动提交模式。
操作
创建表
import sqlite3
conn = sqlite3.connect(‘test.db‘)
# conn = sqlite3.connect(‘E:/test.db‘)
# 也可以创建数据库在内存中。
# conn = sqlite3.connect(":memory:")
cursor = conn.cursor()
cursor.execute("""
create table company
(id int primary key not null,
name text not null,
age int not null,
address char(50));""")
conn.commit()
conn.close()
插入 insert
c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS) VALUES (1, ‘Paul‘, 32)")
查询 select
data = cursor.execute(‘select id, name, age, address from company‘)
# data = cursor.execute(f‘select * from company where id={1}‘)
# data = cursor.execute(‘select * from company where id=?‘, (‘1‘))
print(list(data)[0])
# print(cursor.fetchall()) # 使用featchall获得结果集(list)
更新 update
result = ‘俊俊‘
cursor.execute(f"UPDATE COMPANY set name=‘{result}‘ where ID=1")
# cursor.execute("UPDATE COMPANY set name=‘%s‘ where ID=1"%(‘俊俊‘))
# cursor.execute("UPDATE COMPANY set name=‘哈哈‘ where ID=1")
conn.commit()
conn.close()
删除 delete
result = ‘俊俊‘
cursor.execute(f"delete from company where name=‘{result}‘")
conn.commit()
conn.close()