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

在Python中使用sqlite3进行数据持久化操作

目录

引言

一、安装sqlite3模块

二、创建数据库连接

三、创建游标对象

四、执行SQL命令

五、提交更改

六、关闭连接

七、使用参数化查询

八、使用ORM进行数据操作

九、备份和恢复数据库

十、处理大量数据

十一、优化查询性能

十二、处理并发访问

十三、处理数据持久化

十四、进行数据库备份与恢复

总结



引言

数据持久化是将数据从临时存储状态转换为永久存储状态的过程。在Python中,有很多种方法可以实现数据持久化,其中最常见的是使用关系型数据库,如MySQL、PostgreSQL等。然而,对于一些小型的项目或简单的数据存储需求,使用SQLite3这样的嵌入式数据库可能更加方便和高效。本篇文章将介绍如何在Python中使用sqlite3模块进行数据持久化操作。

一、安装sqlite3模块

在Python中,sqlite3模块是标准库的一部分,无需额外安装。你可以直接使用以下命令导入该模块:

import sqlite3

二、创建数据库连接

要使用sqlite3模块进行数据持久化操作,首先需要创建一个数据库连接。可以使用以下代码创建一个名为test.db的SQLite数据库连接:

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

三、创建游标对象

创建数据库连接后,需要创建一个游标对象来执行SQL命令。可以使用以下代码创建一个游标对象:

cursor = conn.cursor()

四、执行SQL命令

创建游标对象后,可以使用它来执行SQL命令。以下是一些常见的SQL命令示例:

创建表:

CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)
插入数据:

INSERT INTO users (name, age) VALUES ('Alice', 25)
查询数据:

SELECT * FROM users WHERE age > 30
更新数据:

UPDATE users SET age = 31 WHERE id = 1
删除数据:

DELETE FROM users WHERE id = 1

五、提交更改

执行SQL命令后,需要使用commit()方法提交更改。例如:

conn.commit()

六、关闭连接

最后,记得关闭数据库连接以释放资源。可以使用以下代码关闭数据库连接:

conn.close()

七、使用参数化查询

为了避免SQL注入攻击,推荐使用参数化查询。参数化查询可以确保输入被正确处理,并且与查询分开,从而提高安全性。以下是一个使用参数化查询的示例:

name = 'Alice'  
age = 25  
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (name, age))  
conn.commit()

八、使用ORM进行数据操作

ORM(对象关系映射)是一种将数据库表映射到Python类的技术。使用ORM可以使数据操作更加面向对象和易于管理。在Python中,有很多ORM框架可供选择,其中比较流行的有SQLAlchemy和Django ORM。以下是一个使用Django ORM的示例:

from django.db import models  class User(models.Model):  name = models.CharField(max_length=100)  age = models.IntegerField()  # 创建用户对象  
user = User(name='Alice', age=25)  
user.save()  # 查询用户  
users = User.objects.filter(age__gt=30)  
for user in users:  print(user.name, user.age)

九、备份和恢复数据库

为了保证数据安全,需要定期备份数据库。可以使用sqlite3的backup()方法来备份数据库。以下是一个备份数据库的示例:

import sqlite3  
from sqlite3 import Error  def backup_db(db_path, backup_path):  if not sqlite3.sqlite_version_info >= (3, 3, 4):  raise EnvironmentError("Backup requires SQLite version 3.3.4 or greater.")  try:  conn = sqlite3.connect(db_path)  cursor = conn.cursor()  with open(backup_path, "wb") as backup_file:  backup_file.write(conn.backup(backup_file))  return True  except Error as e:  print(e)  finally:  cursor.close()          conn.close()

十、处理大量数据

如果需要处理大量数据,建议使用事务(transaction)来一次性提交或回滚多个操作,以提高性能和减少数据库交互次数。可以使用conn.execute()方法执行事务,通过传入参数isolation_level设置隔离级别,例如:

conn.execute('BEGIN TRANSACTION;')  
try:  # 在这里执行多个SQL操作  cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 30))  cursor.execute('UPDATE users SET age = ? WHERE name = ?', (31, 'Alice'))  # 一次性提交事务  conn.execute('COMMIT;')  
except Exception as e:  # 如果出现异常,回滚事务  conn.execute('ROLLBACK;')  raise e  
finally:  conn.close()

十一、优化查询性能

对于大型数据表,查询性能可能会成为问题。以下是一些优化查询性能的方法:

1、使用索引:在经常用于查询条件的列上创建索引,可以加快查询速度。例如,可以在users表的name列上创建索引:

CREATE INDEX idx_users_name ON users (name);
2、减少查询返回结果:只获取需要的列,而不是使用SELECT *返回所有列。例如:

SELECT name, age FROM users WHERE age > 30;
3、使用连接(JOIN)代替子查询:在某些情况下,连接比子查询更高效。例如:

SELECT users.name, users.age FROM users JOIN orders ON users.id = orders.user_id WHERE orders.total > 100;

十二、处理并发访问

如果多个用户同时访问数据库,可能会导致并发问题。可以使用锁来防止并发访问导致的数据不一致。sqlite3支持对数据库进行锁定,可以通过以下代码实现:

conn = sqlite3.connect('test.db')  
conn.execute('BEGIN TRANSACTION;')  
try:  # 在这里执行SQL操作  cursor.execute('SELECT * FROM users WHERE age > ?', (30,))  # 获取共享锁,其他并发连接可以共享这个锁,直到事务结束或锁被释放为止。  conn.execute('SELECT * FROM locktable WHERE id = ?', (1,))  # 获取排他锁,其他并发连接无法访问这个锁所保护的表或行。  conn.execute('SELECT * FROM users WHERE age > ?', (30,))  # 释放锁,其他连接可以访问这个锁所保护的表或行。  
finally:  conn.execute('COMMIT;')  conn.close()

十三、处理数据持久化

数据持久化是将数据从内存存储到磁盘的过程,以保证数据在程序关闭后仍然可以持久保存。在Python中,可以使用sqlite3模块提供的数据库连接对象来实现数据持久化。以下是一个将数据持久化到数据库的示例:

import sqlite3  # 创建数据库连接  
conn = sqlite3.connect('test.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 (?, ?)', ('Alice', 25))  
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 30))  # 提交更改  
conn.commit()  # 关闭连接  
conn.close()

在上面的示例中,我们首先创建了一个数据库连接对象,然后使用游标对象执行SQL命令来创建数据表和插入数据。最后,我们通过调用commit()方法提交更改,并关闭数据库连接。这样,数据就被持久化到数据库中了。

十四、进行数据库备份与恢复

为了保护数据安全,我们需要定期备份数据库。可以使用sqlite3模块提供的backup()方法来备份数据库。以下是一个备份数据库的示例:

import sqlite3  
from sqlite3 import Error  def backup_db(db_path, backup_path):  if not sqlite3.sqlite_version_info >= (3, 3, 4):  raise EnvironmentError("Backup requires SQLite version 3.3.4 or greater.")  try:  conn = sqlite3.connect(db_path)  cursor = conn.cursor()  with open(backup_path, "wb") as backup_file:  backup_file.write(conn.backup(backup_file))  return True  except Error as e:  print(e)  finally:  cursor.close()          conn.close()

总结

在本文中,我们介绍了使用Python的sqlite3模块进行数据库操作的一些基本知识和技巧。首先,我们介绍了如何创建数据库连接、游标对象和数据表。接着,我们详细讲解了如何执行SQL查询、插入、更新和删除数据,以及如何使用参数化查询来避免SQL注入攻击。

此外,我们还介绍了如何使用ORM进行数据操作、处理大量数据、优化查询性能、处理并发访问以及进行数据库备份与恢复等方面的知识和技巧。通过这些内容,我们可以了解到使用Python的sqlite3模块进行数据库操作可以更加方便、灵活和高效。

相关文章:

在Python中使用sqlite3进行数据持久化操作

目录 引言 一、安装sqlite3模块 二、创建数据库连接 三、创建游标对象 四、执行SQL命令 五、提交更改 六、关闭连接 七、使用参数化查询 八、使用ORM进行数据操作 九、备份和恢复数据库 十、处理大量数据 十一、优化查询性能 十二、处理并发访问 十三、处理数据持…...

file2Udp增量日志转出Udp简介

https://gitee.com/tianjingle/file2udp 很多时候服务产生的日志需要进行汇总,这种统一日志处理的方式有elb,而且很多日志组件也支持日志转出的能力。但是从广义上来说是定制化的,我们需要一个小工具实现tail -f的能力,将增量日志…...

快速创建1个G的文件 -----window平台

window平台下 cmdh中 1G: 1073741824 个字节2G: 21474836483G: 32212254724G: 42949672964.5G: 48318382085G: 5368709120 生成一个G的文件 fsutil file createNew big1g.txt 1073741824...

LeetCode【33】搜索旋转排序数组

题目&#xff1a; 思路&#xff1a; https://www.cnblogs.com/CherryTab/p/12196580.html 代码&#xff1a; class Solution {int [] nums;int target;public int find_rotate_index(int left, int right) {if (nums[left] < nums[right])return 0;while (left < righ…...

若依系统富文本框上传图片报错!

报错如下&#xff1a; 原因&#xff1a;如图&#xff0c;富文本路径中存在 / 字符&#xff0c;导致上传出错。 解决方案&#xff1a;将富文本框内容在前端进行加密&#xff0c;后端再解密。 前端&#xff1a; 安装 crypto-js 插件 npm install crypto-js 创建工具类 :在 sr…...

Azure 机器学习:MLOps - 使用 Azure 机器学习进行模型管理、部署和监视

本文介绍如何在 Azure 机器学习中应用机器学习运营 (MLOps) 做法&#xff0c;以管理模型的生命周期。 应用 MLOps 做法可改善机器学习解决方案的质量和一致性。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff…...

CSDN每日一题学习训练——Java版(分数到小数、罗马数字转整数、x 的平方根)

版本说明 当前版本号[20231114]。 版本修改说明20231114初版 目录 文章目录 版本说明目录分数到小数题目解题思路代码思路参考代码 罗马数字转整数题目解题思路代码思路参考代码 x 的平方根题目解题思路代码思路参考代码 分数到小数 题目 给定两个整数&#xff0c;分别表示…...

【2021集创赛】 RISC-V杯三等奖:基于E203 处理器的SM4算法硬件加速

杯赛题目&#xff1a;基于蜂鸟E203 RISC-V处理器内核的SoC设计 参赛要求&#xff1a;研究生组/本科生组 赛题内容&#xff1a; 基于芯来科技的开源蜂鸟E203 Demo SoC进行扩展&#xff0c;在限定的可编程逻辑平台上构建面向专用应用领域&#xff08;譬如人工智能、信息安全、工业…...

SUMO道路封闭车辆绕行仿真实验【TraCI】

本文将介绍如何在 SUMO 交通模拟中动态选择车辆绕行指定道路。 绕道是城市驾驶中的常见现象&#xff0c;造成原因有很多&#xff0c;包括建筑和交通事故等。 无论出于何种原因&#xff0c;并非所有车辆都会选择避开这些道路&#xff1b; 有些人可能会毫不犹豫地直接开车过去&a…...

IDEA 无法搜索或者下载插件

File -> Settings… -> Plugins 可以打开插件市场&#xff0c;搜索想要下载的插件&#xff0c;但是可能由于网络问题而无法成功搜索或者下载插件。此时需要设置代理来解决。点击插件界面里的齿轮图标&#xff08;在Marketplace、Installed的右边&#xff09;&#xff0c;…...

unity 使用Vuforia扫描实体物体交互

文章目录 前言一、Vuforia是什么&#xff1f;二、Unity导入Vuforia1.去Unity - Windows – Asset Store&#xff0c;搜vuforia engine&#xff0c;添加到我的资源2.从 Unity 的菜单 Assets -> Import package -> Custom Package 导入脚本&#xff0c;添加 Vuforia Engine…...

IDEA接口调试插件不好找?这款免费用!

IDEA插件市场中的API调试插件不是收费&#xff08;Fast Request &#xff09;就是不好用&#xff08;apidoc、apidocx等等&#xff09;今天给大家介绍一款国产的API调试插件&#xff1a;Apipost-Helper&#xff0c;完全免费且好看好用&#xff01; 这款插件由Apipost团队开发的…...

OpenCV图像坐标系

绘制代码: X轴 # 选取两个点 point1 = (20, 0) point2 = (200, 0)# 在图像上绘制连接线 cv2.line(img, point1, point2, (...

【Proteus仿真】【Arduino单片机】DHT11温湿度

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、DHT11温湿度传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示传感器采集温度和湿度。 二、软件设…...

Linux--makefile

一、makefile的作用 makefile是一个文件&#xff0c;是围绕依赖关系和依赖方法的自动化编译工具 一个工程中的源文件有很多&#xff0c;按照不同的类型、功能、模块放在不同的目录中。而makefile定义了一系列的规则来指定&#xff0c;那些文件需要先编译&#xff0c;那些文件…...

Anaconda学习备忘

Anaconda是一套用于数据处理和科学计算以及AI等领域的包管理器。 以前的误区一直以为Anaconda只有python库&#xff0c;现在仔细搜索学习以后&#xff0c;才知道它其实包含多种语言&#xff0c;可以直接下载各种语言生成的包。其中conda就是一套跨语言包管理器了&#xff0c;而…...

uniapp运行到安卓模拟器一直在“同步手机端程序文件完成“界面解决办法

如果你是用的模拟器是android studio创建的模拟器&#xff0c;那么你需要新创建一个android11 x86架构的模拟器&#xff1a; 创建完成后&#xff0c;启动模拟器&#xff1a; 然后在hbuilder中重新运行到这个模拟器就可以了&#xff1a; 运行结果&#xff1a; 如果你是用安…...

leetcode:876. 链表的中间结点

一、题目 函数原型&#xff1a; struct ListNode* middleNode(struct ListNode* head) 二、思路 要找到链表的中间结点&#xff0c;有两种思路&#xff1a; 暴力解法&#xff1a;先遍历一遍链表&#xff0c;计算出链表的长度&#xff0c;再次遍历链表&#xff0c;找到中间结点。…...

【m98】webrtc vs2017构建带符号的debug库

调试有符号 调试 无符号 试试exe不输出到独立的文件? -】 直接输出到sln下面...

【读点论文】结构化剪枝

结构化剪枝 在一个神经网络模型中&#xff0c;通常包含卷积层、汇合层、全连接层、非线形层等基本结构&#xff0c;通过这些基本结构的堆叠&#xff0c;最终形成我们所常用的深度神经网络。 早在 1998 年&#xff0c;LeCun 等人使用少数几个基本结构组成 5 层的 LeNet-5 网络&…...

JimuReport积木报表 v1.6.5 版本发布—免费报表工具

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…...

【开发工具】gitee还不用会?我直接拿捏 >_>

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 &#x1f4d5;揭开git面纱 &#x1f4d5;git的一些前置操作 &#x1f4d5;如何获取本地仓库 &#x1f4d5;本地仓库的操作 &#x1f4d5;远程仓库操作 &#x1f4d5;分支操作 &#x1f4d5;标签操作 &…...

算法通关村——位运算之位移的妙用

位移的妙用 1、位1的个数 1.1、题目描述 ​ LeetCode191. 编写一个函数&#xff0c;输入是一个无符号整数(以二进制串的形式)&#xff0c;返回其二进制表达式中数字位为 ‘1’ 的个数。 示例1&#xff1a; 输入&#xff1a;00000000000000000000000000001011 输出&#xff1…...

【开题报告】基于uni-app的高校新生报道APP的设计与实现

1.选题背景和意义 随着高校规模的不断扩大和信息化技术的迅速发展&#xff0c;传统的高校新生报道方式已经无法满足日益增长的新生数量和信息处理的需求。传统的线下报道流程通常存在着信息收集效率低、报到流程繁琐等问题&#xff0c;给学生、教职工和管理人员带来了许多不便…...

Elasticsearch docker-compose 使用 Logstash 从 JSON 文件中预加载数据

在我们创建 Elasticsearch 进行开发时&#xff0c;最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时&#xff0c;特别是在准备测试环境时&#xff0c;开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很…...

<文件操作及常用的API>

文章目录 专栏导读&#x1f680;简单认识一下文件&#x1f680;树形结构和目录&#x1f680;文件路径-相对路径、绝对路径&#x1f680;文件类型&#x1f680;Java中文件的操作&#x1f680;File 类的常用方法 专栏导读 &#x1f680;多线程章节 &#x1f490;数据结构剖析 &am…...

深入探讨Linux中的文本文件查看命令

目录 前言1 cat命令2 less命令3 more命令4 head命令5 tail命令6 总结 前言 在Linux系统中&#xff0c;文本文件是日常工作中不可或缺的一部分&#xff0c;无论是配置文件、日志文件还是代码文件&#xff0c;都需要用到文本文件查看命令。在本文中&#xff0c;我们将深入研究一…...

asp.net企业员工档案信息管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目

一、源码特点 asp.net企业员工档案信息管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 asp.net企业员工档案信息管理系统 二、功能介绍 本系统使用Microsoft Visual Studio 2019为开发工具&…...

WPF中的xmlns 和xmlns:x有什么区别?

WPF (Windows Presentation Foundation) 中的 xmlns 和 xmlns:x 是XML命名空间的声明&#xff0c;它们在XAML&#xff08;eXtensible Application Markup Language&#xff09;中被广泛使用。XAML是WPF、Silverlight、Xamarin.Forms等技术中用于定义UI元素的标记语言。 xmlns: …...

为什么流量卡禁区多,而手机卡却可以用呢?

很多朋友比较关心流量卡禁区的问题&#xff0c;当我们申请流量卡时&#xff0c;运营商都会在套餐详情中标明具体的禁发地区&#xff0c;这个时候很多朋友都会有疑问了&#xff0c;为什么流量卡不能用的地区&#xff0c;可以申请到手机卡呢。 ​  想要清楚这个问题&#xff0…...