SQLite3封装类教程

SQLite3封装类教程

SQLite是一种轻量级的数据库,它不需要一个独立的服务器进程。SQLite数据库存储在一个单一的磁盘文件中,这使得它非常适合小型到中型的应用程序,例如移动应用、桌面应用和小型的Web应用。以下是使用Python封装SQLite3数据库操作的一个简单教程。

1. 环境准备

首先,确保你的Python环境中已经安装了sqlite3模块。sqlite3模块是Python的标准库的一部分,因此通常不需要额外安装。

2. 理解SQLite3模块

sqlite3模块提供了一个轻量级的磁盘基的数据库,不需要配置,不需要运行时的进程。它支持SQL语句,可以执行CRUD(创建、读取、更新、删除)操作。

3. 创建SQLiteDB封装类

在Python中,我们可以通过定义一个类来封装对SQLite数据库的操作。这不仅使得代码更加模块化,而且提高了代码的可重用性。以下是一个简单的SQLiteDB类示例:

import sqlite3
from collections import namedtuple
from math import ceilclass SQLiteDB:def __init__(self, db_file):"""初始化SQLite数据库连接和游标:param db_file: 数据库文件路径"""self.conn = sqlite3.connect(db_file)self.cursor = self.conn.cursor()# 这里可以添加更多的方法来执行SQL操作,例如创建表、插入数据、查询数据等。

4. 使用SQLiteDB类

创建了SQLiteDB类后,你可以在你的应用程序中使用这个类来执行数据库操作。以下是一个使用示例:

if __name__ == '__main__':db = SQLiteDB('example.db')# 接下来可以调用db对象的方法来执行数据库操作# 例如,创建一个表:db.cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER)''')db.conn.commit()# 插入数据:db.cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 30))db.conn.commit()# 查询数据:for user in db.cursor.execute('SELECT * FROM users'):print(user)# 不要忘记在最后关闭数据库连接db.conn.close()

5. 扩展SQLiteDB类

随着应用程序的发展,你可能需要添加更多的功能到SQLiteDB类中。例如,你可以添加方法来处理事务、执行复杂的查询、或者实现自动的数据库迁移。

6. 错误处理

在实际的应用程序中,处理数据库操作时的错误是非常重要的。你应该在SQLiteDB类中添加适当的异常处理逻辑,以确保应用程序的健壮性。

7. 性能优化

对于更复杂的应用程序,你可能需要考虑数据库操作的性能。这可能包括使用索引、优化查询语句、或者使用批处理来减少数据库的I/O操作。

结语

通过封装SQLite3操作,你可以创建一个强大且灵活的数据库交互层,这将有助于简化你的应用程序的数据库逻辑,并提高代码的可维护性。希望这篇教程能帮助你开始使用Python和SQLite3来构建你的应用程序。

完整代码

import sqlite3
from collections import namedtuple
from math import ceilclass SQLiteDB:def __init__(self, db_file):"""初始化SQLite数据库连接和游标:param db_file: 数据库文件路径"""self.conn = sqlite3.connect(db_file)self.cursor = self.conn.cursor()def create_table(self, table_name, columns):"""创建表格:param table_name: 表格名称:param columns: 列定义,格式为 "列名1 数据类型1, 列名2 数据类型2, ...""""self.cursor.execute(f'''CREATE TABLE IF NOT EXISTS {table_name} ({columns})''')self.conn.commit()def insert(self, table_name, data):"""插入数据:param table_name: 表格名称:param data: 要插入的数据,格式为 {"列名1": 值1, "列名2": 值2, ...}:return: 插入的数据的所有行"""columns = ', '.join(data.keys())placeholders = ', '.join(['?'] * len(data))values = tuple(data.values())self.cursor.execute(f'''INSERT INTO {table_name} ({columns}) VALUES ({placeholders})''', values)self.conn.commit()return self.cursor.fetchall()def update(self, table_name, data, condition):"""更新数据:param table_name: 表格名称:param data: 要更新的数据,格式为 {"列名1": 值1, "列名2": 值2, ...}:param condition: 更新条件"""columns = ', '.join([f'{column}=?' for column in data.keys()])values = tuple(data.values())self.cursor.execute(f'''UPDATE {table_name} SET {columns} WHERE {condition}''', values)self.conn.commit()def delete(self, table_name, condition):"""删除数据:param table_name: 表格名称:param condition: 删除条件"""self.cursor.execute(f'''DELETE FROM {table_name} WHERE {condition}''')self.conn.commit()def query_all(self, table_name):"""查询表格中的所有数据:param table_name: 表格名称:return: 所有数据的所有行"""self.cursor.execute(f'''SELECT * FROM {table_name}''')return self.cursor.fetchall()def query_page(self, table_name, page_size, page_number, condition=None):"""分页查询表格中的数据:param table_name: 表格名称:param page_size: 每页数据数量:param page_number: 页码:param condition: 查询条件 ”age > 10“:return: 分页数据的所有行、总数和总页数"""if condition:query = f'''SELECT * FROM {table_name}WHERE {condition}LIMIT {page_size} OFFSET {page_size * (page_number - 1)}'''else:query = f'''SELECT * FROM {table_name}LIMIT {page_size} OFFSET {page_size * (page_number - 1)}'''self.cursor.execute(query)results = self.cursor.fetchall()column_names = [desc[0] for desc in self.cursor.description]Row = namedtuple('Row', column_names)rows = [Row(*row) for row in results]# 查询总数count_query = f'SELECT COUNT(*) FROM {table_name}'if condition:count_query += f' WHERE {condition}'self.cursor.execute(count_query)total_count = self.cursor.fetchone()[0]# 计算总页数total_pages = ceil(total_count / page_size)return rows, total_count, total_pagesdef execute_sql(self, sql, params=None):"""执行自定义的SQL语句:param sql: SQL语句:param params: SQL语句中的参数,可选:return: 执行结果的所有行"""if params is None:self.cursor.execute(sql)else:self.cursor.execute(sql, params)# self.conn.commit()return self.cursor.fetchall()def query_join(self, table1_name, table2_name, on_condition):"""执行表格的连接查询:param table1_name: 第一个表格名称:param table2_name: 第二个表格名称:param on_condition: 连接条件:return: 连接查询结果的所有行"""self.cursor.execute(f'''SELECT * FROM {table1_name} INNER JOIN {table2_name} ON {on_condition}''')return self.cursor.fetchall()def close(self):"""关闭数据库连接"""self.conn.close()# 使用示例:
if __name__ == '__main__':db = SQLiteDB('example.db')# 创建表格db.create_table('students', 'id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER, gender TEXT')db.create_table('courses', 'id INTEGER PRIMARY KEY, name TEXT NOT NULL, teacher TEXT')# 插入数据db.insert('students', {'name': 'Alice', 'age': 20, 'gender': 'Female'})db.insert('students', {'name': 'Bob', 'age': 22, 'gender': 'Male'})db.insert('courses', {'name': 'Math', 'teacher': 'Mr. Smith'})db.insert('courses', {'name': 'English', 'teacher': 'Ms. Johnson'})# 查询所有数据print('All Students:')print(db.query_all('students'))# 两表联查print('Join Students and Courses:')print(db.query_join('students', 'courses', 'students.id = courses.id'))# 分页查询rows, total_count, total_pages = db.query_page('users', 10, 1)for row in rows:print(row.name, row.age, row.email)print(total_count)print(total_pages)# 修改数据db.update('students', {'age': 21}, 'name = "Alice"')# 新增数据db.insert('students', {'name': 'Charlie', 'age': 19, 'gender': 'Male'})# 删除数据db.delete('students', 'name = "Bob"')# 自定义SQL执行db.execute_sql('DELETE FROM students WHERE name = "Charlie"')db.close()

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

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

相关文章

Git学习1_Git安装(CSDN_20240714)

git下载 git下载官网如下: Git - Downloads (git-scm.com)https://git-scm.com/downloads 根据机器操作系统,下载对应的安装包 git安装 1. 点击安装程序,进入安装界面,如下图所示,点击next。 2. 选择安装路径&…

护网HW面试常问——组件中间件框架漏洞(包含流量特征)

apache&iis&nginx中间件解析漏洞 参考我之前的文章:护网HW面试—apache&iis&nginx中间件解析漏洞篇-CSDN博客 log4j2 漏洞原理: 该漏洞主要是由于日志在打印时当遇到${后,以:号作为分割,将表达式内容分割成两部…

Leetcode(经典题)day2

H指数 274. H 指数 - 力扣(LeetCode) 先对数组排序,然后从大的一头开始遍历,只要数组当前的数比现在的h指数大就给h指数1,直到数组当前的数比现在的h指数小的时候结束,这时h的值就是要返回的结果。 排序…

下载安装nodejs npm jarn笔记

下载安装nodejs npm jarn笔记 下载 Node.js安装Node.js修改node全局路径安装yarn 下载 Node.js 下载Node.js 安装Node.js 双击下载的下来的.msi文件运行并安装一直点next。安装路径可以是默认也可自定义。安装完成后Node.js和npm就安装完成了 命令行输入: nod…

LeetCode 面试题02.04.分割链表

LeetCode 面试题02.04.分割链表 C写法 思路🤔: ​ 将x分为两段,一段放小于x的值,另一段放大于x的值。开辟四个指针lesshead、lesstail、greaterhead、greatertail,head为哨兵位,防止链表为空时情况过于复杂…

推荐一款 uniapp Vaptcha 手势验证码插件

插件地址:VAPTCHA手势验证码 - DCloud 插件市场 具体使用方式可访问插件地址自行查阅

Vue从零到实战

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

WEB前端03-CSS3基础

CSS3基础 1.CSS基本概念 CSS是Cascading Style Sheets(层叠样式表)的缩写,它是一种对Web文档添加样式的简单机制,是一种表现HTML或XML等文件外观样式的计算机语言,是一种网页排版和布局设计的技术。 CSS的特点 纯C…

R语言安装devtools包失败过程总结

R语言安装devtools包时,遇到usethis包总是安装失败,现总结如下方法,亲测可有效 一、usethis包及cli包安装问题 首先,Install.packages("usethis")出现如下错误,定位到是这个cli包出现问题 载入需要的程辑包…

永磁同步电机控制算法--基于 SVM 的无磁链环 DTC

永磁同步电机无磁链环 DTC 通过控制定子磁链交轴分量来直接控制转矩,不再要求控制磁链幅值恒定,省去了传统 DTC 中的磁链环,不仅转矩响应更快,有效抑制了转矩脉动,而且提高了电机功率因数。但无磁链环 DTC 方案仍采用传…

YOWOv2(yowov2)动作识别+Fastreid身份识别 详细安装与实现

首先yowov2是一款简单且实时的时空动作检测方案,fastreid是行人重识别(身份识别) yowov2介绍链接直达fastreid链接直达为时空动作检测任务设计实时框架仍然是一个挑战。YOWOv2 提出了一种新颖的实时动作检测框架,利用三维骨干和二…

【Js】导出 HTML 为 Word 文档

在 Web 开发中,有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档,以便更方便地分享和打印。 html样式 word文档 工具准备 1、 html-docx-js - npm html-docx-js是一个 JavaScript 库,用于将 HTML 内容转换为 Word 文档的格式。它…

在Linux系统实现瑞芯微RK3588部署rknntoolkit2进行模型转换

一、首先要先安装一个虚拟的环境 安装Miniconda包 Miniconda的官网链接:Minidonda官网 下载好放在要操作的linux系统,我用的是远程服务器的linux系统,我放在whl这个文件夹里面,这个文件夹是我自己创建的 运行安装 安装的操作都是yes就可以了 检查是否安装成功,输入下面…

【CEEMDAN-VMD-CNN-LSTM】双重分解+卷积神经网络+长短期记忆神经网络多变量回归预测,多变量输入模型

双重分解(Dual Decomposition)、卷积神经网络(Convolutional Neural Network,CNN)和长短期记忆神经网络(Long Short-Term Memory,LSTM)结合的多变量回归预测需要详细的实现和数据情况…

【香菇带你学Linux】Linux环境下gcc编译安装【建议收藏】

文章目录 0. 前言1. 安装前准备工作1.1 创建weihu用户1.2 安装依赖包1.2.1 安装 GMP1.2.2 安装MPFR1.2.3 安装MPC 2. gcc10.0.1版本安装3. 报错解决3. 1. wget下载报错 4. 参考文档 0. 前言 gcc(GNU Compiler Collection)是GNU项目的一部分,…

埋点系统如何统计用户的平均停留时长?

Hello,大家好,欢迎使用Webfunny前端监控和埋点系统。 今天,我们将介绍webfunny的埋点系统如何统计用户的平均停留时长 一、页面beforeLeave事件 当你页面离开的时候,会触发一个心跳检测,但是这个可能不是100%触发&am…

各向异性含水层中地下水三维流基本微分方程的推导(二)

各向异性含水层中地下水三维流基本微分方程的推导 参考文献: [1] 刘欣怡,付小莉.论连续性方程的推导及几种形式转换的方法[J].力学与实践,2023,45(02):469-474. 书接上回: 我们能得到三个方向的流入流出平衡方程: ∂ ρ u x ∂ x d x d y d…

Linux 下 redis 集群部署

目录 1. redis下载 2. 环境准备 3. redis部署 3.1 修改系统配置文件 3.2 开放端口 3.3 安装 redis 3.4 验证 本文将以三台服务器为例,介绍在 linux 系统下redis的部署方式。 1. redis下载 下载地址:Index of /releases/ 选择需要的介质下载&am…

【常见开发问题】阿里云无法登录的问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Python 项目】类鸟群:仿真鸟群

类鸟群:仿真鸟群 仔细观察一群鸟或一群鱼,你会发现,虽然群体由个体生物组成,但该群体作为一个整体似乎有它自己的生命。鸟群中的鸟在移动、飞越和绕过障碍物时,彼此之间相互定位。受到打扰或惊吓时会破坏编队&#xf…