【Python】sqlite3 模块:创建和操作 SQLite 嵌入式数据库

Python 的 sqlite3 模块是标准库的一部分,提供了一个轻量级的、基于磁盘的关系型数据库接口,用于与 SQLite 数据库交互。SQLite 是一个嵌入式数据库,无需独立的服务器进程,适合小型应用、原型开发、桌面应用或移动设备。sqlite3 模块允许 Python 开发者执行 SQL 查询、管理数据库连接以及处理数据,具有简单易用、性能高效的特点。

以下是对 Python sqlite3 模块的详细介绍,包括其功能、用法、示例、最佳实践和注意事项。


1. sqlite3 模块简介

sqlite3 模块基于 SQLite C 库封装,遵循 Python 的数据库 API 规范(DB-API 2.0,PEP 249)。它支持创建和操作 SQLite 数据库,执行 CRUD(创建、读取、更新、删除)操作,并处理事务。

主要特点
  • 嵌入式:SQLite 数据库存储在单个文件中,无需服务器。
  • 轻量高效:适合小到中型数据量,内存占用低。
  • 标准 SQL:支持大部分 SQL 标准,易于迁移到其他数据库。
  • 跨平台:在 Windows、macOS、Linux 上运行一致。
  • 事务支持:支持 ACID 事务,确保数据完整性。
安装

sqlite3 是 Python 标准库的一部分,无需额外安装(Python 2.5+ 包含)。SQLite 库通常随 Python 一起分发,无需单独安装。

导入
import sqlite3

2. sqlite3 模块的核心功能

sqlite3 模块提供以下核心类和函数,用于数据库操作:

1) 连接数据库 (sqlite3.connect)
  • 作用:建立与 SQLite 数据库的连接。
  • 常用参数
    • database:数据库文件路径(字符串),或 :memory:(内存数据库)。
    • timeout:等待锁的超时时间(秒,默认为 5.0)。
    • isolation_level:事务隔离级别(None 为自动提交,默认为 None)。
  • 返回Connection 对象。
  • 示例
    import sqlite3
    
    # 连接到文件数据库
    conn = sqlite3.connect("example.db")
    
    # 连接到内存数据库
    conn_memory = sqlite3.connect(":memory:")
    
2) 创建游标 (Connection.cursor)
  • 作用:创建游标对象,用于执行 SQL 语句。
  • 返回Cursor 对象。
  • 示例
    cursor = conn.cursor()
    
3) 执行 SQL (Cursor.execute, Cursor.executemany)
  • 作用:执行单一或批量 SQL 语句。
  • 方法
    • 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)
    
4) 查询数据 (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)
    
5) 事务管理 (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()  # 回滚
    
6) 关闭连接 (Connection.close)
  • 作用:关闭数据库连接,释放资源。
  • 示例
    conn.close()
    
7) 上下文管理器

ConnectionCursor 支持 with 语句,自动管理资源。

示例

with sqlite3.connect("example.db") as conn:
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users")
    print(cursor.fetchall())
# 连接自动关闭

3. 常见操作示例

以下是一些典型的使用场景和示例代码。

1) 创建和填充数据库
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()
2) 使用参数化查询防止 SQL 注入
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})")  # 不安全
3) 处理事务
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()  # 回滚
4) 使用内存数据库
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()
5) 结合 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()

4. 高级功能

1) 自定义函数

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',), ...]
2) 行工厂(Row Factory)

设置 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
3) 数据库备份

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)
4) 事务隔离级别

设置 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()

5. 最佳实践

  1. 使用参数化查询

    • 始终使用 ? 或命名占位符(如 :name)传递参数,防止 SQL 注入。
    • 示例:
      cursor.execute("SELECT * FROM users WHERE name = :name", {"name": "Alice"})
      
  2. 使用上下文管理器

    • 使用 with 语句管理连接和游标,自动关闭资源。
    • 示例:
      with sqlite3.connect("example.db") as conn:
          conn.execute("SELECT 1")
      
  3. 显式事务管理

    • 使用 commit()rollback() 控制事务,避免数据不一致。
    • 示例:
      try:
          cursor.execute("UPDATE users SET age = age + 1")
          conn.commit()
      except sqlite3.Error:
          conn.rollback()
      
  4. 优化性能

    • 批量插入使用 executemany 提高效率。
    • 使用索引优化查询性能:
      cursor.execute("CREATE INDEX idx_name ON users(name)")
      
  5. 错误处理

    • 捕获 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()
      
  6. 测试数据库操作

    • 使用 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()
      

6. 注意事项

  1. 并发性

    • SQLite 支持有限的并发写入(单写多读)。设置 timeout 或使用连接池(如 sqlalchemy)。
    • 示例:
      conn = sqlite3.connect("example.db", timeout=10)
      
  2. 数据库锁定

    • 高并发写入可能导致 sqlite3.OperationalError: database is locked。调整事务逻辑或使用 WAL 模式:
      cursor.execute("PRAGMA journal_mode=WAL")
      
  3. 数据类型

    • SQLite 使用动态类型,支持 支持五种基本类型(NULLINTEGERTEXTREALBLOB)。类型转换可能导致意外行为。
    • 示例:
      cursor.execute("SELECT 1.0 + '2'")  # 输出: 3.0(隐式转换)
      
  4. 文件管理

    • 数据库文件可能因异常终止而损坏,定期备份。
    • 示例:
      conn.execute("VACUUM")  # 清理数据库文件
      
  5. 迁移限制

    • SQLite 功能有限(如无用户管理、复杂触发器),大型项目可能需迁移到 PostgreSQL/MySQL。

7. 总结

Python 的 sqlite3 模块是一个轻量、强大的嵌入式数据库接口,适合小型应用、原型开发和嵌入式设备。其核心功能包括:

  • 连接和游标:管理数据库交互。
  • SQL 执行:支持 CRUD 操作和参数化查询。
  • 事务管理:确保数据完整性。
  • 高级功能:自定义函数、行工厂、备份等。

你可能感兴趣的:(Python基础,Python,sqlite3,SQLite,SQL,数据库)