SQLite是一款轻量级、零配置的开源嵌入式关系型数据库,以其单一文件存储、高性能和强可靠性著称。Python通过内置的sqlite3模块提供了对SQLite数据库的完整支持,使其成为Python开发者处理本地数据存储的理想选择。
核心特点
1、嵌入式架构:无需单独服务器进程,直接嵌入到应用程序中。
2、单一文件存储:整个数据库存储在单个磁盘文件中,便于迁移和备份。
3、零配置:无需安装或管理,开箱即用。
4、跨平台兼容:支持Windows、Linux、macOS等主流操作系统。
5、ACID事务:保证数据操作的原子性、一致性、隔离性和持久性。
Python使用SQLite
1. 连接数据库
import sqlite3 # 连接数据库(如果不存在则创建) conn = sqlite3.connect('example.db') # 创建游标对象 cursor = conn.cursor() # 执行SQL语句 cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''') # 提交更改 conn.commit() # 关闭连接 conn.close()
2. 插入数据
def insert_user(name, age): conn = sqlite3.connect('example.db') cursor = conn.cursor() # 使用参数化查询防止SQL注入 cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (name, age)) conn.commit() conn.close() # 插入多条数据 users = [('Alice', 25), ('Bob', 30), ('Charlie', 35)] conn = sqlite3.connect('example.db') cursor = conn.cursor() cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", users) conn.commit() conn.close()
3. 查询数据
def get_all_users(): conn = sqlite3.connect('example.db') cursor = conn.cursor() cursor.execute("SELECT * FROM users") rows = cursor.fetchall() conn.close() return rows def get_user_by_name(name): conn = sqlite3.connect('example.db') cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE name=?", (name,)) user = cursor.fetchone() conn.close() return user
4. 更新和删除数据
def update_user_age(name, new_age): conn = sqlite3.connect('example.db') cursor = conn.cursor() cursor.execute("UPDATE users SET age=? WHERE name=?", (new_age, name)) conn.commit() conn.close() def delete_user(name): conn = sqlite3.connect('example.db') cursor = conn.cursor() cursor.execute("DELETE FROM users WHERE name=?", (name,)) conn.commit() conn.close()
功能示例
1. 使用事务
def transfer_funds(from_id, to_id, amount): conn = sqlite3.connect('bank.db') cursor = conn.cursor() try: # 开始事务 cursor.execute("BEGIN TRANSACTION") # 扣除转出账户金额 cursor.execute("UPDATE accounts SET balance = balance - ? WHERE id = ?", (amount, from_id)) # 增加转入账户金额 cursor.execute("UPDATE accounts SET balance = balance + ? WHERE id = ?", (amount, to_id)) # 提交事务 conn.commit() print("转账成功") except sqlite3.Error as e: # 发生错误时回滚 conn.rollback() print(f"转账失败: {e}") finally: conn.close()
2. 使用上下文管理器
from contextlib import closing def get_user_count(): with closing(sqlite3.connect('example.db')) as conn: cursor = conn.cursor() cursor.execute("SELECT COUNT(*) FROM users") count = cursor.fetchone() return count
3. 使用Row工厂获取字典式结果
conn = sqlite3.connect('example.db') conn.row_factory = sqlite3.Row # 设置行工厂 cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE age > ?", (30,)) for row in cursor: print(f"ID: {row['id']}, Name: {row['name']}, Age: {row['age']}") conn.close()
性能优化
1、批量操作:使用 executemany() 进行批量插入。
2、合理使用索引:为常用查询字段创建索引。
3、PRAGMA设置:调整SQLite的PRAGMA参数优化性能。
4、定期维护:使用VACUUM命令回收未使用空间。
5、WAL模式:对于高并发读场景,使用 PRAGMA journal_mode=WAL 。
# 性能优化示例 conn = sqlite3.connect('example.db') cursor = conn.cursor() # 设置WAL模式提高并发读取性能 cursor.execute("PRAGMA journal_mode=WAL") # 为常用查询字段创建索引 cursor.execute("CREATE INDEX IF NOT EXISTS idx_user_age ON users(age)") conn.commit() conn.close()
适用场景
适用场景:
移动应用和嵌入式系统
桌面应用程序
小型到中型网站
开发和测试环境
数据分析和缓存
局限性:
不适合高并发写入场景
缺乏网络接口,不适合客户端-服务器架构
用户权限管理功能有限
SQLite与Python的结合为开发者提供了一个简单而强大的本地数据存储解决方案。内置的sqlite3模块提供了强大而便捷的数据库操作能力,使得SQLite成为开发中小型应用的理想选择。通过合理使用其特性,可以在各种应用场景中实现高效、可靠的数据管理。理解其优势和局限,合理运用在各种场景中,将极大提升开发效率和应用程序质量。