SQLite

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()

SQLite

上一篇:php7垃圾回收机制


下一篇:kubernetes面试总结