在 Python 开发中,处理数据存储与管理是常见需求。SQLite 作为一款轻量级的数据库,无需单独的服务器进程,以文件形式存储数据,非常适合小型项目和嵌入式系统。Python 的 sqlite3
模块提供了与 SQLite 数据库交互的接口,使开发者能够方便地进行数据库操作。本文将结合 Python 官方文档(https://docs.python.org/zh-cn/3.12/library/sqlite3.html),详细讲解 sqlite3
模块的使用,涵盖基础概念、连接数据库、执行 SQL 语句、事务处理等内容,帮助你全面掌握这一实用工具。
SQLite 是一个开源的嵌入式关系型数据库管理系统,它将整个数据库存储在一个单一的跨平台文件中。SQLite 具有零配置、无需服务器、轻量级、高性能等特点,广泛应用于移动应用、嵌入式系统和小型桌面应用等场景。
sqlite3
模块sqlite3
是 Python 标准库中的一个模块,它提供了一个符合 DB - API 2.0 规范的接口,用于与 SQLite 数据库进行交互。通过 sqlite3
模块,开发者可以在 Python 代码中方便地创建数据库、执行 SQL 语句、管理事务等。
数据库模块 | 特点 | 适用场景 |
---|---|---|
sqlite3 |
轻量级,无需服务器,以文件形式存储数据,操作简单 | 小型项目、嵌入式系统、移动应用,对数据量和并发要求不高的场景 |
mysql - connector - python |
需要独立的服务器进程,支持高并发和大数据量,功能强大 | 企业级 Web 应用、大型数据管理系统,对性能和功能要求较高的场景 |
psycopg2 |
用于连接 PostgreSQL 数据库,支持复杂查询和高级特性 | 需要使用 PostgreSQL 数据库的专业应用,如地理信息系统、数据仓库等 |
connect()
方法要与 SQLite 数据库进行交互,首先需要建立连接。可以使用 sqlite3.connect()
方法来创建一个数据库连接对象。如果指定的数据库文件不存在,该方法会自动创建一个新的数据库文件。示例代码如下:
import sqlite3
# 连接到 SQLite 数据库(如果数据库文件不存在,会自动创建)
conn = sqlite3.connect('example.db')
连接成功后,需要创建一个游标对象。游标用于执行 SQL 语句并处理结果。可以使用连接对象的 cursor()
方法创建游标对象。示例代码如下:
# 创建游标对象
cursor = conn.cursor()
可以使用 CREATE TABLE
语句在数据库中创建表。以下是一个创建 users
表的示例:
# 创建 users 表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)
''')
使用 INSERT INTO
语句向表中插入数据。可以使用占位符(?
)来防止 SQL 注入攻击。示例代码如下:
# 插入单条数据
name = 'John'
age = 25
cursor.execute('INSERT INTO users (name, age) VALUES (?,?)', (name, age))
# 插入多条数据
users = [('Alice', 30), ('Bob', 22)]
cursor.executemany('INSERT INTO users (name, age) VALUES (?,?)', users)
使用 SELECT
语句从表中查询数据。查询结果可以通过游标对象的 fetchone()
、fetchmany()
或 fetchall()
方法获取。示例代码如下:
# 查询所有数据
cursor.execute('SELECT * FROM users')
all_users = cursor.fetchall()
for user in all_users:
print(user)
# 查询单条数据
cursor.execute('SELECT * FROM users WHERE id = 1')
single_user = cursor.fetchone()
print(single_user)
使用 UPDATE
语句更新表中的数据。示例代码如下:
# 更新数据
new_age = 26
user_id = 1
cursor.execute('UPDATE users SET age =? WHERE id =?', (new_age, user_id))
使用 DELETE
语句从表中删除数据。示例代码如下:
# 删除数据
user_id = 2
cursor.execute('DELETE FROM users WHERE id =?', (user_id,))
事务是一组不可分割的数据库操作序列,要么全部执行成功,要么全部失败回滚。在 SQLite 中,默认情况下,每个 SQL 语句都是一个单独的事务。可以使用 BEGIN
、COMMIT
和 ROLLBACK
语句来管理事务。
在 sqlite3
模块中,可以使用连接对象的 commit()
和 rollback()
方法来提交或回滚事务。示例代码如下:
try:
# 开始事务
conn.execute('BEGIN')
# 执行一系列 SQL 语句
cursor.execute('INSERT INTO users (name, age) VALUES (?,?)', ('Eve', 28))
cursor.execute('UPDATE users SET age = 31 WHERE name =?', ('Alice',))
# 提交事务
conn.commit()
except Exception as e:
# 回滚事务
conn.rollback()
print(f"Transaction failed: {e}")
在完成数据库操作后,需要关闭游标对象和数据库连接,以释放资源。示例代码如下:
# 关闭游标对象
cursor.close()
# 关闭数据库连接
conn.close()
SQLite 本身支持有限的数据类型,但可以通过自定义数据类型来存储更复杂的数据。在 sqlite3
模块中,可以使用 register_adapter()
和 register_converter()
函数来实现自定义数据类型的存储和读取。示例代码如下:
import sqlite3
# 自定义数据类型
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
# 适配器函数,将 Point 对象转换为字节类型
def adapt_point(point):
return f"{point.x},{point.y}".encode()
# 转换器函数,将字节类型转换为 Point 对象
def convert_point(s):
x, y = map(int, s.decode().split(','))
return Point(x, y)
# 注册适配器和转换器
sqlite3.register_adapter(Point, adapt_point)
sqlite3.register_converter("POINT", convert_point)
# 连接数据库并使用自定义数据类型
conn = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)
cursor = conn.cursor()
cursor.execute('CREATE TABLE points (p POINT)')
p = Point(1, 2)
cursor.execute('INSERT INTO points (p) VALUES (?)', (p,))
cursor.execute('SELECT p FROM points')
result = cursor.fetchone()[0]
print(result.x, result.y)
sqlite3
模块为 Python 开发者提供了一个方便、高效的方式来与 SQLite 数据库进行交互。通过建立连接、执行 SQL 语句、管理事务和处理自定义数据类型等操作,可以满足各种小型项目的数据存储需求。在使用过程中,要注意 SQL 注入安全问题,合理管理事务以保证数据的一致性,并且及时关闭数据库连接以释放资源。
sqlite3
模块的详细文档,包括函数定义、使用方法、示例代码等,是学习 sqlite3
模块的权威资料。sqlite3
模块的使用,通过丰富的案例帮助读者掌握数据库编程技巧。