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

相关文章

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(

Java封装构造方法

private/public的分装 被public修饰的成员变量或者是成员方法,可以被类的调用对象直接使用 而private修饰的成员变量和方法,不能被类的调用对象使用 例如: 可以看到我们是不能在main方法中直接调用被private修饰的变量 当然我们可以在我们定义的TestMode类中可以定一个方法show,然后在调用show方法实现 这里我们可以清楚了解 private 不光可以修

C++数据结构重要知识点(5)(哈希表、unordered_map和unordered_set封装)

1.哈希思想和哈希表 (1)哈希思想和哈希表的区别 哈希(散列、hash)是一种映射思想,本质上是值和值建立映射关系,key-value就使用了这种思想。哈希表(散列表,数据结构),主要功能是值和存储位置建立映射关系,它通过key-value模型中的key来定位数组的下标,将value存进该位置。 哈希思想和哈希表数据结构这两个概念要分清,哈希是哈希表的核心思想。 (2)unordered

OOP三个基本特征:封装、继承、多态

OOP三个基本特征:封装、继承、多态 C++编程之—面向对象的三个基本特征 默认分类 2008-06-28 21:17:04 阅读12 评论1字号:大中小     面向对象的三个基本特征是:封装、继承、多态。     封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。   封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信

Android 优雅封装Glide

文章目录 Android 优雅封装Glide核心思想定义策略接口定义图片选项实现Glide策略图片管理类使用 Android 优雅封装Glide 核心思想 使用策略模式实现不同图片加载框架的切换,使用建造者设计模式处理不同参数,最后通过 ImageLoader 进行管理。 定义策略接口 interface ILoaderStrategy {fun loadImage(co

JS 封装方式

引言:本人是后台服务端开发的,前端的 js 都是在 html 中的 script 标签中写的,处理下数据啥,如果要有需要公共使用的方法啥的都是把方法直接丢在一个 js 文件里,然后 html 引入使用,没有关注过 js 的封装。这天突然对 js 的封装有了兴趣所以有了本文,一下是本人的一些见解。不深见谅。 素材使用的是若依框架中的 ry-ui.js 以及 vue.js ,这里只说封装,不说功能。