在 Python 中使用 SQLite3
一. 介绍
在这篇文章中,我们将探讨如何在 Python 中使用 SQLite3,包括从基本操作到更高级的技巧。SQLite3 是 SQLite 的最新版本,广泛用于移动和桌面应用程序。SQLite 是一个无服务器数据库,这意味着整个数据库存储在磁盘上的一个文件中。这使得它非常适合需要轻量级数据库解决方案的应用,而无需完整数据库服务器的开销。只需使用 Python 2.5 或更高版本即可开始使用 SQLite3,因为 SQLite3 模块已包含在标准库中。
二. 连接到数据库
使用 SQLite3 的第一步是建立与数据库的连接。以下是如何实现这一点的示例:
import sqlite3 # 导入 sqlite3 模块
# 连接到数据库(如果不存在则创建它)
conn = sqlite3.connect('test.db') # 创建或打开名为 test.db 的数据库
# 创建一个游标对象来执行 SQL 命令
cursor = conn.cursor() # 获取游标对象
# 完成操作后,别忘了关闭连接
conn.close() # 关闭数据库连接
在上述代码中,我们首先导入了 SQLite3 模块,然后连接到一个数据库。如果数据库不存在,它会自动创建一个名为 test.db
的数据库文件。最后,我们使用游标对象执行 SQL 命令,并在完成后关闭连接。
三. 创建表
连接成功后,您可以使用 SQL 命令创建表。以下是一个示例:
# 创建一个表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY, # 用户 ID,主键
name TEXT NOT NULL, # 用户姓名,非空
email TEXT UNIQUE NOT NULL # 用户邮箱,唯一且非空
)
''') # 执行创建表的 SQL 命令
# 提交更改
conn.commit() # 提交事务以保存更改
这段代码创建了一个名为 users
的表,其中包含三个字段:id
、name
和 email
。
四. 插入数据
要向表中插入数据,可以使用 INSERT SQL 命令:
# 插入单行数据
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", ("Loki", "Loki@example.com")) # 插入 Loki 的信息
# 插入多行数据
users_data = [
("Rahul", "Rahul@example.com"), # Rahul 的信息
("Sunil", "Sunil@example.com") # Sunil 的信息
]
cursor.executemany("INSERT INTO users (name, email) VALUES (?, ?)", users_data) # 插入多个用户信息
# 提交更改
conn.commit() # 提交事务以保存更改
在这段代码中,我们首先插入了一名用户的记录,然后通过 executemany
方法批量插入多个用户的记录。
五. 查询数据
要从数据库中检索数据,可以使用 SELECT SQL 命令:
# 获取所有行
cursor.execute("SELECT * FROM users") # 执行查询所有用户的 SQL 命令
all_users = cursor.fetchall() # 获取所有结果
for user in all_users: # 遍历所有用户
print(f"ID: {user[0]}, Name: {user[1]}, Email: {user[2]}") # 输出用户信息
# 获取单行数据
cursor.execute("SELECT * FROM users WHERE name=?", ("Loki",)) # 查询姓名为 Loki 的用户
data = cursor.fetchone() # 获取单条结果
print(f"Loki's email: {data[2]}") # 输出 Loki 的邮箱
这段代码首先查询所有用户并打印出他们的信息,然后查询特定用户(Loki)的邮箱。
六. 更新和删除数据
您可以使用 UPDATE 和 DELETE SQL 命令更新和删除数据:
# 更新数据
cursor.execute("UPDATE users SET email=? WHERE name=?", ("newloki@example.com", "Loki")) # 更新 Loki 的邮箱
# 删除数据
cursor.execute("DELETE FROM users WHERE name=?", ("Rahul",)) # 删除名为 Rahul 的用户
# 提交更改
conn.commit() # 提交事务以保存更改
在这段代码中,我们更新了 Loki 的邮箱,并删除了名为 Rahul 的用户。
七. 使用参数化查询
如上所示,使用参数化查询以防止 SQL 注入攻击是至关重要的。始终在 SQL 语句中使用 ?
占位符,并将值作为元组传递。
name = "Aditya" # 用户名
email = "Aditya@example.com" # 用户邮箱
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", (name, email)) # 插入 Aditya 的信息
八. 处理事务
SQLite3 支持事务,允许您将多个操作组合在一起:
try:
conn.execute("BEGIN TRANSACTION") # 开始事务
# 执行多个操作
conn.execute("INSERT INTO users (name, email) VALUES (?, ?)", ("Ravi", "Ravi@example.com")) # 插入 Ravi 的信息
conn.execute("UPDATE users SET email=? WHERE name=?", ("updatesunil@example.com", "Sunil")) # 更新 Sunil 的邮箱
conn.commit() # 提交事务
except sqlite3.Error:
conn.rollback() # 如果发生错误则回滚事务
print("An error occurred. Transaction rolled back.") # 输出错误信息
上述代码演示了如何处理事务,包括开始、提交和回滚事务。
九. 错误处理
在进行数据库操作时,处理潜在错误是重要的:
try:
# 数据库操作
cursor.execute("INSERT INTO test_table VALUES (1, 2, 3)") # 向测试表中插入数据
except sqlite3.Error as e: # 捕获错误
print(f"An error occurred: {e}") # 输出错误信息
finally:
conn.close() # 确保连接在所有情况下都被关闭
这段代码通过 try-except-finally 块确保即使出现错误也会关闭数据库连接。
十. 最佳实践
-
始终使用参数化查询以防止 SQL 注入。 -
完成操作后关闭数据库连接。 -
使用上下文管理器自动管理连接:
with sqlite3.connect('example.db') as conn: # 使用上下文管理器连接数据库
# 数据库操作
pass # 连接将在退出上下文时自动关闭
-
对于较大的项目,考虑使用 ORM(对象关系映射)库,如 SQLAlchemy。 -
定期备份您的 SQLite 数据库文件。 -
对需要原子性的操作使用事务。
十一. 总结
SQLite3 是一种强大且轻量级的数据库解决方案,与 Python 无缝集成。无论您是在构建小型应用程序还是原型大型系统,SQLite3 都为在 Python 中处理关系数据库提供了一个出色的起点。通过本篇文章,您应该对如何使用 SQLite3 进行数据库操作有了更深入的了解和实践。