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…

一篇文章让你搞懂联邦学习算法

联邦学习(Federated Learning)是一种分布式机器学习技术,它可以在不共享数据的情况下训练模型。这种技术在多个参与方之间协作构建共享的预测模型,同时保持每个参与方的数据本地化,不暴露给其他方。联邦学习特别适用于数据隐私敏感的场景,如医疗、金融和移动设备等。 定…

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

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

Python爬取网易云平台

爬取网易云音乐平台的数据可能涉及到版权、隐私和平台的使用条款等问题&#xff0c;所以在你开始爬取之前&#xff0c;请确保你了解并遵守网易云音乐的使用条款和相关的法律法规。 如果你是为了个人学习或研究目的&#xff0c;并且尊重版权和隐私&#xff0c;你可以使用Python…

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(()…

HTML 官网进行移动端和 PC 端适配

使用响应式布局&#xff1a;确保你的 HTML 结构使用了响应式布局&#xff0c;即页面的元素能够根据不同设备的屏幕大小和分辨率进行自适应调整。 媒体查询&#xff1a;在 CSS 中使用媒体查询来针对不同的设备条件应用特定的样式。例如&#xff0c;你可以针对手机、平板和桌面设…

AI生成音乐

生成背景音乐 效果还不错 GitHub - teticio/audio-diffusion: Apply diffusion models using the new Hugging Face diffusers package to synthesize music instead of images.

pyqt 动态更换表头和数据

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

C语言例题27:打印99乘法口诀表

打印99乘法口诀表 #include <stdio.h>void main() {int i, j;int result 0;for (i 1; i < 10; i) {for (j 1; j < i; j) {result i * j;printf("%d*%d%d\t", j, i, result);}printf("\n");} } 本章C语言经典例题合集&#xff1a;http://t…

Redis底层数据结构之ZSkipList

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