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_attrdef __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 Configclass DAOBase():def __init__(self,db:Session=None):if(db==None):self.__InitEngine()else :self.session=dbengine:Enginesession:Sessiondef __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_userclass 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.Successelse: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.Successelse:return BaseResult.Failure   

class BaseResult():def __init__(self,isSucessed:bool,message:str,mark=0,tag=None,total=0):self.IsSucessed=isSucessedself.Message=messageself.Mark=markself.Tag=tagself.Total=totalIsSucessed:boolMessage:strMark:intTag:anyTotal:int@staticmethoddef Success():res=BaseResult(True,"Success")return res@staticmethoddef Failure():res=BaseResult(True,"Failure")return res

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 使用相对路径读取文件失败

python open一个问及那时使用绝对路径可以&#xff0c;但是使用相对路径时报错&#xff0c;找不到指定文件 解决步骤如下&#xff1a; 添加Python配置 在新增的配置Json文件添加下图红框这一行

知网怎么查重 知网查重的详细步骤

知网查重八个步骤&#xff1a;1. 访问官网&#xff0c;注册账号。2. 上传待查文档。3. 选择查重规则。4. 选择相似来源库。5. 提交查重任务。6. 等待查重结果。7. 获取查重报告。8. 下载查重报告。 知网查重的详细步骤 第一步&#xff1a;进入知网查重系统 打开浏览器&#x…

27.统一网关Gateway-路由断言工厂

在配置文件中写的断言规则只是字符串&#xff0c;这些字符串会被Predicate Factory读取并处理&#xff0c;转变为路由判断的条件。 例如&#xff1a;Path /user/** 是按照路劲匹配&#xff0c;这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRouteP…

目标检测——3D玩具数据集

在数字化时代&#xff0c;计算机视觉技术取得了长足的进展&#xff0c;其中基于形状的3D物体识别技术更是引起了广泛关注。该技术不仅有助于提升计算机对现实世界物体的感知能力&#xff0c;还在多个领域展现出了广阔的应用前景。本文将探讨基于形状的3D物体识别实验的重要性意…

ACE框架学习3

ACE Acceptor-Connector框架 该框架实现 Acceptor-Connector 模式&#xff0c;该模式解除了“网络化应用中的协作对端服务的连接和初始化”与“连接和初始化之后它们所执行的处理”的耦合。Acceptor-Connector 框架允许成用独立于它们所提供的服务来配置其连接布局的关键属性。…

从阿里云迁移Redis到AWS的规划和前期准备

在将Redis实例从阿里云迁移到AWS之前,需要进行全面的规划和前期准备。以下九河云提供一些重要的步骤和注意事项: 1. 评估Redis使用情况 首先,您需要评估当前Redis实例的使用情况,包括实例规格、内存使用量、吞吐量、访问模式等。这将有助于选择合适的AWS Redis产品和实例类型…

一键设置jdk环境脚本

自动化脚本 一、使用方法 创建一个txt文本&#xff0c;放在和jdk存放的同一目录下&#xff0c;复制粘贴进我的代码&#xff0c;利用全局替换&#xff0c;将jdk1.8,改成你自己的jdk包名字&#xff0c;再重新把这个文件保存为.vbs文件。然后运行就行了 MsgBox "Runing s…

【C语言】编译与链接

1.翻译环境与运行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 1.翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令&#xff08;二进制指令&#xff09; 2.执行环境&#xff0c;它用于实际执行代码 2.翻译环境 那么翻译环境是怎么将源代码…

Windows系统中下Oracle 19C数据库超级详细安装、设置教程(自己电脑上安装Oracle学习,保姆级教学,亲测有效)

Oracle 官方提供了一个基于 Java 技术的图形界面安装工具&#xff1a;Oracle Universal Installer&#xff08;Oracle 通用安装器&#xff09;简称 OUI&#xff0c;利用它可以完成在不同操作系统平台上&#xff08;Windows、Linux、UNIX&#xff09;的、不同类型的、不同版本的…

历时三年,花了200万,小米换的新标值这个价吗?

原创 航通社 航通社 收录于话题#小米1#小米新logo1#营销1 以及为什么要搞一套“设计哲学” 航通社首发原创文章&#xff0c;未经授权禁止转载 微博&#xff1a;航通社 | 微信搜一搜&#xff1a;2021年 第12期 文 / 书航 2021.3.31 小米集团宣布了 10 年来的首次标识&#x…

uni-app canvas 签名

调用方法 import Signature from "/components/signature.vue" const base64Img ref() //监听getSignImg uni.$on(getSignImg, ({ base64, path }) > {base64Img.value base64//console.log(签名base64, path >, base64, path) //拿到的图片数据// 之后取消…

Levenberg-Marquardt (LM) 算法进行非线性拟合

目录 1. LM算法2. 调包实现3. LM算法实现4. 源码地址 1. LM算法 LM算法是一种非线性最小二乘优化算法&#xff0c;用于求解非线性最小化问题。LM主要用于解决具有误差函数的非线性最小二乘问题&#xff0c;其中误差函数是参数的非线性函数&#xff0c;需要通过调整参数使误差函…

Vue Canvas图片水印的绘制 图片加水印

效果 定义画布 <canvas width"800" height"800" ref"cn" ></canvas>绘制水印 draw(){const img new Image()img.srchttps://img1.baidu.com/it/u3035183739,1826404114&fm253&fmtauto&app138&fJPEGimg.onload(()…

pyqt 动态更换表头和数据

目录 pyqt 动态更换表头和数据代码 效果图&#xff1a; pyqt 动态更换表头和数据代码 from PyQt5.QtGui import QColor, QBrush from PyQt5.QtWidgets import QApplication, QTableWidget, QVBoxLayout, QWidget, QPushButton, QTableWidgetItemclass Example(QWidget):def _…

Redis底层数据结构之ZSkipList

目录 一、概述二、ZSkipList结构三、和平衡树和哈希表的对比 redis底层数据结构已完结&#x1f44f;&#x1f44f;&#x1f44f;&#xff1a; ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️redis…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day22

Day 22 Transformer seqence to seqence 有什么用呢&#xff1f; Encoder how Block work 仔细讲讲Residual 的过程&#xff1f; 重构 Decoder - AutoRegressive Mask 由于是文字接龙&#xff0c;所以无法考虑右边的 info 另一种decoder Encoder to Decoder – Cross Attend…

llama3本地部署

目录 II.下载 II.验证ollama安装 II.安装llama3 和启动 II.命令行调用 II.api调用 II.参考文献 II.下载 https://ollama.com/download/windows OllamaSetup.exe https://github.com/meta-llama/llama3 II.验证ollama安装 cmd ollama II.安装llama3 和启动 ollama run …

【问题分析】TaskDisplayArea被隐藏导致的黑屏以及无焦点窗口问题【Android 14】

1 问题描述 用户操作出的偶现的黑屏以及无焦点窗口问题。 直接原因是&#xff0c;TaskDisplayArea被添加了eLayerHidden标志位&#xff0c;导致所有App的窗口不可见&#xff0c;从而出现黑屏和无焦点窗口问题&#xff0c;相关log为&#xff1a; 这个log是MTK添加的&#xff0…

Django模型继承之多表继承

在Django模型继承中&#xff0c;支持的第二种模型继承方式是层次结构中的每个模型都是一个单独的模型。每个模型都指向分离的数据表&#xff0c;并且可以被独立查询和创建。在继承关系中&#xff0c;子类和父类之间通过一个自动创建的OneToOneField进行连接。示例代码如下&…

C语言入门课程学习笔记-6

C语言入门课程学习笔记-6 第27课 - 字符数组与字符串&#xff08;上&#xff09;第28课 - 字符数组与字符串&#xff08;下&#xff09;第29课 - 数组专题练习&#xff08;上&#xff09;第30课 - 数组专题练习&#xff08;下&#xff09; 本文学习自狄泰软件学院 唐佐林老师的…