在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模块进行数据库操作可以更加方便、灵活和高效。

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

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

相关文章

考虑区域多能源系统集群协同优化的联合需求侧响应模型(matlab代码)

该程序复现《考虑区域多能源系统集群协同优化的联合需求侧响应模型》文献模型,程序的核心是对多个区域级多能源系统互联系统进行多目标优化,并且考虑联合需求侧响应,以多个区域多能源系统运行总成本最小、碳排放最小为目标,建立多…

敏感数据是什么?包含哪些?如何保障安全?

最近看到不少小伙伴在问,敏感数据是什么?包含哪些?如何保障安全?这里我们小编就给大家一一解答一下,仅供参考哦! 敏感数据是什么? 敏感数据,是指泄漏后可能会给社会或个人带来严重危…

IDEA创建JavaFX项目

1、New -> Project 2、选择JavaFX 配置项目名,包名,lib包管理工具,JDK版本(注,JDK版本最低需要11) 3、选择lib包 根据自己需求选择 lib包介绍 BootstrapFX:BootstrapFX 是一个为 JavaFX 提…

将ECharts图表插入到Word文档中

文章目录 在后端调用JS代码准备ECharts库生成Word文档项目地址库封装本文示例 EChartsGen_DocTemplateTool_Sample 如何通过ECharts在后台生成图片,然后插入到Word文档中? 首先要解决一个问题:总所周知,ECharts是前端的一个图表库…

【文件包含】phpmyadmin 文件包含(CVE-2014-8959)

1.1漏洞描述 漏洞编号CVE-2014-8959漏洞类型文件包含漏洞等级高危漏洞环境Windows漏洞名称phpmyadmin 文件包含(CVE-2014-8959) 描述: phpMyAdmin是一套开源的、基于Web的MySQL数据库管理工具。其index.php中存在一处文件包含逻辑,通过二次编…

多区域OSPF配置

配置命令步骤: 1.使用router ospf 进程ID编号 启用OSPF路由 2.使用network 直连网络地址 反掩码 area 区域号 将其归于对应区域 注意: 1.进程ID编号可任意(1-65535) 2.反掩码用4个255相减得到 3.area 0 为主干区域 4.连接不…

【Spring】bean的生命周期

这里写目录标题 1. 在类中提供生命周期控制方法,并在配置文件中配置init-method&destroy-method(配置)关闭容器操作1:ctx.close()关闭容器操作2:关闭钩子:ctx.registerShutdownHook() 2. 实现接口来做和…

MIB 操作系统Lab: Xv6 and Unix utilities(1)boot xv6

从github中下载xv6代码 $ git clone git://g.csail.mit.edu/xv6-labs-2023 $ cd xv6-labs-2023 编译和运行xv6: $ make qemu 如果在终端输入ls命令,能看到输出。 大多数都是可以直接运行的命令。 xv6没有ps命令,但是可以输入ctrl-p可以看到进程的信…

【AI视野·今日NLP 自然语言处理论文速览 第六十五期】Mon, 30 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 30 Oct 2023 Totally 67 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers An Approach to Automatically generating Riddles aiding Concept Attainment Authors Niharika Sri Parasa,…

单区域OSPF配置

配置命令步骤: 1.使用router ospf 进程ID编号 启用OSPF路由 2.使用network 直连网络地址 反掩码 area 0 将其归于区域0 注意:1.进程ID编号可任意(1-65535)2.反掩码用4个255相减得到 如下图,根据给出要求配置OSPF单区…

java学习part04

1.进制 计算机底层都是二进制,输出统一十进制 2.算符 3.逻辑算符 4.位运算符 38-变量与运算符-位运算符的使用_哔哩哔哩_bilibili 5.条件运算符

架构师修炼之道

相信大家都对未来的职业发展有着憧憬和规划,要做架构师、要做技术总监、要做CTO。对于如何实现自己的职业规划也都信心满满,努力工作、好好学习、不断提升自己。 相信成为一名优秀的架构师是很多程序员的目标,架构师的工作包罗万象&#xff…

计算机视觉基础(7)——相机基础

前言 从这一节开始,我们来学习几何视觉。中层视觉包括相机模型、单目几何视觉、对极几何视觉和多目立体视觉等。在学习几何视觉最开始,我们先来学习一下相机模型,了解相机的基本原理,了解相机如何记录影像。 一、数字相机 1.1 基…

PVE Win平台虚拟机下如何安装恢复自定义备份Win系统镜像ISO文件(已成功实现)

环境: Virtual Environment 7.3-3 Win s2019 UltraISO9.7 USM6.0 NTLite_v2.1.1.7917 问题描述: PVE Win平台虚拟机下如何安装恢复自定义备份Win系统镜像ISO文件 本次目标 主要是对虚拟机里面Win系统备份做成可安装ISO文件恢复至别的虚拟机或者实体机上 解决方案: …

wpf devexpress项目中添加GridControl绑定数据

本教程讲解了如何添加GridControl到wpf项目中并且绑定数据 原文地址Lesson 1 - Add a GridControl to a Project and Bind it to Data | WPF Controls | DevExpress Documentation 1、使用 DevExpress Template Gallery创建一个新的空白mvvm应用程序,这个项目包括了…

安防监控EasyCVR视频汇聚平台使用海康SDK播放出现花屏是什么原因?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、…

【问题处理】WPS提示不能启动此对象的源应用程序如何处理?

哈喽,大家好,我是雷工! 最近在用WPS打开word文件中,插入的Excel附件时,无法打开,提示:“不能启动此对象的源应用程序”。 经过上网查找处理办法,尝试解决,现将解决过程记…

Linux输入设备应用编程(键盘,触摸屏,按键,鼠标)

目录 一 输入设备编程介绍 1.1 什么是输入设备呢? 1.2 什么是输入设备的应用编程? 1.3 input子系统 1.4 数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件: 1.5.2 相对位移事件 1.5.3 绝对位移事件 二 读取 struct input_e…

C++ 之字符串、字符数组与字符指针(*、**)

C 之字符串、字符数组与字符指针(*、**) 最近频繁使用字符串指针,有时候想取值或者复制,常用到问题,在此总结一下字符串的处理、指针的使用长期更新版~ 1. char 使用相关 1.1 内存使用 首先介绍一下C语言中的数据类型: 下图给…