在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.mzph.cn/news/144074.shtml

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

相关文章

Debezium报错处理系列之九十九:ConnectException: Source offset ‘file‘ parameter is missing

Debezium报错处理系列之九十九:ConnectException: Source offset file parameter is missing 一、完整报错二、错误原因三、解决方法研究Debezium技术遇到的各种错误解决方法系列文章传送门: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezium技术遇到的各种错误的…

SpringCloud GateWay自定义过滤器之GatewayFilter和AbstractGatewayFactory

一、GatewayFilter GatewayFilter 是一个简单的接口,用于定义网关过滤器的行为。一个网关过滤器就是一个实现了 GatewayFilter 接口的类,它可以执行在请求进入网关或响应离开网关时的某些操作。过滤器可以用于修改请求或响应,记录日志&#…

【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 map和set 1. 前言2. map和set介绍3. pair结构介…

多租户和单租户权限设计的区别

近些年,随着技术和需求的发展,sass已经成为普遍现象,同时就出现了多租户概念,那么什么是多租户呢? 相较于传统企业的应用,只有一个企业在使用这一个系统,和别的企业无关,每次有一个…

一起学docker系列之二深入理解Docker:基本概念、工作原理与架构

目录 前言1 Docker的基本概念2 Docker的基本组成3 docker工作原理4 docker架构5 Docker详细工作过程结语 前言 在当今的软件开发和部署中,Docker已经成为一种不可或缺的工具。它简化了应用程序的打包、交付和运行,同时提供了强大的隔离性和可移植性。本…

c语言中链栈的基本操作

链栈是一种特殊的链表,其基本操作包括: 初始化:创建一个空的链栈。 判断是否为空:检查链栈中是否有元素。 入栈:在链栈的栈顶添加一个元素。 出栈:删除链栈的栈顶元素,并返回该元素的值。 获…

Java学习笔记(七)——面向对象编程(中级)

一、IDEA (一)常用的快捷键 (二)模版/自定义模版 二、包 (一)包的命名 (二)常用的包 (三)如何引入(导入)包 (四&am…

win10 安装 node.js

要在你的系统上安装 Node.js,你可以按照以下步骤进行: 1. 打开 Node.js 官方网站:https://nodejs.org/ 2. 在首页上,你会看到两个版本的 Node.js 可供下载:LTS 版本和 Current 版本。LTS 版本是长期支持版本&#xff…

每日一题(LeetCode)----数组--长度最小的子数组的相关题(一)

每日一题(LeetCode)----数组–长度最小的子数组的相关题(一) 1.题目(904. 水果成篮) 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的…

「Verilog学习笔记」用优先编码器①实现键盘编码电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 用此编码器实现键盘的编码电路。 注意:编码器的输出是低电平有效,而键盘编码电路输出的是正常的8421BCD码,是高电平有效。因此将编…

ElasticSearch 安装(单机版本)

文章目录 ElasticSearch 安装(单机版本)环境配置下载安装包调整系统参数安装启动并验证 ElasticSearch 安装(单机版本) 此文档演示 ElasticSearch 的单机版本在 CentOS 7 环境下的安装方式以及相关的配置。 环境配置 Linux 主机一…

反向传播详解BP

误差反向传播(Back-propagation, BP)算法的出现是神经网络发展的重大突破,也是现在众多深度学习训练方法的基础。该方法会计算神经网络中损失函数对各参数的梯度,配合优化方法更新参数,降低损失函数。 BP本来只指损失…

OpenAI暂停ChatGPT Plus新用户注册;迷宫与图神经网络

🦉 AI新闻 🚀 OpenAI暂停ChatGPT Plus新用户注册,考虑用户体验 摘要:OpenAI决定暂停ChatGPT Plus新用户注册,以应对开发日后使用量激增带来的压力,确保每个人都能享受良好的体验。根据调查机构Writerbudd…

下载huggingface预训练模型到本地并调用

写在前面 在大模型横行的时代,无法在服务器上连接外网的研究僧真的是太苦逼了,每次想尝试类似于CLIP,BLIP之类的大模型都会得到“requests.exceptions.ConnectionError: (MaxRetryError("HTTPSConnectionPool(host‘huggingface.co’, …

LeetCode-2760. 最长奇偶子数组-滑动窗口暴力

Problem: 2760. 最长奇偶子数组 每日一题。实习第10天记录。 文章目录 思路Code 思路 注意用条件找r。 Code class Solution {public int longestAlternatingSubarray(int[] nums, int threshold) {int len nums.length;int l, r;int res 0;for (l 0; l < len; l) {// 定…

Datawhale智能汽车AI挑战赛

1.赛题解析 赛题地址&#xff1a;https://tianchi.aliyun.com/competition/entrance/532155 任务&#xff1a; 输入&#xff1a;元宇宙仿真平台生成的前视摄像头虚拟视频数据&#xff08;8-10秒左右&#xff09;&#xff1b;输出&#xff1a;对视频中的信息进行综合理解&…

【解决方案】危化品厂区安防系统EasyCVR+AI智能监控

危化品属于危险、易燃易爆、易中毒行类&#xff0c;一旦在生产运输过程中发生泄漏后果不堪想象&#xff0c;所以危化品的生产储存更需要严密、精细的监控&#xff0c;来保障危化品的安全。EasyCVRTSINGSEE青犀AI智能分析网关搭建的危化品智能监控方案就能很好的为危化品监管保驾…

基于STC12C5A60S2系列1T 8051单片机的数模芯片DAC0832实现数模转换应用

基于STC12C5A60S2系列1T 8051单片的数模芯片DAC0832实现数模转换应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍数模芯片DAC0832介绍通过按键调节数模芯片DAC0832…

微信小程序微信用户授权登录怎么在小程序上和钉钉相关联

要在微信小程序上实现微信用户授权登录并与钉钉相关联&#xff0c;你需要执行以下步骤&#xff1a; 钉钉开放平台注册应用&#xff1a;在钉钉开放平台上注册一个应用&#xff0c;获取到相应的AppID和AppSecret。 微信小程序授权登录&#xff1a;在微信小程序中使用wx.login接口…

WPF下实现拖动任意地方都可以拖动窗口

首先在xaml中添加事件 <Window PreviewMouseLeftButtonDown"Window_PreviewMouseLeftButtonDown"PreviewMouseMove"Window_PreviewMouseMove"PreviewMouseLeftButtonUp"Window_PreviewMouseLeftButtonUp"/>然后脚本输入 Point _pressedP…