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。我们可以看下现有的应用场景

桌面软件

  1. 浏览器缓存与数据存储:Chrome、Edge、Firefox 全部用 SQLite 存:历史记录、Cookie、书签、下载记录、账号表单密码缓存。每个用户配置文件夹里一堆.sqlite文件。
  2. 社交软件:微信电脑版、QQ:聊天记录、本地缓存、文件索引全部存在 SQLite;
  3. 开发工具:VS Code、JetBrains IDE(IDEA、PyCharm):插件配置、打开文件历史、项目缓存;Git 客户端存储提交记录缓存。

移动端APP

  1. 安卓原生 APP 默认本地存储用 SQLite:微信、抖音、小红书本地缓存聊天、浏览记录、本地草稿;
  2. iOS(iPhone/iPad)底层同样封装 SQLite

嵌入式设备

设备算力弱、无独立数据库服务,SQLite 完美适配。

  1. 工业工控小设备、门禁、打卡机:本地存储打卡日志、人员信息
  2. 路由器、监控摄像头:设备日志、录像索引、设备连接记录

在Python中使用SQLite

sqlite3是 Python 的标准库,安装 Python 时就已经自带了。在你使用sqlite3库时,你不需要在你电脑上下载sqlite,因为Python 内部自带了一个完整的 SQLite 引擎

主要函数介绍

sqlite3.connect()→ 返回sqlite3.Connection

返回类型sqlite3.Connection对象

作用:代表与 SQLite 数据库文件的连接。它是整个数据库交互的"入口"。

主要功能:

  • 管理事务commit()提交、rollback()回滚
  • 创建游标cursor()方法
  • 直接执行 SQLexecute()executemany()
  • 关闭连接close()
conn.cursor()→ 返回sqlite3.Cursor

返回类型sqlite3.Cursor对象

作用:在连接之上执行 SQL 语句并获取结果。它是执行查询和遍历结果集的"游标/指针"。

主要功能:

  • 执行 SQLexecute()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 | 菜鸟教程