悠悠楠杉
Python操作SQLite全指南:轻量级数据库实战教程
SQLite作为全球部署量最大的嵌入式数据库,以其零配置、单文件存储的特性成为Python开发中的理想选择。本文将带你深入掌握用Python操作SQLite的完整技能栈。
一、SQLite基础认知
SQLite不同于传统客户端-服务器结构的数据库,它直接将数据库存储在单个磁盘文件中。Python从2.5版本开始就将sqlite3模块纳入标准库,无需额外安装。
典型应用场景包括:
- 移动端应用数据存储
- 桌面程序的本地数据管理
- 中小型网站的数据库层
- 数据分析的中间结果存储
python
import sqlite3
内存数据库(临时使用)
conn = sqlite3.connect(':memory:')
文件数据库(持久化)
conn = sqlite3.connect('mydatabase.db')
二、核心操作实战
1. 表创建与数据插入
python
def init_db():
conn = sqlite3.connect('library.db')
cursor = conn.cursor()
# 使用WITHOUT ROWID优化表结构
cursor.execute('''CREATE TABLE IF NOT EXISTS books
(id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
author TEXT,
price REAL) WITHOUT ROWID''')
# 安全参数化插入
books_data = [
('Python基础教程', '董伟明', 59.8),
('Flask Web开发', 'Miguel Grinberg', 69.0)
]
cursor.executemany("INSERT INTO books (title, author, price) VALUES (?, ?, ?)", books_data)
conn.commit()
conn.close()
注意事项:
- 始终使用参数化查询(?占位符)防止SQL注入
- 对于批量插入,executemany()比循环execute效率高30倍以上
- WITHOUT ROWID可提升约25%的查询性能
2. 数据查询进阶
python
def query_books():
conn = sqlite3.connect('library.db')
# 启用行工厂(获取列名)
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
# 条件查询示例
min_price = 60
cursor.execute("SELECT * FROM books WHERE price > ? ORDER BY price DESC", (min_price,))
# 获取结果的不同方式
print(cursor.fetchone()) # 单条记录
print(cursor.fetchall()) # 剩余所有记录
# 使用行工厂后可以通过列名访问
for row in cursor.execute("SELECT title, author FROM books"):
print(f"{row['title']} by {row['author']}")
conn.close()
3. 事务与异常处理
python
def safe_update():
conn = None
try:
conn = sqlite3.connect('library.db')
cursor = conn.cursor()
# 开启事务
conn.execute("BEGIN TRANSACTION")
cursor.execute("UPDATE books SET price = price * 1.1 WHERE author = ?", ('董伟明',))
# 模拟失败场景
if False:
raise ValueError("模拟异常")
conn.commit()
except Exception as e:
print(f"操作失败: {e}")
if conn:
conn.rollback()
finally:
if conn:
conn.close()
三、性能优化技巧
- 批量操作:使用executemany()批量处理数据时,速度比单条处理快50-100倍
- WAL模式:启用写前日志可提升并发性能
python conn.execute("PRAGMA journal_mode=WAL")
- 内存数据库:对临时数据使用
:memory:
数据库 - 连接池管理:频繁创建连接开销大,建议使用连接池工具
四、实际项目应用
在FlaskWeb项目中集成SQLite的典型模式:
python
import sqlite3
from flask import Flask, g
app = Flask(name)
def getdb():
if 'db' not in g:
g.db = sqlite3.connect('app.db')
g.db.rowfactory = sqlite3.Row
return g.db
@app.teardownappcontext
def closedb(e=None):
db = g.pop('db', None)
if db is not None:
db.close()
结语:SQLite虽小,却支撑着全球数十亿设备的运行。掌握Python与SQLite的配合使用,能为你的项目提供简单可靠的数据存储方案。当需要更高性能时,可以考虑结合SQLite的扩展功能如JSON1、FTS5等模块,将这个小巧的数据库发挥到极致。