如何在Python中使用SQLite数据库进行增删改查操作?

SQLite 是 Python 内置支持的轻量级嵌入式数据库,无需安装额外服务端,仅通过文件(或内存)存储数据,非常适合小型项目、测试场景或本地数据管理。以下是完整的增删改查(CRUD)操作教程,包含核心语法、示例代码和最佳实践。

一、核心前置知识

 

Python 内置 sqlite3 模块,无需 pip install,直接导入即可使用。

操作流程:建立连接 → 创建游标 → 执行SQL → 处理结果 → 提交事务(增删改)→ 关闭资源。

占位符:SQLite 使用 ? 作为参数占位符(避免 SQL 注入,切勿字符串拼接)。

 

二、完整 CRUD 示例

步骤1:导入模块并建立连接

python 体验AI代码助手 代码解读复制代码import sqlite3

 

# 1. 建立连接(关键)

# - 连接本地文件:test.db(不存在则自动创建)

# - 内存数据库:sqlite3.connect(":memory:")(程序退出后数据丢失)

conn = sqlite3.connect("test.db")

 

# 2. 创建游标(执行SQL的工具)

cursor = conn.cursor()

 

步骤2:创建表(基础准备)

先定义数据表结构(以 users 表为例,包含 id、姓名、年龄、邮箱):

python 体验AI代码助手 代码解读复制代码# 创建users表(IF NOT EXISTS 避免重复创建)

create_table_sql = """

CREATE TABLE IF NOT EXISTS users (

    id INTEGER PRIMARY KEY AUTOINCREMENT, -- 自增主键

    name TEXT NOT NULL, -- 姓名(非空)

    age INTEGER, -- 年龄

    email TEXT UNIQUE -- 邮箱(唯一,避免重复)

);

"""

cursor.execute(create_table_sql)

conn.commit() # 建表属于修改操作,需提交事务

 

步骤3:新增数据(CREATE)

支持单条插入和批量插入,核心是用 ? 占位符传递参数:

python 体验AI代码助手 代码解读复制代码# 方式1:单条插入

insert_single_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?);"

# 参数以元组形式传递,匹配占位符数量

cursor.execute(insert_single_sql, ("Alice", 25, "alice@example.com"))

 

# 方式2:批量插入(效率更高,减少IO)

insert_batch_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?);"

data_list = [

    ("Bob", 30, "bob@example.com"),

    ("Charlie", 28, "charlie@example.com"),

    ("David", 22, "david@example.com")

]

cursor.executemany(insert_batch_sql, data_list)

 

# 增删改操作必须提交事务,否则数据不生效

conn.commit()

print("插入数据成功,最后插入的ID:", cursor.lastrowid) # 获取最后插入的主键ID

 

步骤4:查询数据(READ)

查询无需提交事务,核心是通过 fetchone()/fetchall()/fetchmany(n) 获取结果:

python 体验AI代码助手 代码解读复制代码# 方式1:查询单条数据(fetchone())

select_single_sql = "SELECT * FROM users WHERE name = ?;"

cursor.execute(select_single_sql, ("Alice",))

single_result = cursor.fetchone() # 返回元组:(1, 'Alice', 25, 'alice@example.com')

print("单条查询结果:", single_result)

 

# 方式2:查询多条数据(fetchall())

select_all_sql = "SELECT id, name, age FROM users WHERE age > ?;"

cursor.execute(select_all_sql, (25,))

all_results = cursor.fetchall() # 返回列表嵌套元组:[(2, 'Bob', 30), (3, 'Charlie', 28)]

print("\n多条查询结果:")

for row in all_results:

    print(f"ID: {row[0]}, 姓名: {row[1]}, 年龄: {row[2]}")

 

# 方式3:指定条数查询(fetchmany(n))

cursor.execute("SELECT * FROM users;")

many_results = cursor.fetchmany(2) # 仅获取前2条

print("\n指定条数查询结果:", many_results)

 

# 进阶:返回字典格式结果(更易读)

# 创建游标时指定 row_factory

conn.row_factory = sqlite3.Row

cursor = conn.cursor()

cursor.execute("SELECT * FROM users WHERE id = ?;", (1,))

dict_result = cursor.fetchone()

print("\n字典格式结果:", dict_result["name"], dict_result["email"]) # 可通过键取值

 

步骤5:更新数据(UPDATE)

根据条件修改已有数据,注意加 WHERE 子句(否则会更新全表):

python 体验AI代码助手 代码解读复制代码update_sql = "UPDATE users SET age = ? WHERE name = ?;"

cursor.execute(update_sql, (26, "Alice")) # 将Alice的年龄改为26

conn.commit()

 

# 查看受影响的行数

print("更新影响的行数:", cursor.rowcount) # 输出:1

 

步骤6:删除数据(DELETE)

同样需加 WHERE 子句(否则删除全表数据):

python 体验AI代码助手 代码解读复制代码delete_sql = "DELETE FROM users WHERE id = ?;"

cursor.execute(delete_sql, (4,)) # 删除ID为4的记录

conn.commit()

 

print("删除影响的行数:", cursor.rowcount) # 输出:1

 

步骤7:关闭资源(避免泄漏)

python 体验AI代码助手 代码解读复制代码# 先关游标,再关连接

cursor.close()

conn.close()

 

三、最佳实践

1. 使用上下文管理器(with 语句)

自动关闭游标/连接,无需手动 close,更简洁安全:

python 体验AI代码助手 代码解读复制代码import sqlite3

 

# 上下文管理器简化操作

with sqlite3.connect("test.db") as conn:

    cursor = conn.cursor()

    # 执行查询

    cursor.execute("SELECT * FROM users;")

    print("上下文管理器查询结果:", cursor.fetchall())

    # 增删改无需手动commit,with块结束会自动提交(出错则回滚)

    cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?);", ("Eve", 29, "eve@example.com"))

 

2. 防 SQL 注入(关键)

严禁字符串拼接 SQL,必须使用 ? 占位符:

python 体验AI代码助手 代码解读复制代码# 错误示例(易被注入,如name传入 "Alice'; DROP TABLE users; --")

name = "Alice"

sql = f"SELECT * FROM users WHERE name = '{name}';" # 危险!

 

# 正确示例(占位符)

sql = "SELECT * FROM users WHERE name = ?;"

cursor.execute(sql, (name,)) # 安全

 

3. 处理异常(生产环境必备)

捕获 sqlite3.Error 异常,避免程序崩溃:

python 体验AI代码助手 代码解读复制代码import sqlite3

 

try:

    conn = sqlite3.connect("test.db")

    cursor = conn.cursor()

    # 执行可能出错的操作(如插入重复邮箱)

    cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?);", ("Frank", 35, "alice@example.com"))

    conn.commit()

except sqlite3.IntegrityError as e:

    # 捕获唯一键冲突异常

    print("插入失败:唯一键冲突", e)

    conn.rollback() # 出错回滚事务

except sqlite3.Error as e:

    print("数据库错误:", e)

    conn.rollback()

finally:

    if cursor:

        cursor.close()

    if conn:

        conn.close()

 

四、常见问题解答

 

建表后数据不生效?

增删改/建表操作需执行 conn.commit(),查询无需。

自增主键如何获取?

插入后通过 cursor.lastrowid 获取最后插入的 ID。

如何返回字典格式结果?

设置 conn.row_factory = sqlite3.Row,游标结果可通过键取值。

内存数据库的用途?

sqlite3.connect(":memory:") 适合临时测试,数据仅存于内存,程序退出后丢失。

 

总结

SQLite 操作的核心是:

 

连接:sqlite3.connect()(文件/内存);

执行:cursor.execute()(单条)/executemany()(批量);

参数:用 ? 占位符,避免 SQL 注入;

事务:增删改需 commit(),异常需 rollback();

资源:用 with 语句或手动关闭游标/

posted @ 2025-11-26 08:01  老程序员888  阅读(0)  评论(0)    收藏  举报