Python 数据库基类封装

目录

1.BaseEntity

2.t_user

3.DAOBase

4.UserDAO


刚开始用Python做Api后端,记录下学习过程

从数据库操作开始,定义实体,定义DAO层基类,及DAO业务类的使用

写的不好,有好的设计建议欢迎大家提出,一起学习进步

1.BaseEntity

这部分是实体的基类,比较简单,就一个使用类名作为表名的方法


from sqlalchemy import Column, Integer, DateTime, modifier
from sqlalchemy.orm import InstrumentedAttribute, properties
from sqlalchemy.sql import func
from sqlalchemy.ext.declarative import as_declarative, declared_attr



@as_declarative()
class BaseEntity:

    @declared_attr
    def __tablename__(cls) -> str:
        # 如果没有指定__tablename__  则默认使用model类名转换表名字
        return cls.__name__
    

2.t_user

用户数据表,实体定义,数据库操作的数据依据

这部分我也写了一个自动生成Entity的小应用程序,欢迎大家下载使用

https://download.csdn.net/download/rotion135/85124222

from sqlalchemy import Column, Integer, String,Boolean,DateTime,Double,Float
from Modules.db.BaseEntity import BaseEntity

#t_user
class t_user(BaseEntity):
    ID = Column(String(32), primary_key=True,nullable=False, comment="表ID")
    UserCode = Column(String(32), primary_key=False,nullable=False, comment="用户编码")
    UserName = Column(String(128), primary_key=False,nullable=False, comment="用户名称")
    LoginName = Column(String(128), primary_key=False,nullable=False, comment="登录名")
    Password = Column(String(255), primary_key=False,nullable=False, comment="登录密码")
    UserStatus = Column(Integer, primary_key=False,nullable=True, comment="用户状态  默认0:正常,1:禁用 可字典项配置")
    IsDelete = Column(Integer, primary_key=False,nullable=True, comment="删除为1,未删除为0,默认0")
    Nick = Column(String(128), primary_key=False,nullable=True, comment="昵称")
    Title = Column(String(128), primary_key=False,nullable=True, comment="职称")
    Sex = Column(Integer, primary_key=False,nullable=True, comment="性别 0:男;1:女")
    Birthday = Column(String(32), primary_key=False,nullable=True, comment="生日")
    IdentityCard = Column(String(128), primary_key=False,nullable=True, comment="身份证号码")
    Mobile = Column(String(32), primary_key=False,nullable=True, comment="手机号")
    Telephone = Column(String(32), primary_key=False,nullable=True, comment="电话号码")
    QQ = Column(String(32), primary_key=False,nullable=True, comment="QQ号")
    Email = Column(String(128), primary_key=False,nullable=True, comment="邮箱")
    Signature = Column(String(255), primary_key=False,nullable=True, comment="个性签名")
    IsAdmin = Column(Integer, primary_key=False,nullable=True, comment="是否管理员  0-非管理员 1-管理员")
    CreateTime = Column(DateTime, primary_key=False,nullable=True, comment="创建时间")
    CreateUserCode = Column(String(32), primary_key=False,nullable=True, comment="创建人的用户编码")
    ModifyTime = Column(DateTime, primary_key=False,nullable=True, comment="修改时间")
    ModifyUserCode = Column(String(32), primary_key=False,nullable=True, comment="修改人的用户编码,只保存最后一次修改人")
    Remark = Column(String, primary_key=False,nullable=True, comment="备注")
    Token = Column(String(32), primary_key=False,nullable=True, comment="访问令牌")
    TokenExTime = Column(DateTime, primary_key=False,nullable=True, comment="访问令牌过期时间")
    RefreshToken = Column(String(32), primary_key=False,nullable=True, comment="刷新令牌")
    RefreshExTime = Column(DateTime, primary_key=False,nullable=True, comment="刷新令牌过期时间")

    

3.DAOBase

接下来就是设计DAO层的基类

数据链接 我用了Config.py作为配置文件,在下面一个代码块里边

from sqlalchemy import create_engine, Column, Integer, String,Engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,Session
from Modules.SysFrame import Config


class DAOBase():
    def __init__(self,db:Session=None):
        if(db==None):
            self.__InitEngine()
        else :
            self.session=db
        
        

    engine:Engine
    session:Session


    def __InitEngine(self):
        # 创建一个引擎来连接到 MySQL 数据库
        self.engine = create_engine(Config.MySQLConnection)
        # 创建一个会话类
        sm = sessionmaker(autocommit=False, autoflush=False, bind=self.engine)
        self.session = sm()

    

    




cors_allowOrigins="*"
#后台自定义的请求头参数
cors_allowHeaders="Origin,Accept,Accept-Language,Authorization,Content-Type,UserCode,Timestamp,Nonce,Signature"
#请求后台允许的方式
cors_allowMethods="GET, POST, PUT, DELETE, OPTIONS"
#登录限制时间,时间内登录次数超过设置值,则锁定
LoginLimitMinutes=60
#登录限制时间内的登陆错误次数限制
LoginLimitCount=5


#MySQL数据库连接字符串
# 格式为:'数据库类型+数据库驱动名称://用户名:密码@主机地址:端口号/数据库名称'
MySQLConnection="mysql+mysqlconnector://root:123qwe@127.0.0.1:3306/platform"





4.UserDAO

最后,展示用户操作类的视线

BaseResult 是我自己定义的一个结果类,也放在下面代码块了



from datetime import datetime
from sqlalchemy import func,text
from sqlalchemy.orm import sessionmaker
from Modules.Models.BaseResult import BaseResult
from Modules.db.DAOBase import DAOBase
from Modules.db.Entity.t_user import t_user

class UserDAO(DAOBase):
    def __init__(self, db: sessionmaker = None):
        super().__init__(db)

    # 根据用户编码获取用户数据        
    def GetUserByUserCode(self,userCode:str)->t_user:
        sql =  self.session.query(t_user).filter(t_user.UserCode==userCode).first()
        return sql;
        

    # 根据登录名获取用户数据
    def  GetUserByLogin(self,loginName:str)->t_user:
        sql = self.session.query(t_user).filter(t_user.LoginName==loginName).first()
        return sql;


    # 新增前检测 true-正常,可新增 false-已存在相同数据
    def  CheckBeforeInsert(self,userCode:str)->BaseResult:
        row_count = self.session.query(func.count(t_user.ID)).filter(t_user.UserCode==userCode).scalar()
        if(row_count <= 0):
            return BaseResult.Success
        else:
            return BaseResult.Failure

    # 新增用户
    def Insert(self,entity:t_user)->BaseResult:
        self.session.add(entity)
        self.session.commit()
        return BaseResult.Success

    # 更新用户
    def Update(self,entity:t_user,userCode:str)->BaseResult:
        user = self.session.query(t_user).filter(t_user.UserCode == entity.UserCode).first()
        user.UserName = entity.UserName;
        user.Birthday = entity.Birthday;
        user.IdentityCard = entity.IdentityCard;
        user.Email = entity.Email;
        user.Mobile = entity.Mobile;
        user.Nick = entity.Nick;
        user.QQ = entity.QQ;
        user.Sex = entity.Sex;
        user.Signature = entity.Signature;
        user.Telephone = entity.Telephone;
        user.Title = entity.Title;
        user.ModifyTime = datetime.now();
        user.ModifyUserCode = userCode;
        self.session.commit()
        return BaseResult.Success


    # 判断用户是否有此权限
    def JudgeUserPermit(self,type:str, method:str, userCode:str)->BaseResult:
        sql = text(f"select COUNT(1) FROM t_permission  WHERE ResType='{type}' and ResMethod='{method}'  and PermitCode in (SELECT PermitCode FROM t_rolepermission WHERE RoleCode in (SELECT RoleCode FROM t_userrole WHERE UserCode='{userCode}'))");
        result = self.session.execute(sql)
        count = result.fetchone()[0]
        if(count > 0):
            return BaseResult.Success
        else:
            return BaseResult.Failure   

class BaseResult():
    def __init__(self,isSucessed:bool,message:str,mark=0,tag=None,total=0):
        self.IsSucessed=isSucessed
        self.Message=message
        self.Mark=mark
        self.Tag=tag
        self.Total=total



    IsSucessed:bool
    Message:str
    Mark:int
    Tag:any
    Total:int

    @staticmethod
    def Success():
        res=BaseResult(True,"Success")
        return res
    
    @staticmethod
    def Failure():
        res=BaseResult(True,"Failure")
        return res

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FIR滤波器——DSP学习笔记三(包含一个滤波器设计的简明案例)

​​​​​​ 背景知识 FIR滤波器的特性与优点 可精确地实现线性相位响应&#xff08;Linear phase response&#xff09;&#xff0c;无相位失真&#xff1b; 总是稳定的&#xff0c;所有极点都位于原点 线性相位FIR滤波器的性质、类型及零点位置 冲击响应满足&#xff1a;奇…

挺看好的一位实习生,顶峰见!

大家好&#xff0c;我是程序员鱼皮。今天我要分享自己团队里一位全栈实习生的实习总结。 在实习期间&#xff0c;这位同学参与了多个项目的工作&#xff0c;包括企业动态公告系统的开发、企业周边系统的搭建、撰写技术教程、开发 IDEA 插件、构建云端管理平台等等。 实习近 3…

个人学习总结__打开摄像头、播放网络视频的以及ffmpeg推流

前言 最近入手了一款非常便宜的usb摄像头&#xff08;买回来感觉画质很低&#xff0c;没有描述的4k&#xff0c;不过也够用于学习了&#xff09;,想着利用它来开启流媒体相关技术的学习。第一步便是打开摄像头&#xff0c;从而才能够对它进行一系列后续操作&#xff0c;诸如实…

网动统一通信平台存在任意文件读取漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 网动统一通信平台&#xff08;ActiveUC&#xff09…

AEMTO--一种自适应进化多任务优化框架

AEMTO–一种自适应进化多任务优化框架 title&#xff1a; Evolutionary Multitask Optimization With Adaptive Knowledge Transfer author&#xff1a; Hao Xu, A. K. Qin, and Siyu Xia. journal&#xff1a; IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION (TEVC) DOI&…

基于SpringBoot+Vue校园竞赛管理系统的设计与实现

项目介绍&#xff1a; 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;竞赛信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行…

B2B商城系统如何搭建?

相较于单个商家的独立商城&#xff0c;B2B商城系统凭借诸多优势成为电商领域中最受关注的一种模式。目前在政府、金融、汽车、跨境等行业领域都有广泛应用。那么&#xff0c;B2B商城系统如何搭建呢&#xff1f;我们从开发语言、功能模块、优势来进行分析。 一、B2B商城系统开发…

对抗攻击新手实战

实战核心思想&#xff1a; 训练x(输入&#xff09;&#xff0c;让第一次训练好的&#xff0c;正确的y去和我们想要误导机器去识别的类别的那个y做一个损失函数【loss torch.mean(y[:, 248])】&#xff0c;不同的是&#xff0c;我们其实希望是一个梯度上升&#xff0c;给图片加…

31 OpenCV 距离变换和分水岭算法

文章目录 距离变换分水岭算法distanceTransform 距离变换watershed 分水岭算法示例 距离变换 分水岭算法 distanceTransform 距离变换 void cv::distanceTransform (InputArray src,OutputArray dst,int distanceType,int maskSize,int dstType CV_32F) src:输入图像&#xf…

一篇关于Cookie的基础知识

目录 一、现有问题 二、简介 三、Cookie原理 四、Cookie应用 4.1 创建并向客户端发送Cookie 4.2 从客户端读取Cookie 4.3 Cookie的生命周期 4.4 Cookie的编码和解码 4.5 优缺点 五、记录上次登录的时间&#xff08;案例&#xff09; 六、Cookie 获取范围有多大&…

Python —— 模块、包

一、模块和包 1. 模块module 模块是 Python 程序架构的一个核心概念。Python中模块就是一个.py文件&#xff0c;模块中可以定义函数&#xff0c;变量&#xff0c;类。模块可以被其他模块引用 1.1. 创建模块文件 创建文件&#xff1a;utils.py # 定义变量 name 张三# 定义函…

Qt绘图与图形视图之场景、视图架构的简单介绍

往期回顾 Qt绘图与图形视图之绘图技术知识点的简单介绍-CSDN博客 Qt绘图与图形视图之常见图形、路径、文字、图片的绘制介绍-CSDN博客 Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍-CSDN博客 Qt绘图与图形视图之场景、视图架构的简单介绍 一、GraphicsView 1、存…

项目部署总结

1、安装jdk 第一步&#xff1a;上传jdk压缩安装包到服务器 第二步&#xff1a;将压缩安装包解压 tar -xvf jdk-8uXXX-linux-x64.tar.gz 第三步&#xff1a;配置环境变量 编辑/etc/profile文件&#xff0c;在文件末尾添加以下内容&#xff1a; export JAVA_HOME/path/to/j…

12:HAL----I2C

目录 一:I2C通信协议 1:I2C简历 2:硬件电路 3:I2C时序基本单元 A : 开/ 终条件 2:发送一个字节 3:接收一个字节 4:应答机制 4:I2C时序 1:指定地址写 2:当前地址读 3: 指定地址读 二&#xff1a;HAL库 A&#xff1a;轮询方式 B:中断方式 三:案例 A:轮询方式-…

代码随想录算法训练营第12天:滑动窗口和前缀和

代码随想录算法训练营第12天&#xff1a;滑动窗口和前缀和 这里我参考了西法的博客&#xff0c; 467. 环绕字符串中唯一的子字符串(中等)795. 区间子数组个数(中等)904. 水果成篮(中等)992. K 个不同整数的子数组&#xff08;困难&#xff09;1109. 航班预订统计(中等) 前四…

第G9周:ACGAN理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 由于ACGAN的原理在上一篇文章中已经很详细的解释过了&#xff0c;这次我们直接上代码 一、代码解读 import argparse import os import numpy as npimport t…

视频批量下载工具

1、功能演示 该工具实现了某个人主页视频批量下载&#xff0c;最多支持一次下载50个视频&#xff0c;这50个选取的是最新发布的50个视频&#xff0c;视频为高清的1080p&#xff0c;并直接将视频保存到本地。 2、软件使用介绍 2.1 解压 拿到工具软件后&#xff0c;首先是对软件…

什么是外汇爆仓?怎样避免?

外汇爆仓是指当交易者的保证金低于特定比例时&#xff0c;经纪商会自动平仓一个或所有的开仓头寸。避免外汇爆仓的关键在于合理配置资金、设置止损、适度交易、顺势而为以及调整心态。 外汇爆仓是外汇交易中的一种风险控制机制。当交易者的账户净值低于已用保证金的特定比例时&…

AI图书推荐:《企业AI转型:如何在企业中部署ChatGPT?》

Jay R. Enterprise AI in the Cloud. A Practical Guide...ChatGPT Solutions &#xff08;《企业AI转型&#xff1a;如何在企业中部署ChatGPT&#xff1f;》&#xff09;是一本由Rabi Jay撰写、于2024年由John Wiley & Sons出版的书籍&#xff0c;主要为企业提供实施AI转型…

【网络安全】00后程序员,找 Bug 赚了 6,700,000元!他是怎么做到的?

1. 漏洞赏金计划&#xff08;Bug Bounty Programs&#xff09; 2. 安全咨询服务 3. 安全培训和教育 4. 写作和发表研究 5. 参与安全竞赛&#xff08;CTFs&#xff09; 6. 开发和销售安全工具 在网络安全领域&#xff0c;通过合法的方式利用漏洞赚钱主要涉及以下几种方法。…
最新文章