使用Python操作SQLite数据库:创建表及增删改查

使用Python操作SQLite数据库:创建表及增删改查

SQLite 是一个轻量级的嵌入式数据库,广泛应用于嵌入式系统、移动应用和小型数据库系统。它的无服务器、零配置和高效能特性使其成为开发和测试过程中非常实用的数据库选择。Python 提供了内置的 sqlite3 模块,使得操作 SQLite 数据库变得简单而方便。本文将详细介绍如何使用 Python 操作 SQLite 数据库,包括创建表,以及增删改查操作。

准备工作

在开始之前,请确保你已经安装了 Python。如果还没有安装,可以从 Python 官方网站 下载并安装。在安装完成后,可以通过命令行输入 python --version 检查 Python 是否已成功安装。

什么是SQLite?

SQLite 是一个 C 语言库,它实现了一个小型、快速、全功能、自包含的 SQL 数据库引擎。与其他数据库系统不同,SQLite 是无服务器的,这意味着它不需要一个单独的服务器进程来运行,它直接读写常规的磁盘文件。SQLite 数据库完全存储在一个单独的文件中,具备跨平台兼容性,且体积小,使用简单。

为什么选择SQLite?

  1. 嵌入式数据库:SQLite 是一个嵌入式数据库,不需要单独的服务器进程,因此非常适合嵌入式系统和移动应用。
  2. 无服务器:不需要配置和管理服务器,这大大简化了部署和维护的工作。
  3. 跨平台:SQLite 数据库文件可以在不同的操作系统之间自由移动。
  4. 高性能:在读操作多于写操作的场景下,SQLite 的性能非常高。
  5. 零配置:不需要复杂的配置文件和设置,开箱即用。

连接到 SQLite 数据库

首先,我们需要连接到 SQLite 数据库。我们可以使用 sqlite3 模块提供的 connect 函数来创建一个数据库连接。如果数据库文件不存在,sqlite3 会自动创建一个新的数据库文件。

import sqlite3# 连接到 SQLite 数据库(如果数据库文件不存在,会自动创建一个新的数据库文件)
conn = sqlite3.connect('example.db')# 创建一个游标对象
cursor = conn.cursor()

在上面的代码中,我们首先导入了 sqlite3 模块,然后使用 connect 函数连接到一个名为 example.db 的数据库。如果该数据库文件不存在,sqlite3 会自动创建它。接下来,我们创建了一个游标对象,游标对象用于执行 SQL 语句并获取结果。

创建表

在 SQLite 中,表是数据库的基本结构,用于存储数据。我们以创建一个名为 users 的表为例,该表包含 idnameage 三个字段。

# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER NOT NULL)
''')# 提交更改
conn.commit()

解释创建表的SQL语句

在上面的代码中,我们使用了一个 CREATE TABLE 语句来创建 users 表。下面是该语句的详细解释:

  • CREATE TABLE IF NOT EXISTS users:这部分语句的意思是创建一个名为 users 的表,如果该表不存在的话。如果该表已经存在,则不会执行任何操作。
  • id INTEGER PRIMARY KEY:这部分定义了一个名为 id 的列,数据类型为 INTEGER,并且它是主键(PRIMARY KEY)。主键是表中的唯一标识符,每个表只能有一个主键。
  • name TEXT NOT NULL:这部分定义了一个名为 name 的列,数据类型为 TEXT,并且它不能为 NULLNOT NULL)。
  • age INTEGER NOT NULL:这部分定义了一个名为 age 的列,数据类型为 INTEGER,并且它不能为 NULLNOT NULL)。

执行完 CREATE TABLE 语句后,我们使用 conn.commit() 提交更改。commit 方法用于提交当前事务的所有更改,如果没有调用 commit,这些更改将不会保存到数据库中。

插入数据

插入数据是数据库操作中非常常见的操作之一。我们可以使用 INSERT INTO 语句向表中插入数据。

# 插入数据
cursor.execute('''INSERT INTO users (name, age)VALUES ('Alice', 25)
''')cursor.execute('''INSERT INTO users (name, age)VALUES ('Bob', 30)
''')# 提交更改
conn.commit()

解释插入数据的SQL语句

在上面的代码中,我们使用了两个 INSERT INTO 语句向 users 表中插入数据。下面是该语句的详细解释:

  • INSERT INTO users (name, age):这部分语句的意思是向 users 表中插入数据,插入的数据列为 nameage
  • VALUES ('Alice', 25):这部分语句的意思是插入的数据值为 Alice25,对应 nameage 列。
  • 同样地,第二个 INSERT INTO 语句插入的数据值为 Bob30

执行完 INSERT INTO 语句后,我们使用 conn.commit() 提交更改。

查询数据

查询数据是数据库操作中最常见的操作之一。我们可以使用 SELECT 语句来查询 users 表中的所有数据。

# 查询数据
cursor.execute('SELECT * FROM users')# 获取查询结果
rows = cursor.fetchall()for row in rows:print(row)

解释查询数据的SQL语句

在上面的代码中,我们使用了一个 SELECT 语句来查询 users 表中的所有数据。下面是该语句的详细解释:

  • SELECT * FROM users:这部分语句的意思是查询 users 表中的所有列(* 表示所有列)。

执行完 SELECT 语句后,我们使用 cursor.fetchall() 方法获取查询结果。fetchall 方法返回一个包含所有结果行的列表。接下来,我们使用一个 for 循环遍历结果行,并打印每一行的数据。

更新数据

更新数据是数据库操作中另一个常见的操作。我们可以使用 UPDATE 语句来更新表中的数据。例如,我们将用户 Alice 的年龄更新为 26。

# 更新数据
cursor.execute('''UPDATE usersSET age = 26WHERE name = 'Alice'
''')# 提交更改
conn.commit()

解释更新数据的SQL语句

在上面的代码中,我们使用了一个 UPDATE 语句来更新 users 表中的数据。下面是该语句的详细解释:

  • UPDATE users:这部分语句的意思是更新 users 表中的数据。
  • SET age = 26:这部分语句的意思是将 age 列的值更新为 26
  • WHERE name = 'Alice':这部分语句的意思是仅更新 name 列的值为 Alice 的行。

执行完 UPDATE 语句后,我们使用 conn.commit() 提交更改。

删除数据

删除数据是数据库操作中另一个常见的操作。我们可以使用 DELETE 语句从表中删除数据。例如,我们删除名为 Bob 的用户。

# 删除数据
cursor.execute('''DELETE FROM usersWHERE name = 'Bob'
''')# 提交更改
conn.commit()

解释删除数据的SQL语句

在上面的代码中,我们使用了一个 DELETE 语句从 users 表中删除数据。下面是该语句的详细解释:

  • DELETE FROM users:这部分语句的意思是从 users 表中删除数据。
  • WHERE name = 'Bob':这部分语句的意思是仅删除 name 列的值为 Bob 的行。

执行完 DELETE 语句后,我们使用 conn.commit() 提交更改。

关闭数据库连接

操作完成后,记得关闭游标和数据库连接。

# 关闭游标
cursor.close()# 关闭数据库连接
conn.close()

在上面的代码中,我们首先关闭了游标对象,然后关闭了数据库连接。关闭游标和连接是一个良好的编程习惯,它可以释放数据库资源,并确保数据的完整性。

完整示例代码

以下是上述所有操作的完整示例代码:

import sqlite3# 连接到 SQLite 数据库
conn = sqlite3.connect('example.db')
cursor = conn.cursor()# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER NOT NULL)
''')
conn.commit()# 插入数据
cursor.execute('''INSERT INTO users (name, age)VALUES ('Alice', 25)
''')
cursor.execute('''INSERT INTO users (name, age)VALUES ('Bob', 30)
''')
conn.commit()# 查询数据
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:print(row)# 更新数据
cursor.execute('''UPDATE usersSET age = 26WHERE name = 'Alice'
''')
conn.commit()# 删除数据
cursor.execute('''DELETE FROM usersWHERE name = 'Bob'
''')
conn.commit()# 关闭游标和数据库连接
cursor.close()
conn.close()

深入理解

为了更好地理解上述代码,让我们详细解释一些关键概念和操作。

数据库连接

在任何数据库操作中,首先需要建立数据库连接。数据库连接是数据库客户端与数据库服务器之间的通信通道。对于 SQLite,这个连接是一个到数据库文件的连接。

conn = sqlite3.connect('example.db')

这里的 example.db 是数据库文件的名称。如果该文件不存在,sqlite3 会自动创建它。

游标对象

游标对象是数据库操作的基础。它用于执行 SQL 语句,并在执行后获取结果。

cursor = conn.cursor()

创建表

表是数据库的基本结构,用于存储数据。创建表时,需要定义表的名称和列的结构。

cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER NOT NULL)
''')

插入数据

插入数据是向表中添加新记录的操作。

cursor.execute('''INSERT INTO users (name, age)VALUES ('Alice', 25)
''')

查询数据

查询数据是从表中获取数据的操作。

cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:print(row)

更新数据

更新数据是修改表中已有记录的操作。

cursor.execute('''UPDATE usersSET age = 26WHERE name = 'Alice'
''')

删除数据

删除数据是从表中删除记录的操作。

cursor.execute('''DELETE FROM usersWHERE name = 'Bob'
''')

提交更改

所有对数据库的更改都需要提交,以便保存这些更改。

conn.commit()

关闭连接

在完成所有操作后,关闭游标和数据库连接是一个良好的习惯。

cursor.close()
conn.close()

高级操作

参数化查询

为了防止 SQL 注入攻击,建议使用参数化查询。参数化查询通过将 SQL 语句和参数分开来避免 SQL 注入。

name = 'Charlie'
age = 35
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', (name, age))
conn.commit()

批量插入

如果需要插入大量数据,可以使用批量插入操作。批量插入可以显著提高插入操作的效率。

users = [('Dave', 40),('Eve', 45),('Frank', 50)
]
cursor.executemany('INSERT INTO users (name, age) VALUES (?, ?)', users)
conn.commit()

事务处理

事务处理是指一组数据库操作要么全部成功,要么全部失败。在 SQLite 中,可以通过 BEGIN TRANSACTIONCOMMITROLLBACK 来实现事务处理。

try:cursor.execute('BEGIN TRANSACTION')cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Grace', 55))cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Hank', 60))conn.commit()
except sqlite3.Error as e:conn.rollback()print(f'Error occurred: {e}')

索引

索引是数据库中的一个重要概念。索引可以加速查询操作,但会减慢插入、更新和删除操作。在创建索引时,需要根据实际情况权衡利弊。

cursor.execute('CREATE INDEX idx_name ON users (name)')
conn.commit()

视图

视图是一个虚拟表,它是基于 SQL 查询结果的。视图可以简化复杂查询,并提供额外的安全层。

cursor.execute('CREATE VIEW user_view AS SELECT name, age FROM users WHERE age > 30')
cursor.execute('SELECT * FROM user_view')
rows = cursor.fetchall()
for row in rows:print(row)

触发器

触发器是一种特殊的存储过程,它在特定事件(如插入、更新或删除)发生时自动执行。

cursor.execute('''CREATE TRIGGER update_age BEFORE UPDATE ON usersFOR EACH ROWBEGINSELECT CASEWHEN NEW.age < 0 THEN RAISE (ABORT, 'Age cannot be negative')END;END;
''')
conn.commit()

在上述代码中,我们创建了一个触发器 update_age,该触发器在更新 users 表时自动执行。如果新的年龄值小于 0,则触发器会中止操作并抛出错误。

数据库备份与恢复

SQLite 具有简单且强大的备份和恢复功能。可以使用 sqlite3 模块提供的 backup 方法将数据库备份到另一个数据库文件中。

import sqlite3# 连接到源数据库
src_conn = sqlite3.connect('example.db')# 连接到目标数据库(备份数据库)
backup_conn = sqlite3.connect('backup.db')# 备份数据库
with backup_conn:src_conn.backup(backup_conn)# 关闭连接
src_conn.close()
backup_conn.close()

在上述代码中,我们首先连接到源数据库 example.db 和目标数据库 backup.db。然后,我们使用 backup 方法将源数据库备份到目标数据库。最后,关闭所有连接。

性能优化

在实际应用中,性能是一个非常重要的考虑因素。以下是一些常用的 SQLite 性能优化技巧:

  1. 使用索引:索引可以加速查询操作,但会减慢插入、更新和删除操作。需要根据实际情况权衡利弊。
  2. 使用事务:将多个操作放在一个事务中,可以显著提高性能。
  3. 减少磁盘 I/O:使用内存数据库可以减少磁盘 I/O,提高性能。
  4. 优化查询:避免使用复杂的查询,尽量使用简单的查询。
  5. 适当使用批量操作:批量插入、更新和删除操作可以提高性能。

数据库安全

在处理数据库时,安全是一个非常重要的考虑因素。以下是一些常用的 SQLite 数据库安全技巧:

  1. 参数化查询:使用参数化查询可以防止 SQL 注入攻击。
  2. 限制数据库访问:仅允许受信任的用户访问数据库。
  3. 加密数据库:使用 SQLite 的加密功能可以保护数据库文件。
  4. 定期备份:定期备份数据库可以防止数据丢失。

总结

通过本文的介绍,你已经学会了如何使用 Python 操作 SQLite 数据库,包括创建表以及进行增删改查操作。SQLite 是一个非常适合开发和测试的嵌入式数据库,结合 Python 的强大功能,你可以轻松地管理和操作数据库中的数据。希望本文对你有所帮助!

参考资料

  • SQLite 官方网站
  • Python 官方文档
  • SQLite 教程

SQLite 是一个强大且易用的数据库,它的无服务器、零配置和高效能特性使其成为开发和测试过程中非常实用的数据库选择。通过本文的学习,你已经掌握了使用 Python 操作 SQLite 数据库的基础知识和技能。希望你能将这些知识应用到实际项目中,提升开发效率和代码质量。

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

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

相关文章

Elixir学习笔记——try, catch, and rescue

Elixir 有三种错误机制&#xff1a;errors, throws, and exits。在本章中&#xff0c;我们将探索每种机制&#xff0c;并说明何时应使用它们。 Errors 当代码中发生异常时&#xff0c;就会使用错误&#xff08;或异常&#xff09;。可以通过尝试将数字添加到原子来检索示例错…

生活好物:日常更精彩

我们的日用杂货店&#xff0c;是生活美学的聚集地。这里汇聚了各式各样的生活用品&#xff0c;每一件都蕴含着对生活的热爱与追求。 走进我们的日用杂货店&#xff0c;仿佛打开了一个充满生活气息的宝藏盒。从厨房的锅碗瓢盆&#xff0c;到浴室的洗漱用品&#xff0c;再到客厅的…

6.17 作业

使用qt实现优化自己的登录界面 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。 第一个源文件 …

9.无代码爬虫软件做网页数据抓取流程——弹出窗口的移除

首先&#xff0c;多数情况下免费版本的功能&#xff0c;已经可以满足绝大多数采集需求&#xff0c;想了解八爪鱼采集器版本区别的详情&#xff0c;请访问这篇帖子&#xff1a; https://blog.csdn.net/cctv1123/article/details/139581468 八爪鱼采集器免费版和个人版、团队版下…

架构师工作报告

一、需求分析与技术选型 工作内容概述&#xff1a; 深入理解项目需求&#xff0c;参与需求评审&#xff0c;确保需求的完整性和可行性。 根据需求制定技术方案&#xff0c;选择合适的技术栈、架构模式和工具。 工作量要求&#xff1a; 参与需求评审会议&#xff0c;通常每周1-2…

流式接口解析及数据展示

前言 此处为一个流式接口的对话&#xff0c;前端需要以流式的方式进行输出。前端框架使用Vue3 HTML 说明&#xff1a;此处将展示对话内容的多于元素已删除&#xff0c;只保留了消息体的HTML。 <div v-for"item in data" class"chat-item"><di…

反射复习(java)

文章目录 反射机制的作用反射机制的原理加载机制详细解释 获取 Class 对象反射获取构造方法&#xff1a;获取 Class 对象里面 Constructor 对象反射获取成员变量&#xff1a;获取Class 对象里面的 Field 对象反射获取成员方法&#xff1a;获取 Class 对象里的 Method 对象其他常…

15.编写自动化测试(下)

标题 三、控制测试流程3.1 添加测试参数3.2 并行或连续运行测试3.3 显示函数输出3.4 指定/过滤测试用例名称3.5 忽略某些测试用例3.6 只运行被忽略的测试 四、测试的组织结构4.1 概念引入4.2 测试私有函数4.2 单元测试4.3 集成测试4.4 集成测试中的子模块4.5 二进制crate的集成…

Python脚本中使用 if 语句导致的错误代码

在 Python 脚本中使用 if 语句是一种常见的控制流程结构&#xff0c;用于根据条件决定程序的执行路径。当使用 Python 中的 if 语句时&#xff0c;可能会导致一些常见的错误。下面就是我经常遇到的错误代码示例及其可能的原因和解决方法&#xff0c;希望对大家有些帮助&#xf…

深入解析Spring Cloud:微服务架构的利器(下)

在上一篇文章中&#xff0c;我们介绍了Spring Cloud的基本概念、核心组件以及如何在Java项目中使用Spring Cloud进行服务注册与发现。本文将继续探讨Spring Cloud的负载均衡、配置管理、服务熔断和API网关等高级特性。 4. 负载均衡 4.1 使用Ribbon Spring Cloud Ribbon是一个…

死锁预防之银行家算法

死锁预防之银行家算法 第一章 概述 Dijkstra提出了一种能够避免死锁的调度算法,称为银行家算法。 它的模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,每个客户都有一个贷款额度,银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留一定单位…

韩国职场新趋势:员工拒绝晋升,追求工作与生活的平衡

在当前职场环境中&#xff0c;晋升通常被视为职业生涯发展的重要里程碑。然而&#xff0c;据韩国《今日财经》报道&#xff0c;现代重工工会在今年的劳资谈判中提出了一个令人关注的要求——“拒绝晋升权”。这一要求反映了韩国职场的新趋势&#xff0c;即越来越多的员工对高薪…

长期保存红酒的挑战与应对策略

云仓酒庄雷盛红酒&#xff0c;以其卓着的品质和口感&#xff0c;赢得了无数葡萄酒爱好者的喜爱。然而&#xff0c;对于那些希望长期保存这些珍贵佳酿的人来说&#xff0c;如何确保红酒的品质和风味不受时间的影响&#xff0c;却是一项充满挑战的任务。 长期保存红酒的大挑战来自…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 火星字符串(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

电影《加菲猫家族》观后感

上周看了电影《加菲猫家族》&#xff0c;本片其中有很多明亮的画面&#xff0c;相关艳丽的色彩&#xff0c;充满温馨的场景&#xff0c;很符合加菲猫的一贯画风&#xff0c;即使反派出场时&#xff0c;带有阴暗的感觉&#xff0c;看起也不是特别吓人&#xff0c;比较欢乐气氛&a…

定时器介绍之8253芯片

目录 定时器简介 8253功能介绍 组成 工作原理 相关引脚 启动方法 计数方式 实现 读取计数值 定时器简介 8253功能介绍 内部结构 相关引脚 计数器组成 工作原理 启动方法 计数方式 初始化&#xff1a;写入控制字——>写入计数初值 实现 计数长度选择&#xff1a…

jingxiang制作

文章目录 jingxiang制作为什么需要jingxiang制作如何进行jingxiang制作 快照方式制作jingxiang制作命令do cker commit 快照制作jingxiang创建临时工作目录编写一个实例代码启动一个容器替换国内软件源安装编译软件源代码拷贝到容器中编译运行提交为一个jingxiang测试是否可以正…

金额工具类:数字转字符串(每三位以逗号分隔)

问题背景 要求实现一个金额转换的工具类,输入一个数字金额,返回新的字符串,每三位以逗号分隔。 例如: 输入:1000 输出:1,000输入:5689104 输出:5,689,104输入:12345678 输出:12,345,678代码实现 /*** @description 数组格式化, 每三位以逗号分隔* @date 2024-6-1…

虚拟机Ping不通主机

1.问题描述 虚拟机IP&#xff1a; 192.168.3.133 主机ip&#xff1a;192.168.3.137 虚拟机Ping不通主机 主机可以ping通虚拟机 2.解决方案 设置桥接模式 控制面板找到网络和Internet设置 3.问题解决

数据库基础——数字、字符串、日期时间、二进制

数据库的分类 定义&#xff1a;主要是数据表的创建、删除、修改 操纵&#xff1a;对数据进行增删添改 控制&#xff1a;对数据库的权限进行管理 数据库不区分大小写&#xff0c;一条语句的结尾以英文分号结尾 命名不能是关键字&#xff0c;只能使用英文、数字和下划线 注释可以…