sqlalchemy异步方法使用

建立模型

  1. 创建基类base.py

    from sqlalchemy.orm import DeclarativeBaseclass Base(DeclarativeBase):pass
    
  2. 以用户为例,建立用户模型继承基类

    from sqlalchemy import Integer, String, ForeignKey, DateTime, Boolean
    from sqlalchemy.orm import mapped_column, Mappedfrom src.db.model.base import Base# 用户表
    class User(Base):__tablename__ = 'user'id: Mapped[int] = mapped_column(Integer, primary_key=True, comment='用户id')username: Mapped[str] = mapped_column(String(64), unique=True, nullable=True, comment='用户名称')password: Mapped[str] = mapped_column(String(64), comment='用户密码')name: Mapped[str] = mapped_column(String(32), comment='姓名')mobile_phone: Mapped[str] = mapped_column(String(32), comment='手机号')cloud_role_id: Mapped[int] = mapped_column(Integer, ForeignKey('cloud_role.id'), comment='平台角色id')user_group_id: Mapped[int] = mapped_column(Integer, ForeignKey('user_group.id'), comment='所在用户组id')status: Mapped[Boolean] = mapped_column(Boolean, comment='状态')register_time: Mapped[str] = mapped_column(String(32), comment='注册时间')last_login_time: Mapped[str] = mapped_column(DateTime, comment='最后登录时间')__table_args__ = ({'comment': '用户表'})

    comment表示注释,生产mysql的数据表里面会带上注释

  3. 建立异步引擎和session,后面接口的async_session()都从这里引入

    from sqlalchemy.ext.asyncio import create_async_engine, AsyncSessionengine = create_async_engine(DATABASE_URL, future=True, pool_pre_ping=True, pool_recycle=3600)
    async_session = sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
    

编写异步接口

  1. 添加用户

    class UserDao:def __init__(self):pass@classmethodasync def add_user(cls, username: str, password: str, name: str, mobile_phone: Optional[str], cloud_role_id: int,user_group_id: int, status: int) -> bool:if mobile_phone is None:mobile_phone = ''# 对密码进行hashmd_password = hashlib.md5(password.encode('utf-8')).hexdigest()user = User(username=username, password=md_password, name=name,mobile_phone=mobile_phone, cloud_role_id=cloud_role_id, user_group_id=user_group_id, status=status)user.register_time = datetime.datetime.now()user.last_login_time = user.register_time# 使用with包裹可以自动处理session的commit()和rollback()async with async_session() as session:async with session.begin():try:session.add(user)await session.flush()return Trueexcept Exception as e:log.error(e)return False
    
  2. 删除用户

        @classmethodasync def delete_user(cls, user_id: int) -> bool:async with async_session() as session:async with session.begin():try:query_sql = select(User).filter(User.id == user_id)user = (await session.execute(query_sql)).scalar()if user is not None:# 删除站点关联的用户记录delete_relation_sql = delete(StationSiteUsers).filter(StationSiteUsers.user_id == user_id)await session.execute(delete_relation_sql)# 删除用户delete_user_sql = delete(User).filter(User.id == user_id)await session.execute(delete_user_sql)return Trueelse:return Falseexcept Exception as e:log.error(e)return False
    

    注意,使用select查询时获取单个要用scalar(),因为sqlalchemy的异步方法不支持query。

    一般是select搭配scalar()使用,query()搭配fisrt()使用

  3. 编辑用户

        @classmethodasync def edit_user(cls, user_id: int, username: str, name: str, mobile_phone: Optional[str],cloud_role_id: int, user_group_id: int, status: int) -> bool:if mobile_phone is None:mobile_phone = ''async with async_session() as session:async with session.begin():try:# 查询userquery_sql = select(User).filter(User.id == user_id)user = (await session.execute(query_sql)).scalar()if user is not None:user.username = usernameuser.name = nameuser.mobile_phone = mobile_phoneuser.cloud_role_id = cloud_role_iduser.user_group_id = user_group_iduser.status = statusreturn Trueelse:return Falseexcept Exception as e:log.error(e)return False
    
  4. 查询用户信息

        # 获取所有用户信息@classmethodasync def get_all_user_info(cls) -> List[dict]:async with async_session() as session:async with session.begin():try:query_sql = select(User.id, User.username, User.name, User.mobile_phone, User.cloud_role_id,User.status, User.user_group_id, UserGroup.group_name,User.last_login_time).join(CloudRole, User.cloud_role_id == CloudRole.id).join(UserGroup, User.user_group_id == UserGroup.id)results = (await session.execute(query_sql)).fetchall()user_info_list = []for result in results:user_dict = {'user_id': result[0], 'username': result[1], 'name': result[2],'mobile_phone': result[3],'cloud_role_id': result[4], 'status': result[5], 'user_group_id': result[6],'user_group_name': result[7],'last_login_time': datetime.datetime.strftime(result[8], '%Y-%m-%d %H:%M:%S')}user_info_list.append(user_dict)return user_info_listexcept Exception as e:log.error(e)return []
    

使用pytest编写单元测试

  1. 测试user方法

    import pytestfrom src.db.async_controller.config import engine
    from src.db.async_dao.user_dao import UserDaouser_dao = UserDao()class TestUserDao:def setup_method(self):passdef teardown_method(self):engine.dispose()@pytest.mark.asyncioasync def test_add_user(self):await user_dao.add_user(username='superadmin', password="superadmin", name="superadmin",mobile_phone="123456", cloud_role_id=1, user_group_id=1, status=1)await user_dao.add_user(username='cdy', password="888888", name="cdy",mobile_phone="123456", cloud_role_id=2, user_group_id=2, status=1)# 管理员账号await user_dao.add_user(username='admin', password="888888", name="admin",mobile_phone="123456", cloud_role_id=1, user_group_id=3, status=1)await user_dao.add_user(username='admin1', password="888888", name="admin",mobile_phone="123456", cloud_role_id=1, user_group_id=3, status=1)await user_dao.add_user(username='admin2', password="888888", name="admin",mobile_phone="123456", cloud_role_id=1, user_group_id=3, status=1)# 普通账号await user_dao.add_user(username='hongdou1', password="888888", name="test",mobile_phone="123456", cloud_role_id=2, user_group_id=4, status=1)await user_dao.add_user(username='hongdou2', password="123456", name="test",mobile_phone="123456", cloud_role_id=2, user_group_id=4, status=1)await user_dao.add_user(username='hongdou3', password="123456", name="test",mobile_phone="123456", cloud_role_id=2, user_group_id=4, status=1)await user_dao.add_user(username='hongdou4', password="123456", name="test",mobile_phone="123456", cloud_role_id=2, user_group_id=4, status=1)@pytest.mark.asyncioasync def test_delete_user(self):result = await user_dao.delete_user(user_id=7)print(result)@pytest.mark.asyncioasync def test_get_accessible_user_list(self):print(await user_dao.get_accessible_user_list(user_id=1))

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

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

相关文章

暂停window11自动更新

window11 的自动更新功能,一方面在后台占用资源,容易导致电脑卡顿;另一方面,“更新并关机” 和 “更新并重启” 的设置令人极其反感。很多补丁兼容性很差,更新后极易引发电脑蓝屏、闪屏等意想不到的 bug。 1.winR打开运…

CTF-WEB: php-Session 文件利用 [第一届国城杯 n0ob_un4er 赛后学习笔记]

step 1 搭建容器 教程 A5rZ 题目 github.com Dockerfile 有点问题,手动修复一下 FROM php:7.2-apacheCOPY ./flag /root COPY ./readflag / COPY ./html/ /var/www/html/ COPY ./php.ini /usr/local/etc/php/php.ini COPY ./readflag /readsecretRUN chmod 755 /var/www…

在Win11系统上安装Android Studio

诸神缄默不语-个人CSDN博文目录 下载地址:https://developer.android.google.cn/studio?hlzh-cn 官方安装教程:https://developer.android.google.cn/studio/install?hlzh-cn 点击Next,默认会同时安装Android Studio和Android虚拟机&#…

网络基础概念

目录 一、计算机网络的发展背景1、网络的定义(1) 独立模式(2)网络互联 2、局域网 LAN3、广域网 WAN4、比较局域网和广域网5、扩展 —— 域域网和互联网 二、初识协议1、协议的概念2、协议的本质3、协议分层(1&#xff…

基于docker安装-高斯DB(opengauss)

获取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/opengauss:latest启动并配置容器 docker run --name OpenGauss --privilegedtrue --restartalways -u root -p 15432:5432 -e GS_PASSWORDEnmo123 -v /etc/localtime:/etc/localtime -v /data/OpenGaus…

web网页前后端交互方式

参考该文&#xff0c; 一、前端通过表单<form>向后端发送数据 前端是通过html中的<form>表单&#xff0c;设置method属性定义发送表单数据的方式是get还是post。 如使用get方式&#xff0c;则提交的数据会在url中显示&#xff1b;如使用post方式&#xff0c;提交…

Android:展锐T760平台camera PDAF调试

一、平台PDAF流程 目前展锐平台主要支持Shield PD Sensor、Dual PD Sensor 1、Shield PD Sensor Type1相位差和信心度结果直接从Sensor输出,不经过平台算法库。 Type2Sensor端抽取PD信息, 放在一块buffer输出, PDAF算法库算出相位差和信心度。 Type3Sensor端直接输出将带有…

css中样式前加 css样式前面加个圆点

创建CSS样式,样式名称的前面需要加什么 1、我们只知道符号代表的意思是at&#xff0c;其翻译是 在... 例如media就是 在媒介上。没人规定本身具有什么意义&#xff0c;或者说就算规定了我们也改变不了&#xff0c;只需要知道其规定属性的用法即可。 2、px;}然后根据你自己索要…

Scala-异常

1.空指针异常 NullPointerException 2.索引越界异常 IndexOutOfBoundsException 3.算术运算异常 ArithmeticException try{ 可能发生异常的代码 }catch { 发生异常之后的处理逻辑 case e:异常类型1 > 处理逻辑1 case e:异常类型2 > 处理逻辑2 …… }final…

iOS 环境搭建教程

本文档将详细介绍如何在 macOS 上搭建 iOS 开发环境&#xff0c;以便进行 React Native 开发。&#xff08;为了保证环境一致 全部在网络通畅的情况下运行&#xff09; 1. 安装 Homebrew Homebrew 是 macOS 的包管理工具&#xff0c;我们将通过它来安装开发所需的工具。 安装…

【HTML】根据不同域名设置不同的网站图标(替换 link 中 href 地址)

文章目录 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta http-equiv"x-ua-compatible" content"ieedge,chrome1" /><meta name"viewport" content"widthdevice-width&q…

Linux 操作系统中的管道与共享内存

目录 一、匿名管道 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;关键现象 &#xff08;三&#xff09;管道特性 二、命名管道 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;关键特性 三、共享内存 &#xff08;一&#xff09;基…

Glide 加载图片并应用滤镜效果

https://chatgpt.com/share/675a5bf6-7cd8-8003-98e7-d86146e47e95 常用滤镜类型 颜色调整滤镜 灰度 (Grayscale): 将图片转换为黑白。 反色 (Invert): 将图片的颜色反转。 棕褐色 (Sepia): 应用棕褐色滤镜&#xff0c;营造复古效果。 色调 (Hue): 调整图片的主色调。 饱和度…

Python 参数配置使用 XML 文件的教程 || Python打包 || 模型部署

当配置项存储在外部文件&#xff08;如 XML、JSON&#xff09;时&#xff0c;修改配置无需重新编译和发布代码。通过更新 XML 文件即可调整参数&#xff0c;无需更改源代码&#xff0c;从而提升开发效率和代码可维护性。 1. 为什么选择 XML 配置文件 XML 配置文件具有多种优点…

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后&#xff0c;用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了&#xff0c;可以去maven官网下载补充。 如果run时提示程序包xx不存在&#xff0c;在项目目录右键Marven->Re…

Android显示系统(13)- 向SurfaceFlinger提交Buffer

Android显示系统&#xff08;01&#xff09;- 架构分析 Android显示系统&#xff08;02&#xff09;- OpenGL ES - 概述 Android显示系统&#xff08;03&#xff09;- OpenGL ES - GLSurfaceView的使用 Android显示系统&#xff08;04&#xff09;- OpenGL ES - Shader绘制三角…

【kubernetes】资源管理方式

目录 1. 说明2. 命令式对象管理3. 命令式对象配置4. 声明式对象配置5. 三种方式的对比 1. 说明 1.在Kubernetes&#xff08;k8s&#xff09;中&#xff0c;资源管理是一个核心功能&#xff0c;它允许用户通过操作资源来管理Kubernetes集群。2.Kubernetes将所有的内容都抽象为资…

【git、gerrit】特性分支合入主分支方法 git rebase 、git cherry-pick、git merge

文章目录 1. 场景描述1.1 分支状态 2. 推荐的操作方式方法 1&#xff1a;git merge&#xff08;保留分支结构&#xff09;方法 2&#xff1a;git rebase&#xff08;线性合并提交历史&#xff09;直接在master分支执行git merge br_feature&#xff0c;再 执行 git pull --reba…

211-基于FMC的1路1.5G ADC 1路 2.5G DAC子卡

一、板卡概述 FMC-1AD-1DA-1SYNC是我司自主研发的一款1路1G AD采集、1路2.5G DA回放的FMC、1路AD同步信号子卡。板卡采用标准FMC子卡架构&#xff0c;可方便地与其他FMC板卡实现高速互联&#xff0c;可广泛用于高频模拟信号采集等领域。 二、功能介绍 2.1 原理框图 2.2 硬件…

实操给自助触摸一体机接入大模型语音交互

本文以CSK6 大模型开发板串口触摸屏为例&#xff0c;实操讲解触摸一体机怎样快速增加大模型语音交互功能&#xff0c;使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音&#xff0c;将语音数据传输…