SQLite作为轻量级关系型数据库,凭借零配置、单文件存储的特性,成为很多小型项目数据存储的首选方案。下面我们通过实际案例讲解SQLite编程中增删改查的完整实现。

环境准备与数据库连接
Python标准库内置了sqlite3模块,无需额外安装依赖,直接导入即可使用。首先我们需要完成数据库的连接和游标创建,游标是执行SQL语句的核心对象。
import sqlite3
# 连接数据库,如果文件不存在会自动创建
conn = sqlite3.connect("test.db")
# 创建游标对象
cursor = conn.cursor()创建数据表
执行增删改查前需要先定义表结构,我们创建一个用户表,包含id、用户名、年龄三个字段,其中id设为主键自增。
-- 创建用户表的SQL语句
CREATE TABLE IF NOT EXISTS user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
age INTEGER
);在Python中执行建表语句的代码如下:
# 执行建表SQL
cursor.execute("""
CREATE TABLE IF NOT EXISTS user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
age INTEGER
)
""")
# 提交事务,建表操作需要提交才生效
conn.commit()插入数据(增)
插入数据支持单条插入和批量插入两种方式,推荐使用参数化查询避免SQL注入风险。
单条插入
# 单条插入数据,使用?作为占位符
insert_sql = "INSERT INTO user (username, age) VALUES (?, ?)"
cursor.execute(insert_sql, ("张三", 25))
conn.commit()
# 获取插入数据的自增id
print("插入成功,id为:", cursor.lastrowid)批量插入
# 批量插入多条数据
user_list = [("李四", 22), ("王五", 28), ("赵六", 30)]
cursor.executemany(insert_sql, user_list)
conn.commit()
print("批量插入完成,共插入%d条数据" % cursor.rowcount)查询数据(查)
查询操作不需要提交事务,执行后会返回结果集,我们可以通过游标的方法获取查询结果。
# 查询所有用户数据
query_sql = "SELECT id, username, age FROM user"
cursor.execute(query_sql)
# 获取所有查询结果,返回的是元组列表
all_users = cursor.fetchall()
print("所有用户数据:", all_users)
# 查询单条数据,比如查询id为1的用户
cursor.execute("SELECT * FROM user WHERE id = ?", (1,))
single_user = cursor.fetchone()
print("id为1的用户:", single_user)
# 带条件查询,查询年龄大于25的用户
cursor.execute("SELECT username, age FROM user WHERE age > ?", (25,))
older_users = cursor.fetchall()
print("年龄大于25的用户:", older_users)更新数据(改)
更新操作需要指定更新条件和更新的字段值,执行后同样需要提交事务。
# 更新id为1的用户年龄,改为26
update_sql = "UPDATE user SET age = ? WHERE id = ?"
cursor.execute(update_sql, (26, 1))
conn.commit()
print("更新影响行数:", cursor.rowcount)
# 批量更新,将所有30岁用户的用户名加后缀_old
cursor.execute("UPDATE user SET username = username || '_old' WHERE age = ?", (30,))
conn.commit()删除数据(删)
删除操作需要谨慎指定条件,避免误删全表数据,同样需要提交事务生效。
# 删除id为3的用户
delete_sql = "DELETE FROM user WHERE id = ?"
cursor.execute(delete_sql, (3,))
conn.commit()
print("删除影响行数:", cursor.rowcount)
# 清空表数据(谨慎使用)
# cursor.execute("DELETE FROM user")
# conn.commit()资源释放
所有操作完成后,需要关闭游标和数据库连接,释放资源,避免连接泄露。
# 先关闭游标 cursor.close() # 再关闭数据库连接 conn.close()
注意事项
- 所有写操作(增、改、删、建表)执行后必须调用
conn.commit()提交事务,否则操作不会生效 - 查询操作不需要提交事务,直接执行后即可获取结果
- 使用参数化查询(?占位符)代替字符串拼接SQL,避免SQL注入风险
- 操作完成后及时关闭连接,或者使用上下文管理器自动管理连接生命周期
如果需要自动管理连接,可以使用如下上下文方式:
# 使用上下文管理器自动关闭连接
with sqlite3.connect("test.db") as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM user")
print(cursor.fetchall())
# 退出with块后会自动提交事务(如果没有异常)并关闭连接