python sqlite3模块

发布于:2025-08-15 ⋅ 阅读:(20) ⋅ 点赞:(0)
十分想念顺店杂可。。。

Python 的sqlite3模块是标准库中用于操作SQLite 数据库的工具。SQLite 是一款轻量级嵌入式数据库(无需独立服务器,数据存储在单一文件中),适合小型应用、本地数据存储或原型开发。sqlite3模块提供了完整的 SQLite 操作接口,支持标准 SQL 语法。

一、核心概念

  • 数据库文件:SQLite 数据存储在单一文件中(如data.db),无需单独部署服务器。
  • 连接(Connection):通过sqlite3.connect()创建与数据库文件的连接。
  • 游标(Cursor):通过连接获取游标对象,用于执行 SQL 语句和获取结果。
  • 事务:默认自动提交(autocommit=False时需手动提交),支持commit()提交和rollback()回滚。

二、基本用法

1. 连接数据库

使用sqlite3.connect()创建连接,若指定文件不存在则自动创建。

import sqlite3

# 连接数据库(文件不存在则创建)
conn = sqlite3.connect('test.db')  # 数据库文件名为test.db

# 获取游标(用于执行SQL语句)
cursor = conn.cursor()

2. 创建表(CREATE TABLE)

通过游标执行CREATE TABLE语句创建表,需指定表名和字段(SQLite 支持动态类型,常用类型:INTEGERTEXTREALBLOB)。

# 创建用户表(id为主键自增,name为文本,age为整数)
create_sql = '''
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    email TEXT UNIQUE  # email唯一
)
'''
cursor.execute(create_sql)

# 提交事务(创建表属于 schema 变更,需提交)
conn.commit()

  • IF NOT EXISTS:避免表已存在时报错。
  • PRIMARY KEY AUTOINCREMENT:id 字段自动增长,作为唯一标识。

3. 插入数据(INSERT)

使用INSERT语句插入数据,推荐用参数化查询?作为占位符),避免 SQL 注入。

# 插入单条数据
insert_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)"
cursor.execute(insert_sql, ('Alice', 25, 'alice@example.com'))  # 参数以元组传入

# 插入多条数据( executemany 批量插入)
users = [
    ('Bob', 30, 'bob@example.com'),
    ('Charlie', 35, 'charlie@example.com')
]
cursor.executemany(insert_sql, users)  # 第二个参数为可迭代对象

# 提交事务(插入/更新/删除操作需提交才生效)
conn.commit()

4. 查询数据(SELECT)

通过SELECT语句查询数据,使用fetchone()fetchmany(n)fetchall()获取结果。

# 1. 查询所有数据
cursor.execute("SELECT * FROM users")
all_users = cursor.fetchall()  # 获取所有结果(列表嵌套元组)
print("所有用户:", all_users)
# 输出:[(1, 'Alice', 25, 'alice@example.com'), (2, 'Bob', 30, 'bob@example.com'), ...]

# 2. 查询单条数据(按条件)
cursor.execute("SELECT name, age FROM users WHERE age > ?", (28,))
user = cursor.fetchone()  # 获取第一条结果(元组)
print("年龄>28的第一个用户:", user)  # 输出:('Bob', 30)

# 3. 查询部分数据(限制条数)
cursor.execute("SELECT * FROM users ORDER BY age DESC")
top2 = cursor.fetchmany(2)  # 获取前2条结果
print("年龄最大的2个用户:", top2)

5. 更新数据(UPDATE)

使用UPDATE语句修改数据,同样支持参数化查询。

# 更新Alice的年龄为26
update_sql = "UPDATE users SET age = ? WHERE name = ?"
cursor.execute(update_sql, (26, 'Alice'))
conn.commit()  # 提交修改

# 验证更新结果
cursor.execute("SELECT age FROM users WHERE name = 'Alice'")
print("Alice的新年龄:", cursor.fetchone()[0])  # 输出:26

6. 删除数据(DELETE)

使用DELETE语句删除数据,注意条件判断避免误删。

# 删除邮箱为charlie@example.com的用户
delete_sql = "DELETE FROM users WHERE email = ?"
cursor.execute(delete_sql, ('charlie@example.com',))
conn.commit()

# 验证删除结果
cursor.execute("SELECT * FROM users WHERE email = 'charlie@example.com'")
print("删除后是否存在:", cursor.fetchone())  # 输出:None(表示不存在)

7. 关闭连接

操作完成后,需关闭游标和连接释放资源。

# 关闭游标
cursor.close()

# 关闭连接
conn.close()

三、高级特性

1. 事务处理

SQLite 默认开启事务(autocommit=False),多个操作需手动commit()提交;若中间出错,可rollback()回滚。

try:
    # 开启事务(默认已开启)
    cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Dave', 40))
    cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Eve', '30'))  # 错误:age应为整数
    
    # 若全部成功,提交事务
    conn.commit()
except sqlite3.Error as e:
    # 出错时回滚(撤销所有未提交操作)
    conn.rollback()
    print(f"事务失败,已回滚:{e}")
finally:
    cursor.close()
    conn.close()

2. 上下文管理器(with 语句)

使用with语句自动管理连接和游标,无需手动关闭。

# 连接作为上下文管理器:自动提交或回滚(出错时)
with sqlite3.connect('test.db') as conn:
    with conn.cursor() as cursor:  # 游标作为上下文管理器
        # 执行查询
        cursor.execute("SELECT name FROM users")
        print("用户列表:", [row[0] for row in cursor.fetchall()])
# 退出with块后,连接和游标自动关闭

3. 行工厂(Row Factory)

设置conn.row_factory = sqlite3.Row,使查询结果可通过字段名访问(类似字典)。

conn = sqlite3.connect('test.db')
conn.row_factory = sqlite3.Row  # 启用行工厂
cursor = conn.cursor()

cursor.execute("SELECT * FROM users WHERE name = 'Alice'")
user = cursor.fetchone()

# 可通过索引或字段名访问
print("ID:", user[0])         # 索引访问
print("姓名:", user['name'])  # 字段名访问(更直观)
print("年龄:", user['age'])

cursor.close()
conn.close()

4. 执行 SQL 脚本

通过executescript()执行多条 SQL 语句(以分号分隔)。

with sqlite3.connect('test.db') as conn:
    with conn.cursor() as cursor:
        # 执行批量SQL(创建表+插入数据)
        script = '''
        CREATE TABLE IF NOT EXISTS products (id INTEGER PRIMARY KEY, name TEXT);
        INSERT INTO products (name) VALUES ('Laptop');
        INSERT INTO products (name) VALUES ('Phone');
        '''
        cursor.executescript(script)
    conn.commit()

四、常见错误与注意事项

  1. SQL 注入风险
    禁止用字符串拼接构造 SQL(如f"INSERT INTO users VALUES ({name})"),必须用参数化查询(?占位符)。

  2. 数据类型
    SQLite 是动态类型,字段类型声明仅为建议(如INTEGER字段可存入字符串),需在应用层保证类型正确。

  3. 并发写入
    SQLite 适合单线程或低并发场景,高并发写入可能导致锁表(同一时间仅允许一个写操作)。

  4. 事务未提交
    插入 / 更新 / 删除后未调用commit(),数据不会写入数据库(仅在内存中临时存在)。

  5. 表已存在
    创建表时添加IF NOT EXISTS,避免table already exists错误。

五、适用场景

  • 小型应用或工具(如本地配置存储、日志记录);
  • 原型开发(快速搭建,无需部署数据库服务器);
  • 嵌入式设备(资源有限,无需独立数据库进程);
  • 测试环境(轻量、易部署)。

总结

sqlite3模块提供了简洁的接口操作 SQLite 数据库,核心流程为:
连接数据库 → 获取游标 → 执行 SQL → 处理结果 → 提交事务 → 关闭连接
通过参数化查询、事务管理和上下文管理器,可安全高效地实现本地数据存储,是轻量级场景的理想选择。


网站公告

今日签到

点亮在社区的每一天
去签到