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

相关文章

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. 构造函数和析构函数三、顺序表

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(