【Python从入门到进阶】54、使用Python轻松操作SQLite数据库

news2024/11/15 19:50:56

一、引言

1、什么是SQLite

SQLite的起源可以追溯到2000年,由D. Richard Hipp(理查德·希普)所创建。作为一个独立的开发者,Hipp在寻找一个能够在嵌入式系统中使用的轻量级数据库时,发现现有的解决方案要么过于庞大,要么无法满足他的需求。因此,他决定自己开发一个简单、高效、可靠的数据库引擎,这就是SQLite的雏形。

SQLite的创始理念是提供一个无服务器的、零配置的、自给自足的数据库引擎,以解决嵌入式系统和移动设备的存储和查询问题。与传统的关系型数据库管理系统(RDBMS)不同,SQLite不需要独立的服务器进程,也不需要进行繁琐的配置和管理。它只需要一个数据库文件,就可以开始使用,极大地简化了数据库的使用和管理。

随着SQLite的不断发展,它逐渐成为了嵌入式系统和移动应用中的首选数据库。由于其小巧的体积、高效的性能和稳定的性能,SQLite被广泛应用于各种领域,如智能家居、医疗设备、移动设备、游戏等。同时,由于其开源免费的特性,SQLite也吸引了大量的开发者和用户,形成了一个庞大的社区。

在SQLite的发展过程中,Hipp一直致力于提高数据库的性能和稳定性,同时也不断扩展其功能。SQLite支持标准的SQL92语言,并且提供了丰富的API接口,使得开发者可以轻松地与数据库进行交互。此外,SQLite还支持事务处理、并发访问、索引、触发器等多种高级特性,为开发者提供了更加灵活和强大的数据存储和查询能力。

2、为什么Python是操作SQLite的理想选择

SQLite以其小巧的体积和出色的性能,成为了开发者们的得力助手。无论是快速搭建一个原型系统,还是作为移动应用的数据存储后端,SQLite都能提供稳定可靠的数据支持。而且,由于其开源免费的特性,SQLite得到了广大开发者的青睐。

Python作为一种流行的高级编程语言,凭借其简洁的语法、丰富的库和强大的扩展性,成为了众多开发者的首选。而Python内置的sqlite3模块,则为我们提供了与SQLite数据库交互的便利。通过Python,我们可以轻松地连接到SQLite数据库,执行SQL语句,进行数据的增删改查等操作。

在本文中,我们将介绍如何使用Python操作SQLite数据库,包括连接数据库、创建和操作表、查询数据等基础知识,希望通过本文的介绍,读者能够掌握Python操作SQLite的基本技能,为日后的项目开发打下坚实的基础。

二、安装SQLite和Python的SQLite库

1、安装SQLite

SQLite不需要一个单独的服务器进程或操作系统级别的配置,因为它只是一个磁盘文件上的库,并且可以在多种编程语言中直接使用。

我们可以从SQLite的官方网站(https://www.sqlite.org/download.html)下载并安装。
在官网的【download】菜单下,找到“Precompiled Binaries for Windows”区域,下载相关版本(我这里是Windows的64位操作系统,所以选择x64版本):

这里下载数据库和命令行工具两个压缩包
下载完毕之后,解压压缩包:

可以看到sqlite-dll-win-x64-3450300.zip里面只有两个文件,分别是“sqlite3.def”和“sqlite3.dll”。sqlite-tools-win-x64-3450300.zip中是一个“”文件,我们新建一个sqlite3文件夹,将这些文件放在一个文件夹中:

添加“D:\Program Files (x86)\sqlite3”到电脑的PATH环境变量:

最后在命令提示符下,使用sqlite3命令,将显示如下结果:

这就证明咱们的sqlite安装成功。

2、安装Python的SQLite库

对于Python来说,SQLite库(sqlite3)是内置的,这意味着咱们不需要额外安装任何包来使用它。从Python2.5开始,sqlite3模块就被包含在Python的标准库中。要验证你的Python环境中是否包含了sqlite3模块,可以打开Python解释器并尝试导入它:

import sqlite3  

# 如果没有报错,说明sqlite3模块已经成功导入  
print("sqlite3 module is available.")

效果:

如果输出显示“sqlite3 module is available.”,那么你就可以开始使用Python来操作SQLite数据库了。如果你遇到任何导入错误,那么可能是因为你的Python环境有问题,或者你的Python版本太旧(低于2.5)。在这种情况下,需要更新Python环境或安装一个更新的版本。

三、连接到SQLite数据库

在Python中,我们可以使用内置的sqlite3模块来连接SQLite数据库。SQLite数据库文件实际上就是一个磁盘上的文件,通过这个文件,我们可以对数据进行存储、查询、更新和删除等操作。

1. 导入sqlite3模块

首先,我们需要在Python脚本中导入sqlite3模块。这个模块提供了与SQLite数据库交互的所有必要功能。

import sqlite3

2. 连接到SQLite数据库

然后,我们使用sqlite3.connect()函数来连接SQLite数据库。这个函数接受一个参数,即数据库文件的路径。如果指定的数据库文件不存在,SQLite会自动创建一个新的数据库文件。

# 连接到SQLite数据库文件,如果不存在则创建它  
conn = sqlite3.connect('example.db')

在上面的代码中,我们尝试连接到名为example.db的SQLite数据库文件。如果该文件不存在于指定的位置,SQLite将创建一个新的数据库文件。

3. 创建游标对象

在连接到数据库之后,我们需要创建一个游标(cursor)对象。游标对象用于执行SQL命令和获取查询结果。

# 创建一个游标对象  
cursor = conn.cursor()

4. 执行SQL命令

现在,我们可以使用游标对象来执行SQL命令了。例如,我们可以使用cursor.execute()方法创建一个新的表,或者向表中插入数据。

# 创建一个示例表  
cursor.execute('''  
    CREATE TABLE IF NOT EXISTS users (  
        id INTEGER PRIMARY KEY,  
        name TEXT,  
        age INTEGER  
    )  
''')  
  
# 插入一条数据  
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("魏大勋", 30))

在上面的代码中,我们首先使用CREATE TABLE语句创建了一个名为users的表(如果该表已经存在,则不会执行创建操作)。然后,我们使用INSERT INTO语句向表中插入了一条数据。注意,我们使用参数化查询来插入数据,这样可以防止SQL注入攻击。

5. 提交事务并关闭连接

在执行完SQL命令后,我们需要调用conn.commit()方法来提交事务,以确保数据被保存到数据库中。最后,我们使用conn.close()方法来关闭数据库连接。

# 提交事务  
conn.commit()  
  
# 关闭连接  
conn.close()

6. 完整的示例代码

下面是一个完整的示例代码,展示了如何连接到SQLite数据库、创建表、插入数据、提交事务并关闭连接:

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,  
        age INTEGER  
    )  
''')  
  
# 插入一条数据  
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("魏大勋", 30))  
  
# 提交事务  
conn.commit()  
  
# 关闭连接  
conn.close()

四、创建和操作SQLite表

在SQLite数据库中,表是存储数据的基本结构。通过表,我们可以定义数据的结构和关系。在Python中,我们可以使用sqlite3模块来创建和操作SQLite表。

1. 创建表

要创建一个新的表,我们需要使用CREATE TABLE语句,并通过游标对象执行该语句。下面是一个创建表的示例:

import sqlite3  
  
# 连接到SQLite数据库(如果数据库不存在,会自动在当前目录创建)  
conn = sqlite3.connect('test.db')  
  
# 创建一个游标对象  
cursor = conn.cursor()  
  
# 创建一个名为users的表  
create_table_sql = '''  
CREATE TABLE IF NOT EXISTS users (  
    id INTEGER PRIMARY KEY AUTOINCREMENT,  
    name TEXT NOT NULL,  
    age INTEGER,  
    email TEXT UNIQUE  
)  
'''  
cursor.execute(create_table_sql)  
  
# 提交事务(在创建表时通常不需要,但在这里为了保持一致性)  
conn.commit()  
  
# 关闭游标和连接  
cursor.close()  
conn.close()

在这个示例中,我们创建了一个名为users的表,它包含四个字段:id(作为主键并自动增长)、name(不能为空)、age(可以为空)和email(必须是唯一的)。

2. 插入数据

要向表中插入数据,我们可以使用INSERT INTO语句。下面是一个插入数据的示例:

import sqlite3  
  
# 连接到SQLite数据库  
conn = sqlite3.connect('test.db')  
  
# 创建一个游标对象  
cursor = conn.cursor()  
  
# 插入一条数据  
insert_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)"  
data = ('魏大勋', 30, 'weidaxun@example.com')  
cursor.execute(insert_sql, data)  
  
# 提交事务  
conn.commit()  
  
# 关闭游标和连接  
cursor.close()  
conn.close()

在这个示例中,我们使用参数化查询来插入数据,这不仅可以提高代码的可读性,还可以防止SQL注入攻击。

3. 查询数据

要从表中查询数据,我们可以使用SELECT语句。下面是一个查询数据的示例:

import sqlite3  
  
# 连接到SQLite数据库  
conn = sqlite3.connect('test.db')  
  
# 创建一个游标对象  
cursor = conn.cursor()  
  
# 查询所有数据  
query_sql = "SELECT * FROM users"  
cursor.execute(query_sql)  
  
# 获取查询结果  
results = cursor.fetchall()  
for row in results:  
    print(row)  
  
# 关闭游标和连接  
cursor.close()  
conn.close()

在这个示例中,我们使用fetchall()方法获取查询结果的所有行。我们还可以使用fetchone()方法逐行获取结果,或者使用fetchmany(size)方法一次获取多行结果。查询结果:

4. 更新数据

要更新表中的数据,我们可以使用UPDATE语句。下面是一个更新数据的示例:

import sqlite3

# 链接到SQLite数据库
conn = sqlite3.connect("test.db")

# 创建一个游标对象
cursor = conn.cursor()

# 查询更新前数据
query_sql = "select * from users where name = ?"
query_data = ("魏大勋",)  # 就算只有一个值,也必须用元组包裹
cursor.execute(query_sql, query_data)
results = cursor.fetchall()
print("[更新前数据]:", results)

# 更新一条数据
update_sql = "update users set age = ? where name = ?"
update_data = (30, "魏大勋")
cursor.execute(update_sql, update_data)

# 提交事务
conn.commit()

# 查询更新后数据
cursor.execute(query_sql, query_data)
results = cursor.fetchall()
print("[更新后数据]:", results)

# 关闭游标和连接
cursor.close()
conn.close()

在这个示例中,我们将名为'魏大勋'的用户的年龄更新为30。运行效果:

5. 删除数据

要从表中删除数据,我们可以使用DELETE语句。下面是一个删除数据的示例:

import sqlite3  
  
# 连接到SQLite数据库  
conn = sqlite3.connect('test.db')  
  
# 创建一个游标对象  
cursor = conn.cursor()  
  
# 删除一条数据  
delete_sql = "DELETE FROM users WHERE name = ?"  
data = ('魏大勋',)  
cursor.execute(delete_sql, data)  
  
# 提交事务  
conn.commit()  
  
# 关闭游标和连接  
cursor.close()  
conn.close()

在这个示例中,我们删除了名为'魏大勋'的用户。请注意,在执行删除操作时要特别小心,因为删除的数据将不可恢复。

五、使用Python的sqlite3模块高级功能

Python的sqlite3模块不仅提供了基本的数据库操作功能,如创建表、插入数据、查询数据等,还提供了一些高级功能,可以帮助我们更高效地管理和使用SQLite数据库。下面将介绍一些sqlite3模块的高级功能。

1. 参数化查询

参数化查询是一种防止SQL注入攻击的有效方法。在sqlite3中,我们可以使用问号(?)作为占位符,并将实际参数作为元组或列表传递给execute()方法。这样做不仅可以确保数据的安全性,还可以提高查询的性能。

import sqlite3  
  
# 连接到SQLite数据库  
conn = sqlite3.connect('test.db')  
cursor = conn.cursor()  
  
# 参数化查询  
name = 'Alice'  
query = "SELECT * FROM users WHERE name = ?"  
cursor.execute(query, (name,))  
results = cursor.fetchall()  
for row in results:  
    print(row)  
  
# 关闭游标和连接  
cursor.close()  
conn.close()

2. 执行事务

在SQLite中,事务是一组作为单个逻辑单元执行的SQL语句。使用事务可以确保数据的一致性,即使在出现错误时也可以回滚到事务开始之前的状态。在sqlite3中,我们可以使用commit()方法提交事务,使用rollback()方法回滚事务。

import sqlite3  
  
# 连接到SQLite数据库  
conn = sqlite3.connect('test.db')  
cursor = conn.cursor()  
  
try:  
    # 开始一个事务  
    cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('白敬亭', 25))  
    cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, '白敬亭'))  
    # 提交事务  
    conn.commit()  
except Exception as e:  
    # 发生异常时回滚事务  
    print(f"An error occurred: {e}")  
    conn.rollback()  
  
# 关闭游标和连接  
cursor.close()  
conn.close()

如果我们重复插入这个数据(我们设置email为唯一的),就会报错:

报的就是唯一策略的字段被重复插入了。

3. 使用ROWID

SQLite中的每个表都有一个特殊的ROWID列,它是一个64位整数,用于唯一标识表中的每一行。即使我们没有在表中明确指定主键列,SQLite也会自动为我们创建一个隐藏的ROWID列。我们可以使用ROWID来访问和操作表中的行。

import sqlite3  
  
# 连接到SQLite数据库  
conn = sqlite3.connect('test.db')  
cursor = conn.cursor()  
  
# 插入一条数据并获取ROWID  
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('彭昱畅', 28))  
rowid = cursor.lastrowid  
print(f"Inserted row with ROWID: {rowid}")  
  
# 使用ROWID查询数据  
query = "SELECT * FROM users WHERE rowid = ?"  
cursor.execute(query, (rowid,))  
result = cursor.fetchone()  
print(result)  
  
# 关闭游标和连接  
cursor.close()  
conn.close()

效果:

4. 使用内存数据库

除了磁盘上的文件数据库外,SQLite还支持内存数据库。内存数据库将数据存储在RAM中,因此读写速度非常快,但数据在关闭连接后会丢失。要创建内存数据库,只需将数据库文件名设置为:memory:即可。

import sqlite3  
  
# 连接到内存数据库  
conn = sqlite3.connect(':memory:')  
cursor = conn.cursor()  
  
# 在内存数据库中创建表并插入数据  
cursor.execute('''  
    CREATE TABLE users (  
        id INTEGER PRIMARY KEY AUTOINCREMENT,  
        name TEXT NOT NULL,  
        age INTEGER  
    )  
''')  
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('彭昱畅', 28))  
  
# 查询并打印数据  
cursor.execute("SELECT * FROM users")  
for row in cursor.fetchall():  
    print(row)  
  
# 关闭游标和连接(数据将丢失)  
cursor.close()  
conn.close()

效果:
​​​​​​​

5. 使用自定义数据类型

SQLite支持多种数据类型,但默认情况下,它可能无法直接处理某些复杂的数据结构(如列表、字典等)。然而,我们可以通过Python的序列化机制(如pickle)将这些数据结构转换为字节字符串,并在SQLite中将其存储为BLOB(二进制大对象)类型。然后,我们可以使用反序列化机制将这些字节字符串还原为原始数据结构。

请注意,使用这种方法存储复杂数据结构可能会增加数据处理的复杂性和安全风险,因此应谨慎使用。

转载请注明出处:https://guangzai.blog.csdn.net/article/details/138764428

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

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

相关文章

【35分钟掌握金融风控策略29】贷中模型调额调价策略

目录 贷中客户风险管理和客户运营体系 用信审批策略 用信审批策略决策流与策略类型 贷中预警策略 对存量客户进行风险评级 基于客户的风险评级为客户匹配相应的风险缓释措施和建议 调额策略 基于定额策略的调额策略 基于客户在贷中的风险表现的调额策略 调价策略 存…

视频监控系统中,可变码率和固定码率对录像文件存储大小的影响,如何配置比较好?

目录 一、问题描述 二、视频监控的录像文件计算 (一)计算方法 (二)计算工具 三、原因分析 (一)检查配置 1、IPCa配置 2、IPCb配置 3、录像文件存储大小的理论值 (二)实际情…

Darknet+ros+realsenseD435i+yolo(ubuntu20.04)

一、下载Darknet_ros mkidr -p yolo_ws/src cd yolo_ws/src git clone --recursive https://github.com/leggedrobotics/darknet_ros.git #因为这样克隆的darknet文件夹是空的,将darknet_ros中的darknet的文件替换成如下 cd darknet_ros git clone https://github.…

英飞凌SiC模块为小米电动车提供动力

至2027年之际,SiC功率模块与裸片产品将荣耀登场,助力小米电动汽车新品SU7璀璨问世。英飞凌,这家业界翘楚,将倾其所能,为小米SU7 Max提供两颗HybridPACK Drive G2 CoolSiC 1200 V模块,如同给电动汽车的心脏注…

[链表专题]力扣141, 142

1. 力扣141 : 环形链表 题 : 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾…

pytest教程-47-钩子函数-pytest_sessionfinish

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest_sessionstart钩子函数的使用方法,本小节我们讲解一下pytest_sessionfinish钩子函数的使用方法。 pytest_sessionfinish 钩子函数在 Pytest 测试会话结束时调用,…

254 基于matlab的钢筋混凝土非线性分析

基于matlab的钢筋混凝土非线性分析,根据梁本构关系,然后进行非线性分析,绘制弯矩-曲率曲线。可设置梁的截面尺寸、混凝土本构,钢筋截面面积等相关参数,程序已调通,可直接运行。 254 钢筋混凝土非线性分析 弯…

那些年我与c++的叫板(一)--string类自实现

引子:我们学习了c中的string类,那我们能不能像以前数据结构一样自己实现string类呢?以下是cplusplus下的string类,我们参考参考! 废话不多说,直接代码实现:(注意函数之间的复用&…

公司邮箱是什么?公司邮箱和个人邮箱有什么不同?

公司邮箱是企业用来收发邮件的专业版电子邮箱,不同于个人邮箱的简单功能和有限的存储空间,公司邮箱的功能更加丰富,能够满足企业的日常办公和协作需求。本文将为您详细讲解公司邮箱和个人邮箱的区别,以供您选择更适合自己的邮箱类…

数学建模——农村公交与异构无人机协同配送优化

目录 1.题目 2.问题1 1. 问题建模 输入数据 ​编辑 2. 算法选择 3.数据导入 3.模型构建 1. 距离计算 2. 优化模型 具体步骤 进一步优化 1. 重新定义问题 2. 变量定义 3. 优化目标 具体步骤 再进一步优化 具体实现步骤 1. 计算距离矩阵 2. 变量定义 3. 约束…

【C++】:string类的基本使用

目录 引言一,string类对象的常见构造二,string类对象的容量操作三,string类对象的访问及遍历操作四,string类对象的修改操作五,string类非成员函数六,整形与字符串的转换 引言 string 就是我们常说的"…

UIKit之图片浏览器

功能需求 实现一个图片浏览器,点击左右按钮可以切换背景图,且更新背景图对应的索引页和图片描述内容。 分析: 实现一个UIView的子类即可,该子类包含多个按钮。 实现步骤: 使用OC语言,故创建cocoa Touch类…

【JavaScript】WeakMap 和 WeakSet

Map Map 用于存储键值对。 添加属性: 使用 Map 的 set() 方法可以向 Map 对象中添加键值对。例如: const map new Map(); map.set(key1, value1); map.set(key2, value2);通过二维数组快速创建 map 键值对。 let arr [[1, 2],[2, 3],[3, 4]]let map …

window10下安装ubuntu系统以及docker使用

window10下安装ubuntu系统以及docker使用 1. 启用适用于Linux的Windwos子系统2.下载Linux内核更新包3.将 WSL 2 设置为默认版本4.安装Ubuntu<br />直接去Microsoft store里面直接搜索Ubuntu进行安装。5.可能出现的问题1.win10启动ubuntu报错 参考的对象类型不支持尝试的操…

2024中国应急(消防)品牌巡展西安站成功召开!惊喜不断

消防品牌巡展西安站 5月10日&#xff0c;由中国安全产业协会指导&#xff0c;中国安全产业协会应急创新分会、应急救援产业网联合主办&#xff0c;陕西消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-西安站成功举办。该巡展旨在展示中国应急&#xff08;消防&am…

ABC352编程笔记

ABC352 编程笔记 题意&#xff1a;输入&#xff0c;四个数 a , b , c , d a,b,c,d a,b,c,d&#xff0c;若 d d d 在 c , d c,d c,d 之间&#xff0c;则输出 Yes&#xff0c;否则输出 No。 正解&#xff1a;直接判断。 #include <bits/stdc.h> //#define int long lo…

大数据比赛-环境搭建(二)

一、ubuntu安装google 1、下载google的Linux安装版 链接&#xff1a;https://pan.baidu.com/s/1w4Hsa1wbJDfC95fX2vU_1A 提取码&#xff1a;xms6 或者&#xff1a;Google Chrome 64bit Linux版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒 (chromedownloads.net) …

docker-java 操作docker

部署docker 10分钟学会Docker的安装和使用_docker安装-CSDN博客文章浏览阅读2.5w次&#xff0c;点赞44次&#xff0c;收藏279次。文章目录Docker简介Docker安装Windows安装Linux安装CentOS安装Ubuntu安装最近花了些时间学习docker技术相关&#xff0c;在此做一些总结&#xff0…

静态IP代理:网络世界的隐秘通道

在数字化时代&#xff0c;网络安全和隐私保护日益受到重视。静态IP代理作为一种网络服务&#xff0c;为用户提供了一个稳定且可预测的网络连接方式&#xff0c;同时保护了用户的在线身份。本文将从五个方面深入探讨静态IP代理的概念、优势、应用场景、技术实现以及选择时的考量…

【传知代码】VRT: 关于视频修复的模型(论文复现)

前言&#xff1a;随着数字媒体技术的普及&#xff0c;制作和传播视频内容变得日益普遍。但是&#xff0c;视频中由于多种因素&#xff0c;例如传输、存储和录制设备等&#xff0c;经常出现质量上的问题&#xff0c;如图像模糊、噪声干扰和低清晰度等。这类问题对用户的体验和观…