sqlachemy+sqlite进一步封装

2024-05-12 23:18

本文主要是介绍sqlachemy+sqlite进一步封装,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

api.py //封装数据库操作   增删改查


from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import exc
from sqlalchemy import create_engine
from contextlib import contextmanager
import logging
import datetimeLOG = logging.getLogger()@contextmanager
def session_begin(session):try:yield sessionsession.commit()except:session.rollback()raisefinally:session.close()def _update_values(ref, values):for k in values:setattr(ref, k, values[k])def get_session():engine = create_engine('sqlite:///test.db?check_same_thread=False', echo=False)Session = sessionmaker(bind=engine)Session = scoped_session(Session)session = Session()session.execute("PRAGMA foreign_keys=ON") //解决sqlite需要设置外键启用return sessionclass TableOperator(object):def __init__(self, table_class):self.table_class = table_classdef _get(self, ref_id, session=None, force_show_deleted=False):session = session or get_session()query = session.query(self.table_class).filter_by(id=ref_id)if not force_show_deleted:query = query.filter_by(deleted=False)table_ref = query.first()if not table_ref:msg = "No table record found with ID %s" % ref_idLOG.error(msg)raise exc.NoResultFoundreturn table_refdef add(self, values):session = get_session()with session_begin(session) as session:table_ref = self.table_class()_update_values(table_ref, values)session.add(table_ref)def add_all(self, values_list):session = get_session()with session_begin(session) as session:data_list = []for values in values_list:table_ref = self.table_class()_update_values(table_ref, values)data_list.append(table_ref)session.add_all(data_list)def get(self, filters=None, force_show_deleted=False):filters = filters or {}session = get_session()query = session.query(self.table_class).filter_by(**filters)if not force_show_deleted:query = query.filter_by(deleted=False)table_records = []for table_ref in query.all():table_records.append(table_ref)return table_recordsdef destroy(self, ref_id, delete=False):session = get_session()table_ref = self._get(ref_id, session=session)with session_begin(session) as session:if not delete:table_ref.deleted = Truetable_ref.deleted_at = datetime.datetime.utcnow()else:session.delete(table_ref)return table_refdef delete_all(self, filters=None, delete=False):session = get_session()filters = filters or {}with session_begin(session) as session:if not delete:values = {"deleted": True,"deleted_at": datetime.datetime.utcnow()}query = session.query(self.table_class).filter_by(**filters). \filter_by(deleted=False)query.update(values, synchronize_session='fetch')else:session.query(self.table_class).filter_by(**filters). \filter_by(deleted=False).delete()def update(self, ref_id, values):if not ref_id or not values:msg = "ref_id/values can not be empty"LOG.error(msg)raise Exception(msg)values['updated_at'] = datetime.datetime.utcnow()session = get_session()with session_begin(session) as session:query = session.query(self.table_class).filter_by(id=ref_id).filter_by(deleted=False)table_ref = query.first()if not table_ref:msg = "No table record found with ID %s" % ref_idLOG.error(msg)raise Exception(msg)updated = query.update(values, synchronize_session='fetch')if not updated:msg = ('update table object %(ref_id)s failed' %{'ref_id': ref_id})LOG.error(msg)raise Exception(msg)return table_ref.iddef update_all(self, values, filters=None):session = get_session()filters = filters or {}values["updated_at"] = datetime.datetime.utcnow()with session_begin(session) as session:query = session.query(self.table_class).filter_by(**filters)\.filter_by(deleted=False)query.update(values, synchronize_session="fetch")

models.py  //定义表

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Boolean, String
from sqlalchemy import create_engine
from sqlalchemy import DateTime
from sqlalchemy import Integer
from sqlalchemy import Text
from sqlalchemy import ForeignKey
from sqlalchemy.types import TypeDecorator
from sqlalchemy.orm import relationship
import json
import ast
import uuid
import datetimeengine = create_engine('sqlite:///test.db?check_same_thread=False', echo=False)
Base = declarative_base()class JSONEncodedDict(TypeDecorator):"""Represents an immutable structure as a json-encoded string"""impl = Textdef process_bind_param(self, value, dialect):if value is not None:value = json.dumps(value)return valuedef process_result_value(self, value, dialect):if value is not None:value = json.loads(value)return valueclass TextEncodedList(TypeDecorator):"""Represents an immutable structure as a list-encoded string"""impl = String(256)def process_bind_param(self, value, dialect):if not value:value = []return str(value)def process_result_value(self, value, dialect):if value is not None:value = ast.literal_eval(value)return valueclass DBBase(object):id = Column(String(36), primary_key=True,default=lambda: str(uuid.uuid4()))created_at = Column(DateTime,default=lambda: datetime.datetime.utcnow(),nullable=False)updated_at = Column(DateTime,default=lambda: datetime.datetime.utcnow(),nullable=True,onupdate=lambda: datetime.datetime.utcnow())deleted_at = Column(DateTime)deleted = Column(Boolean, nullable=False, default=False)class Tasks(Base, DBBase):__tablename__ = 'tasks'name = Column(String(20), nullable=False)status = Column(String(20), nullable=False, default="init")description = Column(String(256), nullable=True, default="")message = Column(Text(), default="", comment="error message")class CurTask(Base, DBBase):__tablename__ = 'cur_task'name = Column(String(20), nullable=False)current_task = Column(String(36), ForeignKey('tasks.id'),nullable=False)task_to_do = Column(TextEncodedList(), nullable=False)task = relationship('Tasks', backref='cur_task')Base.metadata.create_all(engine, checkfirst=True)

这个时候操作表就变得简单了

import models
import apiapi.TableOperator(models.Tasks).add({"name": "study"})

 

这篇关于sqlachemy+sqlite进一步封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/984013

相关文章

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表