当前位置: 首页 > news >正文

Python + sqlite3 本地 SQLite 数据库操作实战:完整 CRUD 入门教程

Python + sqlite3 本地 SQLite 数据库操作实战:从建库建表到完整 CRUD

对于 Python 后端初学者来说,数据库操作是必须掌握的基础能力。很多 Web 项目、接口服务、爬虫程序、桌面工具都会涉及数据的保存、查询和更新。

如果你刚开始学习数据库,不一定要马上安装 MySQL、PostgreSQL 这类独立数据库服务。Python 标准库自带的sqlite3就可以直接操作 SQLite 本地数据库,非常适合学习 SQL、练习 CRUD、开发小型本地项目。

本文将通过一个“用户信息管理”的例子,带你完成:

  • sqlite3库介绍
  • 创建 SQLite 数据库
  • 创建数据表
  • 插入数据
  • 查询数据
  • 修改数据
  • 删除数据
  • Python ORM 思想简单介绍
  • 完整 CRUD 演示代码

一、sqlite3 库介绍

sqlite3是 Python 标准库自带的 SQLite 数据库操作模块,不需要额外安装。

SQLite 是一种轻量级嵌入式数据库,它的特点是:

  • 不需要单独启动数据库服务
  • 数据保存在本地.db文件中
  • 适合学习、测试、小型工具、桌面程序和轻量级后端项目
  • 支持常见 SQL 语句,例如CREATE TABLEINSERTSELECTUPDATEDELETE

在 Python 中使用 SQLite,只需要导入:

importsqlite3

一个典型的数据库操作流程如下:

importsqlite3 conn=sqlite3.connect("demo.db")cursor=conn.cursor()cursor.execute("SELECT sqlite_version()")print(cursor.fetchone())conn.close()

这里有几个重要概念:

  • connect():连接数据库,如果数据库文件不存在,会自动创建
  • connection:数据库连接对象,通常命名为conn
  • cursor:游标对象,用来执行 SQL 语句
  • execute():执行 SQL
  • commit():提交事务,让新增、修改、删除真正生效
  • close():关闭数据库连接

二、创建数据库

使用 SQLite 创建数据库非常简单,只需要连接一个.db文件即可。

importsqlite3 conn=sqlite3.connect("student.db")conn.close()

运行后,当前目录下会生成一个student.db文件。

如果文件已经存在,sqlite3.connect()会直接连接这个数据库;如果文件不存在,就会自动创建。

在实际项目中,也可以把数据库文件放到指定目录:

conn=sqlite3.connect(r"D:\data\student.db")

Windows 路径前面加r,可以避免反斜杠被当作转义字符。

三、创建数据表

数据库文件创建好以后,还需要创建数据表。数据表类似 Excel 中的一张工作表,用来存储某一类数据。

下面创建一张users表,用来保存用户信息:

importsqlite3 conn=sqlite3.connect("app.db")cursor=conn.cursor()sql=""" CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT UNIQUE, created_at TEXT DEFAULT CURRENT_TIMESTAMP ) """cursor.execute(sql)conn.commit()conn.close()

字段说明:

  • id:用户编号,主键,自增
  • name:用户名,不能为空
  • age:年龄,整数类型
  • email:邮箱,唯一
  • created_at:创建时间,默认使用当前时间

CREATE TABLE IF NOT EXISTS的意思是:如果表不存在就创建,如果已经存在就不重复创建,避免程序重复运行时报错。

四、插入数据

插入数据使用INSERT INTO语句。

importsqlite3 conn=sqlite3.connect("app.db")cursor=conn.cursor()sql="INSERT INTO users (name, age, email) VALUES (?, ?, ?)"cursor.execute(sql,("张三",22,"zhangsan@example.com"))conn.commit()conn.close()

这里需要重点注意:推荐使用?占位符传参,而不是直接拼接字符串。

推荐写法:

cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)",("李四",25,"lisi@example.com"))

不推荐写法:

name="李四"sql="INSERT INTO users (name) VALUES ('"+name+"')"

字符串拼接 SQL 容易出现 SQL 注入风险,也容易因为引号、特殊字符导致 SQL 报错。

如果要一次插入多条数据,可以使用executemany()

users=[("王五",28,"wangwu@example.com"),("赵六",30,"zhaoliu@example.com"),("钱七",24,"qianqi@example.com")]cursor.executemany("INSERT INTO users (name, age, email) VALUES (?, ?, ?)",users)conn.commit()

五、查询数据

查询数据使用SELECT语句。

查询所有用户:

cursor.execute("SELECT id, name, age, email, created_at FROM users")rows=cursor.fetchall()forrowinrows:print(row)

fetchall()会获取所有查询结果,返回一个列表,每一行是一个元组。

如果只想查询一条数据,可以使用fetchone()

cursor.execute("SELECT id, name, age, email FROM users WHERE id = ?",(1,))user=cursor.fetchone()print(user)

注意(1,)不是写错了。Python 中只有一个元素的元组,必须加逗号。

也可以按条件查询:

cursor.execute("SELECT id, name, age, email FROM users WHERE age >= ?",(25,))rows=cursor.fetchall()

六、修改数据

修改数据使用UPDATE语句。

下面把id=1的用户年龄改为23

cursor.execute("UPDATE users SET age = ? WHERE id = ?",(23,1))conn.commit()

如果想同时修改多个字段,可以这样写:

cursor.execute("UPDATE users SET name = ?, email = ? WHERE id = ?",("张三丰","zhangsanfeng@example.com",1))conn.commit()

执行UPDATE时一定要小心WHERE条件。如果没有WHERE,可能会把整张表的数据都修改掉。

七、删除数据

删除数据使用DELETE语句。

删除id=1的用户:

cursor.execute("DELETE FROM users WHERE id = ?",(1,))conn.commit()

同样要注意:DELETE语句必须谨慎使用WHERE条件。

危险写法:

cursor.execute("DELETE FROM users")

这会删除users表中的所有数据。

如果只是想清空测试数据,可以明确知道后果后再执行。

八、事务和异常处理

在数据库操作中,新增、修改、删除都需要提交事务。

如果执行成功,就调用:

conn.commit()

如果执行失败,可以回滚:

conn.rollback()

更推荐使用try...except...finally管理数据库连接:

importsqlite3 conn=Nonetry:conn=sqlite3.connect("app.db")cursor=conn.cursor()cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)",("测试用户",20,"test@example.com"))conn.commit()exceptsqlite3.Errorase:ifconn:conn.rollback()print("数据库操作失败:",e)finally:ifconn:conn.close()

这样可以避免程序异常时数据库连接没有关闭。

九、Python ORM 思想简单介绍

前面我们直接写 SQL 操作数据库,这种方式直观、灵活,也适合初学者理解数据库底层逻辑。

在真实后端项目中,还经常会使用 ORM。

ORM 的全称是 Object Relational Mapping,中文通常叫“对象关系映射”。它的核心思想是:

把数据库中的表映射成 Python 类,把表中的一行数据映射成 Python 对象,把字段映射成对象属性。

例如数据库中有一张users表:

users 表 id | name | age | email

在 ORM 中,可能会定义一个User类:

classUser:def__init__(self,id,name,age,email):self.id=idself.name=name self.age=age self.email=email

查询数据库后,可以把一行数据转换成对象:

row=(1,"张三",22,"zhangsan@example.com")user=User(row[0],row[1],row[2],row[3])print(user.name)

这样做的好处是:

  • 代码更接近面向对象写法
  • 业务层可以少写 SQL
  • 数据结构更清晰
  • 大项目中更容易维护

Python 中常见 ORM 框架包括:

  • SQLAlchemy
  • Django ORM
  • Peewee

不过,建议初学者先掌握基础 SQL 和sqlite3,再学习 ORM。因为 ORM 本质上也是帮你生成和执行 SQL,如果完全不了解 SQL,后面排查问题会比较困难。

十、完整 CRUD 演示代码

下面是一份完整示例代码,包含创建数据库、创建数据表、插入数据、查询数据、修改数据、删除数据,以及一个简单的对象转换示例。

你可以保存为sqlite_crud_demo.py后直接运行。

importsqlite3fromdataclassesimportdataclass DB_NAME="app.db"@dataclassclassUser:id:intname:strage:intemail:strcreated_at:strdefget_connection():returnsqlite3.connect(DB_NAME)defcreate_table():conn=get_connection()cursor=conn.cursor()sql=""" CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT UNIQUE, created_at TEXT DEFAULT CURRENT_TIMESTAMP ) """cursor.execute(sql)conn.commit()conn.close()definsert_user(name,age,email):conn=get_connection()cursor=conn.cursor()try:cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)",(name,age,email))conn.commit()print("插入成功,用户 ID:",cursor.lastrowid)exceptsqlite3.Errorase:conn.rollback()print("插入失败:",e)finally:conn.close()definsert_many_users(users):conn=get_connection()cursor=conn.cursor()try:cursor.executemany("INSERT INTO users (name, age, email) VALUES (?, ?, ?)",users)conn.commit()print("批量插入成功")exceptsqlite3.Errorase:conn.rollback()print("批量插入失败:",e)finally:conn.close()defquery_all_users():conn=get_connection()cursor=conn.cursor()cursor.execute("SELECT id, name, age, email, created_at FROM users")rows=cursor.fetchall()conn.close()return[User(*row)forrowinrows]defquery_user_by_id(user_id):conn=get_connection()cursor=conn.cursor()cursor.execute("SELECT id, name, age, email, created_at FROM users WHERE id = ?",(user_id,))row=cursor.fetchone()conn.close()ifrowisNone:returnNonereturnUser(*row)defupdate_user_age(user_id,new_age):conn=get_connection()cursor=conn.cursor()cursor.execute("UPDATE users SET age = ? WHERE id = ?",(new_age,user_id))conn.commit()ifcursor.rowcount==0:print("没有找到要修改的用户")else:print("修改成功")conn.close()defdelete_user(user_id):conn=get_connection()cursor=conn.cursor()cursor.execute("DELETE FROM users WHERE id = ?",(user_id,))conn.commit()ifcursor.rowcount==0:print("没有找到要删除的用户")else:print("删除成功")conn.close()defprint_users(users):foruserinusers:print(f"ID:{user.id}, 姓名:{user.name}, 年龄:{user.age}, "f"邮箱:{user.email}, 创建时间:{user.created_at}")if__name__=="__main__":create_table()insert_user("张三",22,"zhangsan@example.com")insert_many_users([("李四",25,"lisi@example.com"),("王五",28,"wangwu@example.com"),("赵六",30,"zhaoliu@example.com")])print("\n查询所有用户:")users=query_all_users()print_users(users)print("\n查询 ID 为 1 的用户:")user=query_user_by_id(1)print(user)print("\n修改 ID 为 1 的用户年龄:")update_user_age(1,23)print("\n修改后的用户列表:")users=query_all_users()print_users(users)print("\n删除 ID 为 2 的用户:")delete_user(2)print("\n删除后的用户列表:")users=query_all_users()print_users(users)

十一、代码运行说明

运行代码:

python sqlite_crud_demo.py

第一次运行后,当前目录下会生成:

app.db

这个文件就是 SQLite 数据库文件。

如果重复运行示例代码,可能会因为email字段设置了唯一约束而出现类似错误:

UNIQUE constraint failed: users.email

这是正常现象,说明同一个邮箱不能重复插入。测试时可以删除app.db后重新运行,或者修改示例中的邮箱地址。

十二、后端初学者需要掌握的重点

学习sqlite3时,建议重点掌握下面几个点:

  • 数据库连接:sqlite3.connect()
  • 创建游标:conn.cursor()
  • 执行 SQL:cursor.execute()
  • 参数化 SQL:使用?占位符
  • 提交事务:conn.commit()
  • 回滚事务:conn.rollback()
  • 关闭连接:conn.close()
  • 查询一条数据:fetchone()
  • 查询多条数据:fetchall()
  • 判断影响行数:cursor.rowcount

对于后端开发来说,数据库操作不仅仅是会写 SQL,还要注意安全性和稳定性。例如参数化 SQL 可以降低 SQL 注入风险,事务处理可以避免数据写入一半就失败的问题。

十三、总结

本文通过 Python 标准库sqlite3演示了本地 SQLite 数据库的基本操作,包括:

  • 创建数据库
  • 创建数据表
  • 插入数据
  • 查询数据
  • 修改数据
  • 删除数据
  • 简单理解 ORM 思想
  • 使用dataclass把查询结果转换成 Python 对象
  • 完整 CRUD 示例代码

对于 Python 后端初学者来说,SQLite 是非常适合作为第一门数据库实践工具的。它不需要安装数据库服务,只需要一个.db文件就能完成完整的数据增删改查。掌握这些基础之后,再学习 MySQL、PostgreSQL、SQLAlchemy 或 Django ORM,会更加顺畅。

http://www.jsqmd.com/news/780470/

相关文章:

  • 【线性代数笔记】秩、线性相关性与等价向量组的核心逻辑总结
  • 构建个人技能知识图谱:基于Python的自动化技能迁移工具实战
  • WebMCP:连接Web应用与AI模型的统一协议服务器实践
  • javassit使用过程的坑
  • 开源小型机器人夹爪miniclawd:从设计到实现的完整指南
  • ART-PI开发板实测:解锁STM32H750隐藏的2MB Flash,手把手教你修改Keil MDK链接脚本
  • AUTOSAR DEM操作周期配置避坑指南:从Dem_RestartOperationCycle到CycleQualified的实战解析
  • 30个客户,30本定制手册:文档团队的噩梦
  • OpenClaw三层记忆系统:为AI助手构建可检索的长期知识库
  • 2026年4月目前专业的泡沫包装制造商推荐,电子产品泡沫包装/铝箔保温纸箱/防水纸箱/医药泡沫箱,泡沫包装供应商推荐 - 品牌推荐师
  • 基于MCP协议实现Cursor与Figma双向通信:AI代码助手连接设计工具的完整指南
  • Aspire深度解析
  • 告别冗余!Linux软件卸载命令全攻略,让你的系统焕然一新
  • G-Helper终极指南:AMD CPU降压优化,温度直降15℃的完整教程
  • AI编码助手效率革命:ai-codex工具如何通过静态分析生成项目索引
  • 2025届学术党必备的六大降重复率工具推荐
  • 游戏数据可视化实战:osu!光标叠加层原理、部署与高级配置指南
  • BarTender如何取消激活和重新激活
  • 科研绘图实战:用 Gemini 生成论文级示意图(机制图/架构图/流程图)
  • PCCAD里标注小尺寸时,如何不显示中间的尺寸线
  • Cursor Free VIP:开源工具助你免费畅享 Cursor AI Pro 功能,提升编程效率与代码质量,提供重置机器 ID 的功能
  • 【Python实战】告别杂乱脚本!基于SOLID原则与策略模式的 PDF转Word 批量处理系统
  • ChatLLM-Web:基于Vue与FastAPI的轻量级LLM应用开发框架解析
  • Cursor AI编程效率追踪器:本地化数据采集与可视化分析实践
  • AI工作空间自动化清理:OpenClearn工具的安全策略与实战指南
  • 2026年靠谱的液碱液体氢氧化钠/片碱片状氢氧化钠优质公司推荐 - 品牌宣传支持者
  • OTN技术如何提升城域以太网传输效率
  • 看外语视频终于不慌了!这款双语字幕插件真实体验
  • Windows Cleaner:专注 C 盘清理的开源免费工具,可以清理内存和临时文件,还能对磁盘进行分析,开源无广告,无需注册,界面友好
  • 用Verilog复现tiny_ODIN:一个给数字IC新手的SNN加速器入门实战(附环境配置避坑指南)