第122集 SQLite数据库操作
一、SQLite简介
1.1 什么是SQLite
SQLite是一款轻量级的嵌入式关系型数据库管理系统,它不需要独立的服务器进程,而是直接读写普通磁盘文件。SQLite是世界上使用最广泛的数据库引擎之一,被应用于各种设备和平台。
1.2 SQLite的特点
- 轻量级:整个SQLite库只有一个文件,体积不到1MB
- 无需安装:不需要复杂的安装和配置过程
- 零配置:不需要设置用户名、密码等
- 跨平台:支持Windows、Linux、macOS等所有主流操作系统
- ACID兼容:支持事务处理,保证数据的原子性、一致性、隔离性和持久性
- 支持标准SQL:可以使用大部分标准SQL语法
- Python内置支持:Python的标准库中包含sqlite3模块,无需额外安装
1.3 SQLite的应用场景
- 移动应用(Android、iOS)
- 嵌入式设备
- 小型Web应用
- 桌面应用
- 数据分析和原型开发
- 需要本地数据存储的场景
二、Python中使用SQLite
2.1 sqlite3模块
Python标准库中的sqlite3模块提供了与SQLite数据库交互的接口。使用该模块,我们可以轻松地在Python程序中创建、查询和管理SQLite数据库。
2.2 数据库连接
在使用SQLite之前,我们需要先建立与数据库的连接。如果指定的数据库文件不存在,SQLite会自动创建它。
import sqlite3
# 连接到SQLite数据库
# 如果数据库文件不存在,会自动在当前目录创建
conn = sqlite3.connect('test.db')
# 关闭数据库连接
conn.close()2.3 游标对象
连接数据库后,我们需要创建一个游标对象来执行SQL语句:
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 使用游标执行SQL语句
# ...
# 关闭游标和连接
cursor.close()
conn.close()三、SQLite基本操作
3.1 创建表
使用CREATE TABLE语句创建表:
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 创建user表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE
)
''')
# 提交事务
conn.commit()
cursor.close()
conn.close()3.2 插入数据
使用INSERT INTO语句插入数据:
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 插入单条数据
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", ('张三', 25, 'zhangsan@example.com'))
# 插入多条数据
users = [
('李四', 30, 'lisi@example.com'),
('王五', 28, 'wangwu@example.com')
]
cursor.executemany("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", users)
# 提交事务
conn.commit()
# 获取最后插入的ID
print(f"最后插入的ID: {cursor.lastrowid}")
cursor.close()
conn.close()3.3 查询数据
使用SELECT语句查询数据:
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 查询所有数据
cursor.execute("SELECT * FROM users")
all_users = cursor.fetchall()
print("所有用户:")
for user in all_users:
print(user)
# 查询第一条数据
cursor.execute("SELECT * FROM users WHERE age > 25")
first_user = cursor.fetchone()
print(f"\n年龄大于25的第一个用户: {first_user}")
# 查询前N条数据
cursor.execute("SELECT * FROM users ORDER BY age DESC")
top_users = cursor.fetchmany(2)
print("\n年龄最大的两个用户:")
for user in top_users:
print(user)
cursor.close()
conn.close()3.4 更新数据
使用UPDATE语句更新数据:
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 更新数据
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, '张三'))
# 提交事务
conn.commit()
# 查看更新结果
cursor.execute("SELECT * FROM users WHERE name = '张三'")
updated_user = cursor.fetchone()
print(f"更新后的用户信息: {updated_user}")
cursor.close()
conn.close()3.5 删除数据
使用DELETE语句删除数据:
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 删除数据
cursor.execute("DELETE FROM users WHERE age < ?", (28,))
# 提交事务
conn.commit()
# 查看剩余数据
cursor.execute("SELECT * FROM users")
remaining_users = cursor.fetchall()
print("剩余用户:")
for user in remaining_users:
print(user)
cursor.close()
conn.close()四、事务处理
4.1 什么是事务
事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全部成功,要么全部失败。
4.2 事务的ACID特性
- **原子性(Atomicity)**:事务中的所有操作要么全部完成,要么全部不完成
- **一致性(Consistency)**:事务执行前后,数据库从一个一致性状态转换到另一个一致性状态
- **隔离性(Isolation)**:多个事务并发执行时,一个事务的执行不应影响其他事务
- **持久性(Durability)**:事务一旦提交,其结果应该永久保存在数据库中
4.3 在SQLite中使用事务
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
try:
# 开始事务(默认已经开始)
# 执行操作1
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", ('赵六', 35, 'zhaoliu@example.com'))
# 执行操作2
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (31, '李四'))
# 提交事务
conn.commit()
print("事务执行成功")
except Exception as e:
# 回滚事务
conn.rollback()
print(f"事务执行失败: {e}")
finally:
cursor.close()
conn.close()五、高级操作
5.1 使用上下文管理器
使用with语句可以自动管理数据库连接和游标:
import sqlite3
# 使用上下文管理器管理连接
with sqlite3.connect('test.db') as conn:
# 使用上下文管理器管理游标
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM users")
users = cursor.fetchall()
print(users)
# 自动关闭游标和连接5.2 列名访问
默认情况下,查询结果返回的是元组,我们可以使用row_factory属性使查询结果返回字典:
import sqlite3
conn = sqlite3.connect('test.db')
# 设置row_factory为sqlite3.Row,使查询结果返回字典
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
users = cursor.fetchall()
for user in users:
# 可以通过列名访问
print(f"ID: {user['id']}, 姓名: {user['name']}, 年龄: {user['age']}")
cursor.close()
conn.close()5.3 执行脚本
使用executescript方法可以执行包含多个SQL语句的脚本:
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 执行脚本
cursor.executescript('''
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price REAL
);
INSERT INTO products (name, price) VALUES ('苹果', 5.5);
INSERT INTO products (name, price) VALUES ('香蕉', 3.0);
INSERT INTO products (name, price) VALUES ('橙子', 4.0);
''')
conn.commit()
# 查询产品
cursor.execute("SELECT * FROM products")
products = cursor.fetchall()
print("产品列表:")
for product in products:
print(product)
cursor.close()
conn.close()六、常见错误和注意事项
6.1 常见错误
- 数据库文件路径错误:确保提供的数据库文件路径正确
- SQL语法错误:检查SQL语句的语法是否正确
- 数据类型不匹配:确保插入的数据类型与表定义一致
- 主键冲突:避免插入重复的主键值
- 唯一约束冲突:避免插入重复的唯一约束字段值
- 外键约束错误:确保外键引用的记录存在
6.2 注意事项
- 关闭连接:使用完毕后及时关闭数据库连接
- 提交事务:对数据库的修改需要显式提交
- 使用参数化查询:避免SQL注入攻击
- 备份数据库:定期备份SQLite数据库文件
- 性能考虑:对于大量数据操作,考虑使用事务和批量操作
- 并发访问:SQLite支持并发读取,但写入操作是串行的
七、总结
本集我们学习了SQLite数据库的基本操作,包括:
- SQLite的特点和应用场景
- Python中sqlite3模块的使用
- 数据库连接和关闭
- 表的创建和管理
- 数据的增删改查操作
- 事务处理
- 高级操作和最佳实践
SQLite是一款轻量级的数据库,非常适合初学者学习数据库操作,也适合在实际项目中用于本地数据存储。在下一集中,我们将学习SQL的基础语法,进一步掌握数据库操作技能。
八、练习
- 创建一个学生表,包含id、name、gender、age、class等字段
- 向表中插入5条学生数据
- 查询所有学生的信息
- 查询年龄大于18的学生
- 更新某个学生的年龄
- 删除某个学生的信息
- 使用事务同时插入多个学生数据
- 使用上下文管理器管理数据库连接