如何使用 Python 的 sqlite3 模块操作 SQLite 数据库?

如何使用 Python 的 sqlite3 模块操作 SQLite 数据库?

SQLite 是一种轻量级的数据库,它不需要服务器,数据库被存储在一个文件中,非常适合嵌入式系统或桌面应用程序。Python 标准库中包含了一个名为 sqlite3 的模块,可以直接用于与 SQLite 数据库进行交互。本文将详细介绍如何使用 Python 的 sqlite3 模块来操作 SQLite 数据库,适合初学者和有数据库基础的人理解。

在这里插入图片描述

一、SQLite 简介

1.1 什么是 SQLite?

SQLite 是一种自包含、无服务器、零配置的关系型数据库管理系统(RDBMS)。它的特点是数据存储在一个单一的文件中,不需要像 MySQL、PostgreSQL 等那样配置复杂的数据库服务器,非常适合轻量级应用或快速开发时使用。

主要特点:

  • 轻量级:SQLite 是一个小型的数据库引擎,易于嵌入应用中。
  • 无服务器:它不需要像其他数据库管理系统那样的服务器进程,数据库文件就存储在本地。
  • 易用性:SQLite 操作简单,且无需特别的配置,尤其适合开发和测试阶段。
  • 跨平台:SQLite 可以在各种操作系统上运行,包括 Windows、Linux、macOS 等。

1.2 SQLite 的使用场景

  • 嵌入式应用:SQLite 常用于手机应用或嵌入式设备中,因为它不需要服务器支持,使用灵活。
  • 桌面应用:很多桌面应用也使用 SQLite 来存储配置信息或用户数据。
  • 开发和测试:由于安装配置简单,开发人员常常在开发和测试阶段使用 SQLite 来验证数据库功能。
  • 小型网站:对于一些不需要大量并发和数据操作的应用,SQLite 也是一种很好的选择。

二、Python 的 sqlite3 模块

Python 内置的 sqlite3 模块可以让我们非常方便地操作 SQLite 数据库。接下来我们会介绍如何通过这个模块创建数据库、创建表、插入数据、查询数据等基本操作。

2.1 安装与导入 sqlite3 模块

sqlite3 是 Python 标准库的一部分,所以不需要安装第三方库,直接导入即可。

import sqlite3

2.2 创建或连接到 SQLite 数据库

在 SQLite 中,数据库是存储在文件中的。如果指定的数据库文件不存在,sqlite3 会自动创建一个新的数据库文件。

import sqlite3# 连接到数据库,如果数据库不存在,则会创建一个新文件
conn = sqlite3.connect('example.db')# 创建游标对象,操作数据库的SQL语句要通过游标来执行
cursor = conn.cursor()print("数据库连接成功!")

上述代码将连接或创建一个名为 example.db 的数据库文件。如果文件存在,connect 方法将连接到现有的数据库;如果文件不存在,则创建新的数据库文件。

2.3 创建表

创建表的语句与标准 SQL 语法相同。在 SQLite 中,你可以通过 CREATE TABLE 语句来创建新表。

# 创建一个名为 users 的表
cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER,email TEXT)
''')print("表创建成功!")

这里,我们创建了一个 users 表,包含四个字段:

  • id:主键,自动递增(AUTOINCREMENT)。
  • name:用户的名字,非空(NOT NULL)。
  • age:用户的年龄,整数类型。
  • email:用户的电子邮件地址。

2.4 插入数据

插入数据使用 INSERT INTO 语句。可以通过参数化查询来避免 SQL 注入。

# 插入单条记录
cursor.execute('''INSERT INTO users (name, age, email)VALUES (?, ?, ?)
''', ("Alice", 25, "alice@example.com"))# 插入多条记录
users = [("Bob", 30, "bob@example.com"),("Charlie", 22, "charlie@example.com"),("Diana", 28, "diana@example.com")
]cursor.executemany('''INSERT INTO users (name, age, email)VALUES (?, ?, ?)
''', users)# 提交事务
conn.commit()print("数据插入成功!")

在这里,我们通过 ? 占位符来代替具体的值,防止 SQL 注入攻击。使用 executemany 方法可以批量插入多条数据。

2.5 查询数据

查询数据使用 SELECT 语句,查询结果可以通过游标的 fetchone()fetchall() 方法获取。

# 查询所有用户
cursor.execute("SELECT * FROM users")# 获取所有结果
rows = cursor.fetchall()for row in rows:print(row)

查询结果是一个包含每一行数据的列表,每一行数据是一个元组。

2.6 更新数据

更新数据使用 UPDATE 语句。

# 更新用户的年龄
cursor.execute('''UPDATE users SET age = ? WHERE name = ?
''', (26, "Alice"))# 提交事务
conn.commit()print("数据更新成功!")

这里将名字为 “Alice” 的用户年龄更新为 26。

2.7 删除数据

删除数据使用 DELETE FROM 语句。

# 删除名字为 'Bob' 的用户
cursor.execute('''DELETE FROM users WHERE name = ?
''', ("Bob",))# 提交事务
conn.commit()print("数据删除成功!")

这条语句将删除名字为 “Bob” 的用户记录。

2.8 关闭连接

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

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

三、处理事务

SQLite 默认运行在自动提交模式下,这意味着每一条执行的 SQL 语句(如 INSERTUPDATEDELETE)都会立即生效。如果你希望将多个操作作为一个事务来执行,可以使用 BEGIN TRANSACTIONCOMMIT 语句。

try:# 开始事务conn.execute("BEGIN TRANSACTION")# 执行一系列数据库操作cursor.execute('''INSERT INTO users (name, age, email)VALUES (?, ?, ?)''', ("Eve", 29, "eve@example.com"))cursor.execute('''UPDATE users SET age = ? WHERE name = ?''', (30, "Charlie"))# 提交事务conn.commit()print("事务提交成功!")except sqlite3.Error as e:# 出现错误时回滚事务conn.rollback()print(f"发生错误,事务回滚:{e}")

在这个例子中,我们将多条操作包裹在一个事务中,如果在某个操作中发生错误,我们可以使用 rollback 回滚事务,确保数据库不会被修改。

四、参数化查询和 SQL 注入

SQL 注入是常见的数据库攻击手段之一,通过向 SQL 查询中插入恶意代码,攻击者可以获取或修改数据库中的敏感信息。为了避免这种攻击,应该始终使用参数化查询而不是直接拼接字符串。

错误的做法:

# 拼接字符串容易导致 SQL 注入
name = "Alice"
age = 25
cursor.execute(f"INSERT INTO users (name, age) VALUES ('{name}', {age})")

正确的做法:

# 使用参数化查询
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (name, age))

通过使用 ? 占位符和参数化查询,可以避免 SQL 注入的风险。

五、SQLite 的数据类型

SQLite 使用动态类型系统,它的类型系统不像 MySQL、PostgreSQL 那样严格。在 SQLite 中,数据类型大致分为五类:

  • NULL:值是空值。
  • INTEGER:整数类型,正数或负数。
  • REAL:浮点数类型。
  • TEXT:字符串类型。
  • BLOB:二进制大对象,存储二进制数据。

虽然你可以在创建表时指定字段的类型,但是 SQLite 在插入数据时允许你插入与字段类型不匹配的数据。这意味着即使你为某个字段声明了 INTEGER 类型,你仍然可以插入一个文本字符串。

六、SQLite 的限制与适用场景

SQLite 虽然轻量且易于使用,但它并不适用于所有场景。它的性能和并发能力相对有限,因此更适合单用户桌面应用或嵌入式设备。

6.1 适合的场景

  • 单用户桌面应用
  • 嵌入式设备
  • 开发

、测试数据库

  • 小型网站或应用

6.2 不适合的场景

  • 高并发、多用户的 Web 应用
  • 需要复杂事务处理的大型应用
  • 数据量非常大的项目

总结

通过 Python 的 sqlite3 模块,你可以轻松地与 SQLite 数据库进行交互,创建数据库、表,执行插入、查询、更新、删除等操作。SQLite 的轻量级特性使其非常适合嵌入式应用、桌面应用和快速原型开发。

尽管 SQLite 并不适合处理高并发或大规模的数据存储,但对于小型应用或项目,它是一个非常实用的数据库选择。Python 内置的 sqlite3 模块大大简化了 SQLite 数据库操作,非常适合初学者使用。

掌握了这些基础操作后,你可以根据自己的项目需求,灵活地使用 SQLite 或其他数据库进行开发。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vue-入门速通

setup是最早的生命周期,在vue2里边的data域可以使用this调用setup里面的数据,但是在setup里边不能使用thisvue项目的可执行文件是index,另外运行前端需要npm run vue的三个模块内需要三个不同的结构,里边放置js代码,注…

【Go开发】Go语言基本语法入门:数据类型与方法定义

文章目录 环境准备一、引言二、Var关键字三、数据类型1. 整型符号表示值的范围 2. 浮点型精度范围性能 3. 布尔型4. 字符串 三、变量声明1. 指定变量类型2. 自动推导类型3. 批量声明 四、方法定义五、总结 环境准备 开发环境:MacOS Go版本:go version g…

计算机毕业设计之:基于微信小程序的校园流浪猫收养系统(源码+文档+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

「漏洞复现」灵当CRM marketing/index.php SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

如何使用ssm实现社区流浪动物救助领养系统的设计与开发+vue

TOC ssm666社区流浪动物救助领养系统的设计与开发vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安…

Python编码系列—Python策略模式:灵活应对变化的算法策略

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

微软AI核电计划

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Django学习实战篇六(适合略有基础的新手小白学习)(从0开发项目)

前言: 上一章中,我们完成了页面样式的配置,让之前简陋的页面变得漂亮了些。 整理一下目前已经完成的系统,从界面上看,已经完成了以下页面: 首页分类列表页标签列表页口博文详情页 这离我们的需求还有些距离&#xff0…

Python | Leetcode Python题解之第423题从英文中重建数字

题目: 题解: class Solution:def originalDigits(self, s: str) -> str:c Counter(s)cnt [0] * 10cnt[0] c["z"]cnt[2] c["w"]cnt[4] c["u"]cnt[6] c["x"]cnt[8] c["g"]cnt[3] c["h…

【完整梳理验证】企业微信第三方应用接入全流程java版

企业微信第三方应用接入全流程java版 1. 概念与流程1.1 概念1、企业内部应用2、`第三方应用`3、代开发自建应用1.2 流程1.2.1 全局流程1.2.2 应用配置1.2.3 数据流程2. 核心文档2.1 理解第三方应用开发流程和概念2.1.1 应用开发阶段2.1.2 应用推广阶段2.1.3 基本流程1)前期应用…

C++ | Leetcode C++题解之第421题数组中两个数的最大异或值

题目: 题解: struct Trie {// 左子树指向表示 0 的子节点Trie* left nullptr;// 右子树指向表示 1 的子节点Trie* right nullptr;Trie() {} };class Solution { private:// 字典树的根节点Trie* root new Trie();// 最高位的二进制位编号为 30static…

leetcode第十题:正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。 示例 1: 输入:s…

TMS320F28335的定时器中断实验

TTMS320F28335 的 CPU 定时器有 3 个且均为 32 位,分别是 Timer0、Timer1、Timer2, 其中 Timer2 是为操作系统 DSP/BIOS 保留的,当未移植操作系统时,可用来做普 通的定时器。这三个定时器的中断信号分别为 TINT0,TINT1,TINT2,分别对应中断向量于 INT1,INT13,INT14。 1 …

使用 NCache 将 Java 微服务扩展到极致性能

微服务已成为软件开发领域的一种变革性架构方法,提供了从整体结构到更加模块化和可扩展的系统的范式转变。微服务的核心是将复杂的应用程序分解为更小的、可独立部署的服务,这些服务可以无缝通信,从而提高敏捷性、灵活性和易维护性。这种分散…

动态规划day38|322. 零钱兑换(背包满了吗?最小值怎么表示?)、279. 完全平方数、139. 单词拆分、多重背包要点、背包问题大总结

动态规划day38|322. 零钱兑换(背包满了吗?最小值怎么表示?)、279. 完全平方数、139. 单词拆分、多重背包要点、背包问题大总结 322. 零钱兑换279. 完全平方数139. 单词拆分多重背包要点背包问题大总结 322. 零钱兑换 给你一个整数…

后端-项目创建与sql

1.创建文件 1.在webcontent下创建.html文件 2. 在java resources下创建包,右键包创建servlet服务生.(要是创建普通的类,里面的注解里的东西不能重复) 注意:class的名字要和文件名一样,注解里的servlet是独一无二的。 …

最新 idea 2024 入门使用详细教程

IntelliJ IDEA:这是一款由JetBrains公司开发的Java集成开发环境(Integrated Development Environment),被广泛认为是目前Java开发者最好的集成开发工具之一。它支持Java、Groovy、Kotlin等多种编程语言,并且提供了丰富…

HCIA--实验十七:EASY IP的NAT实现

一、实验内容 1.需求/要求: 通过一台PC,一台交换机,两台路由器来成功实现内网访问外网。理解NAT的转换机制。 二、实验过程 1.拓扑图: 2.步骤: 1.PC1配置ip地址及网关: 2.AR1接口配置ip地址&#xff1…

Java免税商品优选商城:Spring Boot实战

第二章 系统开发关键技术 2.1 JAVA技术 Java主要采用CORBA技术和安全模型,可以在互联网应用的数据保护。它还提供了对EJB(Enterrise JavaBeans)的全面支持,java servlet AI,JS(java server ages&#xff09…

Tomcat中BIO和NIO的区别(Tomcat)

BIO Tomcat中BIO的模型和理论很简单,例图如下 1.Acceptor线程死循环阻塞接收客户端的打过来的socket请求 2.接收到请求之后打包成一个SocketProcessor(Runnable),扔到线程池中读取/写入数据 参数配置 1.Acceptor默认线程是1&#…