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

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 浏览器调试!

相关文章:

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

Python SQLite3 保姆级教程:从零开始学数据库操作 本文适合纯新手!无需任何数据库基础,跟着步骤操作即可掌握 SQLite3 的核心用法。 目标:让你像用记事本一样轻松操作数据库! 目录 什么是 SQLite3?环境准…...

第七步:简单爬虫与网页测试

Puppeteer 官方文档:https://puppeteer.bootcss.com/ 1、安装 puppeteer是一个node插件安装命令:npm i puppeteer 2、概念 无头浏览器:就是不打开浏览器的页面,直接进行浏览器后台操作 3、入门 引入:import pup…...

4.桥接模式

概况 桥接模式:将抽象部分与实现部分分离,使它们可以独立变化,通过组合而非继承的方式实现解耦。 业务场景 场景描述:开发一个跨平台的图形绘制系统,支持不同形状(如圆形、矩形)和不同渲染方式…...

Golang学习笔记_44——命令模式

Golang学习笔记_41——观察者模式 Golang学习笔记_42——迭代器模式 Golang学习笔记_43——责任链模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 事务管理系统2. 多媒体遥控器3. 操作审计系统 四、Go语言实现示例五、高级应用…...

算法中的背包问题详解:部分背包与0-1背包

1. 背包问题概述 背包问题是组合优化中的经典问题,其核心目标是:在给定容量的背包中装入一组物品,使得物品的总价值最大化。根据物品是否可分割或重复选择,背包问题分为多个变种,其中最常见的两种是: 部分…...

【单片机通信技术】STM32 HAL库 SPI主从机通过串口发送数据

一、说明 使用STM32F103C8T6最小系统板,让板载SPI1与SPI2通信,通过串口收发数据。本文章说明了在配置与编写时遇到的一些问题,以及详细说明如何使用cubeMAX进行代码编写。 二、CubeMAX配置 1.时钟配置选择外部高速时钟 2.系统模式与时钟配…...

laravel中 添加公共/通用 方法/函数

一,现在app 下面创建Common目录,然后在创建Common.php 文件 二,修改composer.json文件 添加这个到autoload 中 "files": ["app/Common/Common.php"]"autoload": {"psr-4": {"App\\": &quo…...

Jetpack Compose — 入门实践

一、项目中使用 Jetpack Compose 从此节开始,为方便起见,如无特殊说明,Compose 均指代 Jetpack Compose。 开发工具: Android Studio 1.1 创建支持 Compose 新应用 新版 Android Studio 默认创建新项目即为 Compose 项目。 注意:在 Language 下拉菜单中,Kotlin 是唯一可…...

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 or Set--lower_bound()的解法!!!

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 题目 并查集解析代码【并查集解】 Set 解法解析lower_bound代码 题目 并查集解析 首先先让所有的f(i)i,即每个人最开始的祖先都是自己,然后就每一次都让轮到那个数的父亲1&#xff08…...

应用案例 | 精准控制,高效运行—宏集智能控制系统助力SCARA机器人极致性能

概述 随着工业4.0的深入推进,制造业对自动化和智能化的需求日益增长。传统生产线面临空间不足、效率低下、灵活性差等问题,尤其在现有工厂改造项目中,如何在有限空间内实现高效自动化成为一大挑战。 此次项目的客户需要在现有工厂基础上进行…...

Greenplum6.19集群搭建

一,安装说明 1.1环境说明 1、首先确定部署的环境,确定下服务器的端口,一般默认是22的端口; 2、当前这份文档是服务器处于10022端口下部署的(现场生产环境要求,22端口在生产环境存在安全隐患)&…...

sqlserver中的锁模式 | SQL SERVER如何开启MVCC(使用row-versioning)【启用行版本控制减少锁争用】

文章目录 引言锁和隔离级别的关系锁模式之间兼容性I 隔离级别SQLServer默认的隔离级别为:“read commited” (已提交读)在SQLServer2005引入了基于行版本控制的隔离级别。SQL SERVER如何开启MVCC(使用row-versioning)sqlserver开启MVCC后的锁II sqlserver中的锁模式**1、共享…...

胜软科技冲刺北交所一年多转港股:由盈转亏,毛利率大幅下滑

《港湾商业观察》施子夫 近期,山东胜软科技股份有限公司(以下简称,胜软科技)递表港交所获受理,独家保荐机构为广发证券(香港)。 在赴港上市之前,胜软科技还曾谋求过A股上市&#x…...

Java零基础入门笔记:多线程

前言 本笔记是学习狂神的java教程,建议配合视频,学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili 第1-2章:Java零基础入门笔记:(1-2)入门(简介、基础知识)-CSDN博客 第3章…...

Django 中,Form 和 ModelForm的用法和区别

在 Django 中,Form 和 ModelForm 是用于处理表单数据的两种主要方式。它们的主要区别在于是否与模型(Model)直接关联。以下是它们的用法、区别以及高级用法的详细说明: 一、Form 的使用 1. 基本用法 Form 是一个独立的表单类,不与任何模型直接关联。适用于需要手动定义字…...

tcp udp区别

TCP(传输控制协议) 和 UDP(用户数据报协议) 是两种常用的传输层协议,它们在数据传输方式、可靠性和应用场景等方面有显著区别。以下是它们的主要区别: 1. 连接方式 TCP:面向连接的协议。通信前需…...

数据类设计_图片类设计之1_矩阵类设计(前端架构基础)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 图形在底层是怎么表示的,用C来表示 认识图片 图片是个风景,动物,还是其他内容,人是可以看出来的.那么计算机是怎么看懂的呢?在有自主意识的人工智能被设计出来…...

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

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

GC安全点导致停顿时间过长的案例

GC安全点导致停顿时间过长的案例 前言安全点的概念案例分析解决方法如有需要收藏的看官,顺便也用发财的小手点点赞哈,如有错漏,也欢迎各位在评论区评论! 前言 前段时间在使用G1垃圾收集时,因服务读写压力过大&#xf…...

linux下 jq 截取json文件信息

背景:通过‘登录名‘ 获取该对象的其他个人信息如名字。 环境准备:麒麟操作系统V10 jq安装包 jq安装包获取方式:yum install jq 或 使用附件中的rpm 或 git自行下载 https://github.com/stedolan/jq/releases/download/ 实现过程介绍&am…...

git lfs使用方法指南【在github保存100M以上大文件】

为了在 GitHub 仓库中存储超过 100MB 的大文件并避免推送失败,使用 Git LFS(Large File Storage) 是最佳解决方案。以下是详细步骤: 一、安装 Git LFS 下载并安装 Git LFS: 访问 Git LFS 官网 下载对应系统的安装包。或…...

躲藏博弈:概率论与博弈论视角下的最优策略选择

躲藏博弈:概率论与博弈论视角下的最优策略选择 1. 问题引入 想象这样一个场景:你在厕所里藏了一部手机,一周过去了,它仍未被发现。现在你面临一个决策: 选项A:继续将手机留在原处选项B:将手机…...

类加载器加载过程

今天我们就来深入了解一下Java中的类加载器以及它的加载过程。 一、什么是类加载器? 在Java中,类加载器(Class Loader)是一个非常重要的概念。它负责将类的字节码文件(.class文件)加载到Java虚拟机&#x…...

Python中dump、dumps和load、loads的异同

Python中dump、dumps和load、loads的异同 Python中dump、dumps和load、loads的异同 1. json.dump()和json.dumps() 1.1 json.dump()1.1 json.dumps() 2. json.load()和json.loads() 2.1 json.load()2.2. json.loads() 3. 总结对比4. 区分5. 完整代码 1. json.dump()和json.dum…...

Spring Boot整合ArangoDB教程

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、环境准备 JDK 17Maven 3.8Spring Boot 3.2ArangoDB 3.11(本地安装或Docker运行) Docker启动ArangoDB docker run -d --name ar…...

vue3框架的响应式依赖追踪机制

当存在一个响应式变量于视图中发生改变时会更新当前组件的所以视图显示,但是没有视图中不写这个响应式变量就就算修改该变量也不会修改视图,这是为什么?我们能否可以理解宽泛的理解为vue组件的更新就是视图的更新,单当视图中不存在…...

软件工程:软件需求之需求分析方法

目录 前言 需求分析方法 工具和方法 具体分析方法 对运行环境的影响 ​编辑 前言 本文重点介绍开展软件需求分析的方法。 需求分析方法 工具和方法 软件需求可以维护在ALM系统中,譬如:doors,codeBeamer等,JIRA适合互联网行…...

【网络编程】WSAAsyncSelect 模型

十、基于I/O模型的网络开发 接着上次的博客继续分享:select模型 10.8 异步选择模型WSAAsyncSelect 10.8.1 基本概念 WSAAsyncSelect模型是Windows socket的一个异步I/O 模型,利用这个模型,应用程序 可在一个套接字上接收以Windows 消息为基…...

视觉-语言模型-出发点CLIP--(精读论文)

阅读建议:配合这个源码分析阅读效果更加 研究背景和目的 介绍当前计算机视觉系统依赖固定类别标签训练的局限性,以及自然语言监督作为一种有潜力替代方式的研究现状。强调论文旨在探索从自然语言监督中学习可迁移视觉模型,实现零样本学习&a…...

docker本地部署RagFlow

1.安装 克隆仓库 git clone https://github.com/infiniflow/ragflow.git构建预建的Docker映像并启动服务器 cd ragflow/docker chmod x ./entrypoint.sh docker compose -f docker-compose.yml -p ragflow up -d修改ragflow/docker/.env文件 #RAGFLOW_IMAGEinfiniflow/ragfl…...