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

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()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux 复现Docker NAT网络
  • 如何在 CentOS 上配置本地 YUM 源
  • 2024软件测试面试题汇总【备战金九银十】内容较长建议收藏
  • mybatilsplaus 常用注解
  • 本地部署,去除动漫图像背景Anime Remove Background
  • Blinn-Phong优化phong模型的数学依据
  • 前端的页面代码
  • 代码随想录算法训练营:26/60
  • 通义千问Qwen-VL-Chat大模型本地训练(二)
  • Spring Boot 实现统一异常处理:构建健壮的应用
  • 恢复出厂设置手机变成砖
  • 网关、DHCP协议、ip地址、子网掩码简单介绍
  • 【AutoencoderKL】基于stable-diffusion-v1.4的vae对图像重构
  • 无障碍快捷方式图标
  • centos7安装jenkins
  • 自己简单写的 事件订阅机制
  • const let
  • es6(二):字符串的扩展
  • linux安装openssl、swoole等扩展的具体步骤
  • NSTimer学习笔记
  • pdf文件如何在线转换为jpg图片
  • Python进阶细节
  • spark本地环境的搭建到运行第一个spark程序
  • springboot_database项目介绍
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vuex 学习笔记 01
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 免费小说阅读小程序
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • Prometheus VS InfluxDB
  • 如何正确理解,内页权重高于首页?
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #pragma once与条件编译
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $().each和$.each的区别
  • (7)svelte 教程: Props(属性)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (第27天)Oracle 数据泵转换分区表
  • (篇九)MySQL常用内置函数
  • (四)库存超卖案例实战——优化redis分布式锁
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net Core 中间件与过滤器
  • .NET Remoting学习笔记(三)信道
  • .net 发送邮件
  • .net 获取url的方法
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET6实现破解Modbus poll点表配置文件
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken