悠悠楠杉
Python操作SQLite轻量数据库完全指南:从入门到实战
Python操作SQLite轻量数据库完全指南:从入门到实战
关键词:Python SQLite、轻量数据库、数据库操作、SQLite3教程、嵌入式数据库
描述:本文详细介绍如何使用Python标准库sqlite3操作SQLite数据库,包含连接管理、CRUD操作、事务处理等实战技巧,适合快速开发轻量级应用。
一、为什么选择SQLite?
在开发小型应用或需要嵌入式数据库的场景时,SQLite以其零配置、无服务器、单文件存储的特性成为首选。作为Python内置支持的数据库(通过sqlite3模块),它免去了安装额外服务的麻烦,特别适合:
- 移动端应用
- 桌面软件
- 原型开发
- 中小流量网站
python
import sqlite3
内存数据库示例(临时测试用)
conn = sqlite3.connect(':memory:')
二、核心操作全解析
1. 数据库连接管理
建议使用上下文管理器自动处理连接,避免资源泄漏:
python
with sqlite3.connect('mydb.db') as conn:
cursor = conn.cursor()
# 执行操作...
conn.commit() # 自动提交在退出上下文时发生
2. 表创建与数据类型
SQLite支持动态类型,但建议明确字段类型:
python
CREATE_TABLE_SQL = """
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER CHECK(age >= 0),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)"""
cursor.execute(CREATE_TABLE_SQL)
注意:SQLite没有布尔类型,通常用0/1表示
3. CRUD实战技巧
插入数据(防注入写法):
python
data = ('张三', 25)
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", data)
批量插入:
python
users = [('李四', 30), ('王五', 28)]
cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", users)
查询与结果处理:python
获取字典形式的结果(替代默认元组)
conn.row_factory = sqlite3.Row
cursor.execute("SELECT * FROM users WHERE age > ?", (20,))
for row in cursor:
print(row['name'], row['age']) # 支持列名访问
4. 事务控制
原子操作示例:
python
try:
cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id=1")
cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id=2")
conn.commit()
except sqlite3.Error:
conn.rollback()
三、高级技巧
1. 自定义聚合函数
实现统计连续登录天数:
python
class MaxConsecutiveDays:
def init(self):
self.count = 0
self.max = 0
def step(self, value):
if value == 1: # 1表示当日登录
self.count += 1
self.max = max(self.max, self.count)
else:
self.count = 0
def finalize(self):
return self.max
conn.createaggregate("maxconsecutive", 1, MaxConsecutiveDays)
2. 数据库加密
使用sqlcipher扩展:
python
需要安装pysqlcipher3
from pysqlcipher3 import dbapi2 as sqlite
conn = sqlite.connect('encrypted.db')
conn.execute("PRAGMA key='secret-key'")
四、性能优化建议
- 批量操作:用executemany替代循环单条插入
- 预编译语句:重复使用的SQL应参数化
- 合理使用索引:
sql CREATE INDEX idx_users_age ON users(age);
- WAL模式:提高并发性
python conn.execute("PRAGMA journal_mode=WAL")
五、常见问题排查
- 锁冲突:检查是否及时提交事务
- 性能瓶颈:使用EXPLAIN QUERY PLAN分析SQL
- 中文乱码:确保连接时指定编码
python conn = sqlite3.connect('mydb.db', detect_types=sqlite3.PARSE_DECLTYPES)