Python SQLite3 保姆级教程:从零开始学数据库操作

Python SQLite3 保姆级教程:从零开始学数据库操作

本文适合纯新手!无需任何数据库基础,跟着步骤操作即可掌握 SQLite3 的核心用法。
目标:让你像用记事本一样轻松操作数据库!


目录

  1. 什么是 SQLite3?
  2. 环境准备
  3. 连接数据库
  4. 创建表
  5. 增删改查(CRUD)
  6. 事务与错误处理
  7. 高级技巧
  8. 常见问题
  9. 总结

1. 什么是 SQLite3?

SQLite3 是一个轻量级的 嵌入式数据库,无需安装独立服务,所有数据存储在一个文件中。

  • 无需配置:像操作普通文件一样使用。
  • 跨平台:数据库文件可在 Windows/macOS/Linux 共享。
  • 适合小型项目:APP 配置、本地缓存、小型网站等。

2. 环境准备

2.1 确认 Python 环境

确保已安装 Python(建议 3.6+)。打开终端输入以下命令:

python --version

若显示版本号(如 Python 3.8.5)则正常。若报错,需先 安装 Python。

2.2 导入 SQLite3 模块

无需额外安装!Python 自带 sqlite3 库,直接在代码中导入:

import sqlite3

3. 连接数据库

3.1 连接到磁盘数据库(持久化)

# 连接到当前目录下的 test.db 文件(不存在则自动创建)
conn = sqlite3.connect('test.db')
  • 文件路径规则
    • 'test.db':当前目录下的 test.db 文件。
    • '/home/user/data.db':绝对路径指定位置。
  • 注意:关闭程序后文件依然存在,下次可重新连接。

3.2 连接到内存数据库(临时使用)

conn = sqlite3.connect(':memory:')  # 程序关闭后数据消失

3.3 创建游标(操作数据库的“手”)

cursor = conn.cursor()  # 所有 SQL 操作通过游标执行

4. 创建表

4.1 基本语法

# 创建 users 表(如果不存在)
cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,  # 自增主键name TEXT NOT NULL,                    # 文本类型,不能为空age INTEGER,                           # 整数类型email TEXT UNIQUE                      # 唯一约束(邮箱不可重复))
''')
conn.commit()  # 提交事务(创建表需要提交)

4.2 字段类型

类型说明
INTEGER整数(如 1, -5, 100)
TEXT字符串(如 “Hello”)
REAL浮点数(如 3.14)
BLOB二进制数据(如图片)

4.3 验证表是否创建成功

# 查询数据库中所有表名
cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
print(cursor.fetchall())  # 输出:[('users',)]

5. 增删改查(CRUD)

5.1 插入数据(Create)

插入单条数据
# 使用 ? 占位符避免 SQL 注入
cursor.execute('''INSERT INTO users (name, age, email)VALUES (?, ?, ?)
''', ('Alice', 30, 'alice@example.com'))
conn.commit()  # 提交!
批量插入数据
users = [('Bob', 25, 'bob@example.com'),('Charlie', 35, 'charlie@example.com')
]
cursor.executemany('''INSERT INTO users (name, age, email) VALUES (?, ?, ?)
''', users)
conn.commit()

5.2 查询数据(Read)

查询所有记录
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()  # 获取全部结果
for row in rows:print(row)  # 输出:(1, 'Alice', 30, 'alice@example.com')
条件查询
# 查找年龄大于 28 的用户
cursor.execute('SELECT * FROM users WHERE age > ?', (28,))
results = cursor.fetchall()
for row in results:print(f"ID: {row[0]}, 姓名: {row[1]}, 年龄: {row[2]}")
查询单条记录
cursor.execute('SELECT * FROM users WHERE id = ?', (1,))
user = cursor.fetchone()  # 只获取第一条
print(user)  # 输出:(1, 'Alice', 30, 'alice@example.com')

5.3 更新数据(Update)

# 将 Alice 的邮箱更新为 new_email@example.com
cursor.execute('''UPDATE usersSET email = ?WHERE name = ?
''', ('new_email@example.com', 'Alice'))
conn.commit()

5.4 删除数据(Delete)

# 删除 ID 为 2 的用户
cursor.execute('DELETE FROM users WHERE id = ?', (2,))
conn.commit()

6. 事务与错误处理

6.1 什么是事务?

  • 事务:一组原子性的操作,要么全部成功,要么全部失败。
  • 示例:转账操作(A 扣款,B 加款必须同时成功)。

6.2 手动提交与回滚

try:cursor.execute("INSERT INTO users (name) VALUES ('David')")cursor.execute("INSERT INTO users (name) VALUES ('Eve')")conn.commit()  # 成功则提交
except sqlite3.Error as e:print("出错啦:", e)conn.rollback()  # 失败则回滚(撤销所有操作)

6.3 自动提交(推荐)

使用 with 上下文管理器:

with sqlite3.connect('test.db') as conn:cursor = conn.cursor()cursor.execute("INSERT INTO users (name) VALUES ('Frank')")# 无需 commit,退出 with 块时自动提交

7. 高级技巧

7.1 以字典形式返回结果

默认返回元组,可通过 row_factory 改为字典:

def dict_factory(cursor, row):return {col[0]: row[idx] for idx, col in enumerate(cursor.description)}conn.row_factory = dict_factory
cursor = conn.cursor()
cursor.execute('SELECT * FROM users WHERE id = 1')
print(cursor.fetchone())  # 输出:{'id': 1, 'name': 'Alice', ...}

7.2 使用 SQLite 浏览器查看数据

推荐工具:DB Browser for SQLite

  • 可视化查看表结构、数据。
  • 直接执行 SQL 语句。

8. 常见问题

Q1:代码运行后找不到数据库文件?

  • 检查当前目录:在代码中添加:
    import os
    print(os.getcwd())  # 查看文件实际保存路径
    
  • 使用绝对路径:如 sqlite3.connect('/User/name/data.db')

Q2:插入数据后查询不到?

  • 忘记提交事务:确保执行 conn.commit()
  • 查询条件错误:检查 WHERE 子句是否拼写正确。

Q3:如何备份数据库?

直接复制 .db 文件即可!SQLite 数据库是单一文件。


9. 总结

通过本教程,你已经学会了:

  1. 连接数据库(文件 vs 内存)
  2. 创建表(字段类型与约束)
  3. 增删改查(参数化查询防注入)
  4. 事务管理(提交与回滚)
  5. 高级技巧(字典结果、可视化工具)

下一步建议

  • 尝试为本地的通讯录、笔记应用添加数据库支持。
  • 学习更复杂的 SQL 语法(如 JOIN 查询)。

遇到问题? 随时查阅本文代码示例,或使用 SQLite 浏览器调试!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中的整数类型(short,int,long和long long)

整数是编程中最常见的一种数据类型,C语言提供了多种整数类型,包括 short、int、long 和 long long,它们的主要区别在于存储范围和内存占用的大小。 本节将详细讲解这些整数类型的定义、特性、使用场景以及注意事项,帮助你全面理解…

使用jcodec库,访问网络视频提取封面图片上传至oss

注释部分为FFmpeg(确实方便但依赖太大,不想用) package com.zuodou.upload;import com.aliyun.oss.OSS; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; import com.zuodou.oss.OssProperties;…

游戏引擎学习第147天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾 具体来说,我们通过隐式计算来解决问题,而不是像数字微分分析器那样逐步增加数据。我们已经涵盖了这个部分,并计划继续处理音量问题。不过,实际上我们现在不需要继续处理…

使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile

比起容器、镜像来说,Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个 Layer,而 Docker 顺序执行这个文件里的所有步骤&…

Linux -- 磁盘结构、文件系统ext2

一、磁盘 1.磁盘的物理结构 2.磁盘的存储结构 盘片:是机械硬盘存储数据的主要介质,一般由铝合金或玻璃等材料制成,表面涂有一层磁性材料。数据通过磁头在盘片的磁性涂层上进行磁化来记录,磁化的不同方向代表二进制的 0 和 1。盘面…

标量、向量、矩阵与张量:从维度理解数据结构的层次

在数学和计算机科学中,维度描述了数据结构的复杂性,而标量、向量、矩阵、张量则是不同维度的数据表示形式。它们的关系可以理解为从简单到复杂的扩展,以下是详细解析: 1. 标量(Scalar):0维数据 定义:单个数值,没有方向,只有大小。 维度:0维(无索引)。 示例: 温度…

点云数据处理--splat转3dtiles

文章目录 处理流程简介核心功能实现数据读取与格式转换定义Point类数据读取splat转gltf 点云数据分割定义四叉树递归生成3dtiles瓦片 生成tileset.json递归生成tileset.json计算box 主函数调用渲染 下一步工作性能优化渲染效果调优其他 源码地址: github 处理流程简…

OneM2M:全球性的物联网标准-可应用于物联网中

OneM2M 是一个全球性的物联网(IoT)标准,旨在为物联网设备和服务提供统一的框架和接口,以实现设备之间的互操作性、数据共享和服务集成。OneM2M 由多个国际标准化组织(如 ETSI、TIA、TTC、ARIB 等)共同制定,目标是解决物联网领域的碎片化问题,提供一个通用的标准,支持跨…

【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,

欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创&#x1…

Java爬虫获取淘宝商品详情数据的完整指南

在电商领域,获取商品详情数据对于市场分析、价格监控、用户体验优化等场景具有重要意义。淘宝作为国内领先的电商平台,提供了丰富的API接口供开发者使用,其中item_get和item_get_pro接口可以用来获取商品的详细信息。本文将详细介绍如何使用J…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数

nei声明在 src/core/ngx_cycle.h ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle);实现在 src/core/ngx_cycle.c ngx_cycle_t * ngx_init_cycle(ngx_cycle_t *old_cycle) {void *rv;char **senv;ngx_uint_t i, n;ngx_log_t …

qt 操作多个sqlite文件

qt 操作多个sqlite文件 Chapter1 qt 操作多个sqlite文件1. 引入必要的头文件2. 创建并连接多个SQLite数据库3. 代码说明4. 注意事项 Chapter2 qt 多线程操作sqlite多文件1. 引入必要的头文件2. 创建数据库操作的工作线程类3. 在主线程中创建并启动多个工作线程4. 代码说明5. 运…

最新版本WebContext构造函数-避坑

import org.thymeleaf.context.IWebContext; import org.thymeleaf.context.WebContext; 当你想把页面信息全部获取出来存到redis缓存中使用时,SpringWebContext在Spring5中报错 SpringWebContext ctx new SpringWebContext(request, response,request.getServlet…

用Python分割并高效处理PDF大文件

在处理大型PDF文件时,将它们分解成更小、更易于管理的块通常是有益的。这个过程称为分区,它可以提高处理效率,并使分析或操作文档变得更容易。在本文中,我们将讨论如何使用Python和为Unstructured.io库将PDF文件划分为更小的部分。…

neo4j随笔-将csv文件导入知识图谱

目录 导入前的准备 导入csv文件 导入nodes1.1.csv并动态为节点添加标签 ​编辑导入relations1.1.csv并动态为关系添加标签 结果 导入前的准备 我有两个csv文件 nodes1.1.csv存放节点信息,用记事本打开,能正常显示,且编码为UTF-8,就可以…

cpu 多级缓存L1、L2、L3 与主存关系

现代 CPU 的多级缓存(L1、L2、L3)和主存(DRAM)构成了一个层次化的内存系统,旨在通过减少内存访问延迟和提高数据访问速度来优化计算性能。以下是对多级缓存和主存的详细解析: 1. 缓存层次结构 现代 CPU 通…

C++:入门详解(关于C与C++基本差别)

目录 一.C的第一个程序 二.命名空间(namespace) 1.命名空间的定义与使用: (1)命名空间里可以定义变量,函数,结构体等多种类型 (2)命名空间调用(&#xf…

Python的学习篇(七)--网页结构

七、网页(HTML)结构 7.1 HTML介绍 HTML(Hyper Text Markup Language),超文本标记语言。 超文本:比文本的功能要强大,通过链接和交互式的方式来组织与呈现信息的文本形式。不仅仅有文本,还可以包含图片、…

*VulnHub-FristiLeaks:1.3暴力解法、细节解法,主打软硬都吃,隧道搭建、寻找exp、提权、只要你想没有做不到的姿势

*VulnHub-FristiLeaks:1.3暴力解法、细节解法,主打软硬都吃,隧道搭建、寻找exp、提权、只要你想没有做不到的姿势 一、信息收集 1、扫靶机ip 经典第一步,扫一下靶机ip arp-scan -l 扫描同网段 nmap -sP 192.168.122.0/242、指纹扫描、端口…

PHP:格式化JSON为PHP语法格式

1. 原生函数 $arr [1,2,3,4]; $str var_export($a,true); var_dump($str); 2. 自定义方法 class Export{private static $space;private static function do($a, string $prev){$res ;$next $prev . self::$space;if (is_array($a)) {$res . [;foreach ($a as $k > $…