SQLite 快速入门:基础知识与 Python 实战
SQLite 快速入门:基础知识与 Python 实战
什么是SQLite
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。
就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 不经过数据库服务器,而是由应用程序直接读写数据库文件。
SQLite有什么优点
- 不需要一个单独的服务器进程或操作的系统(无服务器的)。
- SQLite 不需要配置,这意味着不需要安装或管理。
- 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
- SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
- SQLite 是自给自足的,这意味着不需要任何外部的依赖。
- SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
- SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
- SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
- SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。
经典应用场景
一些人认为SQLite只能做玩具,实际上这是错误的。本地、离线、单程序读写、轻量存储的软件,几乎都会内置 SQLite。我们可以看下现有的应用场景
桌面软件
- 浏览器缓存与数据存储:Chrome、Edge、Firefox 全部用 SQLite 存:历史记录、Cookie、书签、下载记录、账号表单密码缓存。每个用户配置文件夹里一堆
.sqlite文件。 - 社交软件:微信电脑版、QQ:聊天记录、本地缓存、文件索引全部存在 SQLite;
- 开发工具:VS Code、JetBrains IDE(IDEA、PyCharm):插件配置、打开文件历史、项目缓存;Git 客户端存储提交记录缓存。
移动端APP
- 安卓原生 APP 默认本地存储用 SQLite:微信、抖音、小红书本地缓存聊天、浏览记录、本地草稿;
- iOS(iPhone/iPad)底层同样封装 SQLite
嵌入式设备
设备算力弱、无独立数据库服务,SQLite 完美适配。
- 工业工控小设备、门禁、打卡机:本地存储打卡日志、人员信息
- 路由器、监控摄像头:设备日志、录像索引、设备连接记录
在Python中使用SQLite
sqlite3是 Python 的标准库,安装 Python 时就已经自带了。在你使用sqlite3库时,你不需要在你电脑上下载sqlite,因为Python 内部自带了一个完整的 SQLite 引擎。
主要函数介绍
sqlite3.connect()→ 返回sqlite3.Connection
返回类型:sqlite3.Connection对象
作用:代表与 SQLite 数据库文件的连接。它是整个数据库交互的"入口"。
主要功能:
- 管理事务:
commit()提交、rollback()回滚 - 创建游标:
cursor()方法 - 直接执行 SQL:
execute()、executemany()等 - 关闭连接:
close()
conn.cursor()→ 返回sqlite3.Cursor
返回类型:sqlite3.Cursor对象
作用:在连接之上执行 SQL 语句并获取结果。它是执行查询和遍历结果集的"游标/指针"。
主要功能:
- 执行 SQL:
execute()、executemany()、executescript() - 获取查询结果:
fetchone()(取一条)、fetchall()(取全部)、fetchmany(n)(取 N 条)
使用SQLite进行简单的CRUD
连接数据库
下面的 Python 代码显示了如何连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。
importsqlite3 conn=sqlite3.connect('test.db')print("数据库打开成功")在这里,您也可以把数据库名称修改为特定的名称:memory:,这样就会在 RAM内存 中创建一个数据库,**:memory:是临时数据库,进程结束就消失,不持久化。**如下面的 Python 代码。
importsqlite3 conn=sqlite3.connect(':memory:')print("数据库打开成功")接下来的创建表和CRUD操作都以持久化数据库为例。:memory:临时数据库的创建表和相关CRUD操作也与接下来的代码几乎一致,区别只有conn = sqlite3.connect(':memory:')
创建表
它会在test.db中创建 COMPANY 表
defcreate_table():conn=sqlite3.connect('example.db')print("Creating table in the database...")print("Opened database successfully")c=conn.cursor()c.execute('''CREATE TABLE IF NOT EXISTS COMPANY (ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);''')print("Table created successfully")conn.commit()conn.close()INSERT 操作
它会在 COMPANY 表中创建给定记录
definsert_data():conn=sqlite3.connect('example.db')print("Inserting data into the database...")print("Opened database successfully")c=conn.cursor()c.execute("INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY)\ VALUES(1,'Paul',32,'California',20000.00)")c.execute("INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY)\ VALUES(2,'Allen',25,'Texas',15000.00)")c.execute("INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY)\ VALUES(3,'Teddy',23,'Norway',20000.00)")c.execute("INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY)\ VALUES(4,'Mark',25,'Rich-Mond ',65000.00)")conn.commit()print("Records created successfully")conn.close()SELECT 操作
defquery_data():conn=sqlite3.connect('example.db')print("Querying data from the database...")print("Opened database successfully")c=conn.cursor()cursor=c.execute("SELECT id, name, address, salary from COMPANY")forrowincursor:print("ID = ",row[0])print("NAME = ",row[1])print("ADDRESS = ",row[2])print("SALARY = ",row[3],"\n")print("Querying Operation done successfully")conn.close()UPDATE操作
defupdate_data():conn=sqlite3.connect('example.db')print("Updating data in the database...")print("Opened database successfully")c=conn.cursor()c.execute("UPDATE COMPANY set SALARY = 25000.00 where ID = 1")conn.commit()print("Total number of rows updated :",conn.total_changes)conn.close()DELETE操作
defdelete_data():conn=sqlite3.connect('example.db')print("Deleting data from the database...")print("Opened database successfully")c=conn.cursor()c.execute("DELETE from COMPANY where ID = 2;")conn.commit()print("Total number of rows deleted :",conn.total_changes)conn.close()代码仓库
包含持久化和非持久化的使用示例
PersonalViolet/sqlite-demo
参考博客
SQLite – Python | 菜鸟教程
