Python 的 sqlite3
模块是标准库的一部分,提供了一个轻量级的、基于磁盘的关系型数据库接口,用于与 SQLite 数据库交互。SQLite 是一个嵌入式数据库,无需独立的服务器进程,适合小型应用、原型开发、桌面应用或移动设备。sqlite3
模块允许 Python 开发者执行 SQL 查询、管理数据库连接以及处理数据,具有简单易用、性能高效的特点。
以下是对 Python sqlite3
模块的详细介绍,包括其功能、用法、示例、最佳实践和注意事项。
sqlite3
模块简介sqlite3
模块基于 SQLite C 库封装,遵循 Python 的数据库 API 规范(DB-API 2.0,PEP 249)。它支持创建和操作 SQLite 数据库,执行 CRUD(创建、读取、更新、删除)操作,并处理事务。
sqlite3
是 Python 标准库的一部分,无需额外安装(Python 2.5+ 包含)。SQLite 库通常随 Python 一起分发,无需单独安装。
import sqlite3
sqlite3
模块的核心功能sqlite3
模块提供以下核心类和函数,用于数据库操作:
sqlite3.connect
)database
:数据库文件路径(字符串),或 :memory:
(内存数据库)。timeout
:等待锁的超时时间(秒,默认为 5.0)。isolation_level
:事务隔离级别(None
为自动提交,默认为 None
)。Connection
对象。import sqlite3
# 连接到文件数据库
conn = sqlite3.connect("example.db")
# 连接到内存数据库
conn_memory = sqlite3.connect(":memory:")
Connection.cursor
)Cursor
对象。cursor = conn.cursor()
Cursor.execute
, Cursor.executemany
)execute(sql, parameters)
:执行单条 SQL,参数化防止 SQL 注入。executemany(sql, seq_of_parameters)
:批量执行 SQL。# 创建表
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
# 插入单条数据
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 30))
# 批量插入
users = [("Bob", 25), ("Charlie", 35)]
cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", users)
Cursor.fetchall
, Cursor.fetchone
, 迭代游标)fetchall()
:获取所有查询结果。fetchone()
:获取下一条结果。cursor.execute("SELECT * FROM users WHERE age > 20")
# 获取所有结果
results = cursor.fetchall()
for row in results:
print(row) # 输出: (1, 'Alice', 30), (2, 'Bob', 25), (3, 'Charlie', 35)
# 逐行获取
cursor.execute("SELECT * FROM users")
print(cursor.fetchone()) # 输出: (1, 'Alice', 30)
# 迭代游标
for row in cursor.execute("SELECT * FROM users"):
print(row)
Connection.commit
, Connection.rollback
)commit()
:提交事务,保存更改。rollback()
:回滚事务,撤销更改。try:
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Dave", 40))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Eve", "invalid")) # 引发错误
conn.commit() # 提交
except sqlite3.Error as e:
print(f"Error: {e}")
conn.rollback() # 回滚
Connection.close
)conn.close()
Connection
和 Cursor
支持 with
语句,自动管理资源。
示例:
with sqlite3.connect("example.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
# 连接自动关闭
以下是一些典型的使用场景和示例代码。
import sqlite3
# 连接数据库
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
# 创建表
cursor.execute("""
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price REAL
)
""")
# 插入数据
products = [("Laptop", 999.99), ("Phone", 499.99)]
cursor.executemany("INSERT INTO products (name, price) VALUES (?, ?)", products)
# 提交
conn.commit()
# 查询
cursor.execute("SELECT * FROM products")
print(cursor.fetchall()) # 输出: [(1, 'Laptop', 999.99), (2, 'Phone', 499.99)]
# 关闭
conn.close()
name = "Alice"
age = 30
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (name, age))
# 不要使用字符串格式化:cursor.execute(f"INSERT INTO users (name, age) VALUES ('{name}', {age})") # 不安全
try:
with sqlite3.connect("example.db") as conn:
cursor = conn.cursor()
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Frank", 28))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Grace", "invalid"))
conn.commit() # 不会执行
except sqlite3.Error:
conn.rollback() # 回滚
conn = sqlite3.connect(":memory:")
cursor = conn.cursor()
cursor.execute("CREATE TABLE temp (data TEXT)")
cursor.execute("INSERT INTO temp (data) VALUES (?)", ("Hello",))
cursor.execute("SELECT * FROM temp")
print(cursor.fetchall()) # 输出: [('Hello',)]
conn.close()
uuid
模块import sqlite3
import uuid
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS files (id TEXT PRIMARY KEY, name TEXT)")
file_id = str(uuid.uuid4())
cursor.execute("INSERT INTO files (id, name) VALUES (?, ?)", (file_id, "document.pdf"))
conn.commit()
conn.close()
sqlite3
允许注册 Python 函数作为 SQLite 的自定义 SQL 函数。
示例:
def my_upper(s):
return s.upper()
conn.create_function("my_upper", 1, my_upper)
cursor.execute("SELECT my_upper(name) FROM users")
print(cursor.fetchall()) # 输出: [('ALICE',), ('BOB',), ...]
设置 row_factory
将查询结果作为字典-like 对象返回。
示例:
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
row = cursor.fetchone()
print(row["name"], row["age"]) # 输出: Alice 30
sqlite3
支持在线备份数据库。
示例:
def backup(src_conn, dest_conn):
src_conn.backup(dest_conn)
with sqlite3.connect("source.db") as src, sqlite3.connect("backup.db") as dest:
backup(src, dest)
设置 isolation_level
控制事务行为:
None
:自动提交。"DEFERRED"
、"IMMEDIATE"
、"EXCLUSIVE"
:手动控制事务。示例:
conn = sqlite3.connect("example.db", isolation_level="DEFERRED")
cursor = conn.cursor()
cursor.execute("BEGIN")
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Hank", 45))
conn.commit()
使用参数化查询:
?
或命名占位符(如 :name
)传递参数,防止 SQL 注入。cursor.execute("SELECT * FROM users WHERE name = :name", {"name": "Alice"})
使用上下文管理器:
with
语句管理连接和游标,自动关闭资源。with sqlite3.connect("example.db") as conn:
conn.execute("SELECT 1")
显式事务管理:
commit()
和 rollback()
控制事务,避免数据不一致。try:
cursor.execute("UPDATE users SET age = age + 1")
conn.commit()
except sqlite3.Error:
conn.rollback()
优化性能:
executemany
提高效率。cursor.execute("CREATE INDEX idx_name ON users(name)")
错误处理:
sqlite3.Error
及其子类(如 sqlite3.IntegrityError
)。try:
cursor.execute("INSERT INTO users (id, name) VALUES (?, ?)", (1, "Alice"))
cursor.execute("INSERT INTO users (id, name) VALUES (?, ?)", (1, "Bob")) # 主键冲突
conn.commit()
except sqlite3.IntegrityError:
print("Duplicate ID")
conn.rollback()
测试数据库操作:
pytest
测试数据库操作,结合 :memory:
数据库。import pytest
import sqlite3
def test_insert_user():
conn = sqlite3.connect(":memory:")
cursor = conn.cursor()
cursor.execute("CREATE TABLE users (name TEXT)")
cursor.execute("INSERT INTO users (name) VALUES (?)", ("Alice",))
cursor.execute("SELECT * FROM users")
assert cursor.fetchall() == [("Alice",)]
conn.close()
并发性:
timeout
或使用连接池(如 sqlalchemy
)。conn = sqlite3.connect("example.db", timeout=10)
数据库锁定:
sqlite3.OperationalError: database is locked
。调整事务逻辑或使用 WAL 模式:cursor.execute("PRAGMA journal_mode=WAL")
数据类型:
NULL
、INTEGER
、TEXT
、REAL
、BLOB
)。类型转换可能导致意外行为。cursor.execute("SELECT 1.0 + '2'") # 输出: 3.0(隐式转换)
文件管理:
conn.execute("VACUUM") # 清理数据库文件
迁移限制:
Python 的 sqlite3
模块是一个轻量、强大的嵌入式数据库接口,适合小型应用、原型开发和嵌入式设备。其核心功能包括: