在 Python 中使用 SQLite3

发布:2024-10-15 13:42 阅读:44 点赞:0

一. 介绍

在这篇文章中,我们将探讨如何在 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 的表,其中包含三个字段:idnameemail

四. 插入数据

要向表中插入数据,可以使用 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 进行数据库操作有了更深入的了解和实践。