在Python中使用SQLite数据库进行增删改查操作的代码示例

 更新时间:2025年11月25日 08:43:28   作者:test管家  
SQLite 是 Python 内置支持的轻量级嵌入式数据库,无需安装额外服务端,仅通过文件(或内存)存储数据,非常适合小型项目、测试场景或本地数据管理,以下是完整的增删改查(CRUD)操作教程,包含核心语法、示例代码和最佳实践,需要的朋友可以参考下

一、核心前置知识

  1. Python 内置 sqlite3 模块,无需 pip install,直接导入即可使用。
  2. 操作流程:建立连接 → 创建游标 → 执行SQL → 处理结果 → 提交事务(增删改)→ 关闭资源
  3. 占位符:SQLite 使用 ? 作为参数占位符(避免 SQL 注入,切勿字符串拼接)。

二、完整 CRUD 示例

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

import sqlite3

# 1. 建立连接(关键)
# - 连接本地文件:test.db(不存在则自动创建)
# - 内存数据库:sqlite3.connect(":memory:")(程序退出后数据丢失)
conn = sqlite3.connect("test.db")

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

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

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

# 创建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)

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

# 方式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) 获取结果:

# 方式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 子句(否则会更新全表):

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 子句(否则删除全表数据):

delete_sql = "DELETE FROM users WHERE id = ?;"
cursor.execute(delete_sql, (4,))  # 删除ID为4的记录
conn.commit()

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

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

# 先关游标,再关连接
cursor.close()
conn.close()

三、最佳实践

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

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

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,必须使用 ? 占位符:

# 错误示例(易被注入,如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 异常,避免程序崩溃:

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()

四、常见问题解答

  1. 建表后数据不生效?
    增删改/建表操作需执行 conn.commit(),查询无需。
  2. 自增主键如何获取?
    插入后通过 cursor.lastrowid 获取最后插入的 ID。
  3. 如何返回字典格式结果?
    设置 conn.row_factory = sqlite3.Row,游标结果可通过键取值。
  4. 内存数据库的用途?
    sqlite3.connect(":memory:") 适合临时测试,数据仅存于内存,程序退出后丢失。

总结

SQLite 操作的核心是:

  • 连接:sqlite3.connect()(文件/内存);
  • 执行:cursor.execute()(单条)/executemany()(批量);
  • 参数:用 ? 占位符,避免 SQL 注入;
  • 事务:增删改需 commit(),异常需 rollback()
  • 资源:用 with 语句或手动关闭游标/连接。

掌握以上内容,即可满足 Python 中 SQLite 绝大部分基础使用场景。

以上就是在Python中使用SQLite数据库进行增删改查操作的代码示例的详细内容,更多关于Python使用SQLite增删改查的资料请关注脚本之家其它相关文章!

相关文章

  • Python查询IP地址归属完整代码

    Python查询IP地址归属完整代码

    这篇文章主要介绍了Python查询IP地址归属完整代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • python之no module named xxxx以及虚拟环境配置过程

    python之no module named xxxx以及虚拟环境配置过程

    在Python开发过程中,经常会遇到环境配置和包管理的问题,主要原因包括未安装所需包或使用虚拟环境导致的,通过pip install命令安装缺失的包是解决问题的一种方式,此外,使用虚拟环境,例如PyCharm支持的Virtualenv,可以为每个项目创建独立的运行环境
    2024-10-10
  • wxPython+Matplotlib绘制折线图表

    wxPython+Matplotlib绘制折线图表

    这篇文章主要介绍了wxPython+Matplotlib绘制折线图表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Django零基础入门之自定义过滤器及模板中的使用

    Django零基础入门之自定义过滤器及模板中的使用

    这篇文章主要介绍了Django零基础入门之自定义过滤器及模板中的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Conda虚拟环境的复制和迁移的四种方法实现

    Conda虚拟环境的复制和迁移的四种方法实现

    本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,直接复制envs目录,各方法适用于不同场景,需根据需求选择
    2025-06-06
  • Python自然语言处理之snownlp模块介绍、安装与常见操作实战案例

    Python自然语言处理之snownlp模块介绍、安装与常见操作实战案例

    SnowNLP是一个针对中文文本处理的Python库,提供分词、词性标注、情感分析等功能,它基于自然语言处理技术,能够处理unicode编码的文本,这篇文章主要介绍了Python自然语言处理之snownlp模块介绍、安装与常见操作的相关资料,需要的朋友可以参考下
    2024-11-11
  • Python 中给请求设置用户代理 User-Agent的方法

    Python 中给请求设置用户代理 User-Agent的方法

    本文介绍 HTTP 标头用户代理主题以及如何使用 Python 中的请求设置用户代理,您将了解 HTTP 标头及其在理解用户代理、获取用户代理以及学习使用 Python 中的请求设置用户代理的多种方法方面的重要性,感兴趣的朋友跟随小编一起看看吧
    2023-06-06
  • python使用cookie库操保存cookie详解

    python使用cookie库操保存cookie详解

    Python中Cookie模块(python3中为http.cookies)提供了一个类似字典的特殊对象SimpleCookie,其中存储并管理着称为Morsel的cookie值集合,这里介绍了python操作cookie的使用方法
    2014-03-03
  • python读取注册表中值的方法

    python读取注册表中值的方法

    在Python的标准库中,_winreg.pyd可以操作Windows的注册表,另外第三方的win32库封装了大量的Windows API,使用起来也很方便。不过这里介绍的是使用_winreg操作注册表,毕竟是Python自带的标准库,无需安装第三方库
    2013-04-04
  • 详解python算法之冒泡排序

    详解python算法之冒泡排序

    这篇文章主要介绍了详解python算法之冒泡排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03

最新评论