Python 操作 SQLite:从入门到进阶的完整指南
在应用开发中,数据库操作是核心任务之一。如果你需要一个轻量级、无需安装独立服务器的嵌入式数据库解决方案,SQLite 将是你的理想选择。
结合 Python 标准库中的 sqlite3 模块,你可以直接在代码中快速创建、修改和管理数据库。本文将教你如何连接 SQLite、执行数据插入(INSERT)、更新(UPDATE)等操作,并附有详细代码示例。
什么是 SQLite?为什么选择它?
SQLite 是一种嵌入式关系型数据库,所有数据存储在一个单一文件中。它无需独立服务器,非常适合原型开发、小型项目和移动应用。
SQLite 广泛应用于软件开发领域。许多流行应用,包括浏览器、即时通讯工具和移动应用,都使用 SQLite 进行本地数据存储。
SQLite 的优势
- 无需安装服务器
- 运行速度快
- 使用简单
- 通过 sqlite3 模块与 Python 完美集成
- 跨平台且便携
- 支持 ACID 事务
- 资源消耗极低
SQLite 的局限性
- 不支持多用户并发写入
- 处理大数据量时性能有限
- 缺乏内置复制功能
- 复杂多用户应用场景受限
在 Python 中连接 SQLite 数据库
基本连接
import sqlite3
# 连接数据库(如果文件不存在,则自动创建)
conn = sqlite3.connect('my_database.db')
# 创建游标对象以执行 SQL 查询
cursor = conn.cursor()
连接内存数据库
如需临时存储数据或进行测试,可使用内存数据库:
conn = sqlite3.connect(':memory:')
配置连接参数
conn = sqlite3.connect('my_database.db', timeout=10)
conn.execute('PRAGMA foreign_keys = ON') # 启用外键约束
在 SQLite 中创建表
创建简单表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)
''')
conn.commit()
创建带约束的表
cursor.execute('''
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
price REAL CHECK(price > 0),
category TEXT DEFAULT 'uncategorized',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
创建索引以优化查询
cursor.execute('''
CREATE INDEX IF NOT EXISTS idx_users_name ON users(name)
''')
conn.commit()
向表中插入数据 —— Python sqlite3 INSERT 操作
插入单条记录
最常见的操作之一是如何向 SQLite 表中插入数据:
cursor.execute('''
INSERT INTO users (name, age) VALUES (?, ?)
''', ('张三', 30))
conn.commit()
使用问号占位符可有效防止 SQL 注入,是推荐的做法。
批量插入数据
users = [('李四', 25), ('王五', 28), ('赵六', 35)]
cursor.executemany('''
INSERT INTO users (name, age) VALUES (?, ?)
''', users)
conn.commit()
查询数据 —— Python sqlite3 SELECT 操作
查询所有数据
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:
print(row)
带条件查询
cursor.execute('SELECT * FROM users WHERE age > ?', (25,))
rows = cursor.fetchall()
for row in rows:
print(row)
使用 fetchone 和 fetchmany
# 获取单条记录
row = cursor.fetchone()
print(row)
# 获取指定数量的记录
rows = cursor.fetchmany(5)
print(rows)
更新数据 —— Python sqlite3 UPDATE 操作
cursor.execute('''
UPDATE users SET age = ? WHERE name = ?
''', (31, '张三'))
conn.commit()
删除数据 —— Python sqlite3 DELETE 操作
cursor.execute('''
DELETE FROM users WHERE name = ?
''', ('张三',))
conn.commit()
事务管理
SQLite 支持事务,确保数据一致性:
try:
conn.execute('BEGIN TRANSACTION')
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('测试用户', 20))
cursor.execute('UPDATE users SET age = 21 WHERE name = ?', ('测试用户',))
conn.commit()
except Exception as e:
conn.rollback()
print(f'事务回滚:{e}')
关闭连接
操作完成后,务必关闭游标和连接:
cursor.close()
conn.close()
常见问题与最佳实践
使用参数化查询防止 SQL 注入
始终使用问号占位符而非字符串拼接:
# 正确做法
cursor.execute('SELECT * FROM users WHERE name = ?', (user_input,))
# 错误做法(易受 SQL 注入攻击)
cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")
使用 with 语句自动管理资源
with sqlite3.connect('my_database.db') as conn:
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:
print(row)
优化查询性能
- 为常用查询字段创建索引
- 避免在 WHERE 子句中对列使用函数
- 使用 EXPLAIN QUERY PLAN 分析查询
- 批量操作时使用 executemany
总结
本文详细介绍了如何在 Python 中使用 SQLite 数据库,包括连接、创建表、插入、查询、更新和删除数据等核心操作。SQLite 结合 Python 的 sqlite3 模块,为开发者提供了一个轻量、高效且易于使用的数据库解决方案。无论是学习编程还是开发实际项目,掌握 SQLite 操作都是一项重要技能。
希望本教程对你有所帮助!如有任何问题,欢迎在评论区留言交流。