python sqlite3模块
十分想念顺店杂可。。。
Python 的sqlite3
模块是标准库中用于操作SQLite 数据库的工具。SQLite 是一款轻量级嵌入式数据库(无需独立服务器,数据存储在单一文件中),适合小型应用、本地数据存储或原型开发。sqlite3
模块提供了完整的 SQLite 操作接口,支持标准 SQL 语法。
一、核心概念
- 数据库文件:SQLite 数据存储在单一文件中(如
data.db
),无需单独部署服务器。 - 连接(Connection):通过
sqlite3.connect()
创建与数据库文件的连接。 - 游标(Cursor):通过连接获取游标对象,用于执行 SQL 语句和获取结果。
- 事务:默认自动提交(
autocommit=False
时需手动提交),支持commit()
提交和rollback()
回滚。
二、基本用法
1. 连接数据库
使用sqlite3.connect()
创建连接,若指定文件不存在则自动创建。
import sqlite3# 连接数据库(文件不存在则创建)
conn = sqlite3.connect('test.db') # 数据库文件名为test.db# 获取游标(用于执行SQL语句)
cursor = conn.cursor()
2. 创建表(CREATE TABLE)
通过游标执行CREATE TABLE
语句创建表,需指定表名和字段(SQLite 支持动态类型,常用类型:INTEGER
、TEXT
、REAL
、BLOB
)。
# 创建用户表(id为主键自增,name为文本,age为整数)
create_sql = '''
CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER,email TEXT UNIQUE # email唯一
)
'''
cursor.execute(create_sql)# 提交事务(创建表属于 schema 变更,需提交)
conn.commit()
IF NOT EXISTS
:避免表已存在时报错。PRIMARY KEY AUTOINCREMENT
:id 字段自动增长,作为唯一标识。
3. 插入数据(INSERT)
使用INSERT
语句插入数据,推荐用参数化查询(?
作为占位符),避免 SQL 注入。
# 插入单条数据
insert_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)"
cursor.execute(insert_sql, ('Alice', 25, 'alice@example.com')) # 参数以元组传入# 插入多条数据( executemany 批量插入)
users = [('Bob', 30, 'bob@example.com'),('Charlie', 35, 'charlie@example.com')
]
cursor.executemany(insert_sql, users) # 第二个参数为可迭代对象# 提交事务(插入/更新/删除操作需提交才生效)
conn.commit()
4. 查询数据(SELECT)
通过SELECT
语句查询数据,使用fetchone()
、fetchmany(n)
、fetchall()
获取结果。
# 1. 查询所有数据
cursor.execute("SELECT * FROM users")
all_users = cursor.fetchall() # 获取所有结果(列表嵌套元组)
print("所有用户:", all_users)
# 输出:[(1, 'Alice', 25, 'alice@example.com'), (2, 'Bob', 30, 'bob@example.com'), ...]# 2. 查询单条数据(按条件)
cursor.execute("SELECT name, age FROM users WHERE age > ?", (28,))
user = cursor.fetchone() # 获取第一条结果(元组)
print("年龄>28的第一个用户:", user) # 输出:('Bob', 30)# 3. 查询部分数据(限制条数)
cursor.execute("SELECT * FROM users ORDER BY age DESC")
top2 = cursor.fetchmany(2) # 获取前2条结果
print("年龄最大的2个用户:", top2)
5. 更新数据(UPDATE)
使用UPDATE
语句修改数据,同样支持参数化查询。
# 更新Alice的年龄为26
update_sql = "UPDATE users SET age = ? WHERE name = ?"
cursor.execute(update_sql, (26, 'Alice'))
conn.commit() # 提交修改# 验证更新结果
cursor.execute("SELECT age FROM users WHERE name = 'Alice'")
print("Alice的新年龄:", cursor.fetchone()[0]) # 输出:26
6. 删除数据(DELETE)
使用DELETE
语句删除数据,注意条件判断避免误删。
# 删除邮箱为charlie@example.com的用户
delete_sql = "DELETE FROM users WHERE email = ?"
cursor.execute(delete_sql, ('charlie@example.com',))
conn.commit()# 验证删除结果
cursor.execute("SELECT * FROM users WHERE email = 'charlie@example.com'")
print("删除后是否存在:", cursor.fetchone()) # 输出:None(表示不存在)
7. 关闭连接
操作完成后,需关闭游标和连接释放资源。
# 关闭游标
cursor.close()# 关闭连接
conn.close()
三、高级特性
1. 事务处理
SQLite 默认开启事务(autocommit=False
),多个操作需手动commit()
提交;若中间出错,可rollback()
回滚。
try:# 开启事务(默认已开启)cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Dave', 40))cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Eve', '30')) # 错误:age应为整数# 若全部成功,提交事务conn.commit()
except sqlite3.Error as e:# 出错时回滚(撤销所有未提交操作)conn.rollback()print(f"事务失败,已回滚:{e}")
finally:cursor.close()conn.close()
2. 上下文管理器(with 语句)
使用with
语句自动管理连接和游标,无需手动关闭。
# 连接作为上下文管理器:自动提交或回滚(出错时)
with sqlite3.connect('test.db') as conn:with conn.cursor() as cursor: # 游标作为上下文管理器# 执行查询cursor.execute("SELECT name FROM users")print("用户列表:", [row[0] for row in cursor.fetchall()])
# 退出with块后,连接和游标自动关闭
3. 行工厂(Row Factory)
设置conn.row_factory = sqlite3.Row
,使查询结果可通过字段名访问(类似字典)。
conn = sqlite3.connect('test.db')
conn.row_factory = sqlite3.Row # 启用行工厂
cursor = conn.cursor()cursor.execute("SELECT * FROM users WHERE name = 'Alice'")
user = cursor.fetchone()# 可通过索引或字段名访问
print("ID:", user[0]) # 索引访问
print("姓名:", user['name']) # 字段名访问(更直观)
print("年龄:", user['age'])cursor.close()
conn.close()
4. 执行 SQL 脚本
通过executescript()
执行多条 SQL 语句(以分号分隔)。
with sqlite3.connect('test.db') as conn:with conn.cursor() as cursor:# 执行批量SQL(创建表+插入数据)script = '''CREATE TABLE IF NOT EXISTS products (id INTEGER PRIMARY KEY, name TEXT);INSERT INTO products (name) VALUES ('Laptop');INSERT INTO products (name) VALUES ('Phone');'''cursor.executescript(script)conn.commit()
四、常见错误与注意事项
SQL 注入风险:
禁止用字符串拼接构造 SQL(如f"INSERT INTO users VALUES ({name})"
),必须用参数化查询(?
占位符)。数据类型:
SQLite 是动态类型,字段类型声明仅为建议(如INTEGER
字段可存入字符串),需在应用层保证类型正确。并发写入:
SQLite 适合单线程或低并发场景,高并发写入可能导致锁表(同一时间仅允许一个写操作)。事务未提交:
插入 / 更新 / 删除后未调用commit()
,数据不会写入数据库(仅在内存中临时存在)。表已存在:
创建表时添加IF NOT EXISTS
,避免table already exists
错误。
五、适用场景
- 小型应用或工具(如本地配置存储、日志记录);
- 原型开发(快速搭建,无需部署数据库服务器);
- 嵌入式设备(资源有限,无需独立数据库进程);
- 测试环境(轻量、易部署)。
总结
sqlite3
模块提供了简洁的接口操作 SQLite 数据库,核心流程为:
连接数据库 → 获取游标 → 执行 SQL → 处理结果 → 提交事务 → 关闭连接。
通过参数化查询、事务管理和上下文管理器,可安全高效地实现本地数据存储,是轻量级场景的理想选择。