首页 > 数据库 >SQLAlchemy 异步操作

SQLAlchemy 异步操作

时间:2024-07-13 18:31:06浏览次数:17  
标签:异步 SQLAlchemy Column self session 操作 async class

在现代的 Python 应用中,异步操作越来越受到重视,特别是在处理 I/O 密集型任务时。SQLAlchemy 也提供了对异步操作的支持,结合 aiomysql 可以实现异步的数据库操作。

环境准备

首先,你需要安装 aiomysql

pip install aiomysql

步骤详解

1. 创建数据库驱动引擎

我们需要创建一个异步的数据库引擎。这里我们使用 aiomysql 作为 MySQL 的异步驱动。

from sqlalchemy.ext.asyncio import create_async_engine

engine = create_async_engine(
    url='mysql+aiomysql://root:0908@localhost:3306/db_sqlalchemy_demo?charset=utf8mb4',
    echo=True,
    pool_size=10,
    max_overflow=30,
    pool_recycle=60 * 30,
)

2. 创建异步会话类

使用 sessionmaker 创建一个异步会话类。

from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import sessionmaker

async_session = sessionmaker(
    engine, expire_on_commit=False, class_=AsyncSession
)

3. 创建模型基类

定义一个模型基类,所有的模型都将继承自这个基类。

from sqlalchemy.orm import DeclarativeBase

class Model(DeclarativeBase):
    pass

4. 创建模型

定义一个 Student 模型,包含学生的相关信息。

from sqlalchemy import Column, Integer, String, Boolean, SmallInteger, Text, DateTime
import datetime

class Student(Model):
    __tablename__ = "tb_async_student"
    id = Column(Integer, primary_key=True)
    name = Column(String(20))
    sex = Column(Boolean, default=True)
    age = Column(SmallInteger)
    class_ = Column("class", SmallInteger)
    description = Column(Text)
    status = Column(Boolean, default=1)
    addtime = Column(DateTime, default=datetime.datetime.now)
    orders = Column(SmallInteger, default=1)

    def __repr__(self):
        return f"<{self.__class__.__name__} {self.name}>"

    def to_dict(self):
        return {
            'id': self.id,
            'name': self.name,
            'sex': self.sex,
            'age': self.age,
            'class': self.class_,
            'description': self.description,
            'status': self.status,
            'addtime': self.addtime.strftime('%Y-%m-%d %H:%M:%S'),
            'orders': self.orders,
        }

5. 异步操作数据库

接下来,我们将展示如何进行异步的数据库操作,包括创建表、插入数据和查询数据。

import asyncio
from sqlalchemy import select

async def main():
    # 创建表
    async with engine.begin() as conn:
        await conn.run_sync(Model.metadata.drop_all)
        await conn.run_sync(Model.metadata.create_all)

    # 插入数据
    async with async_session() as session:
        async with session.begin():
            student1 = Student(name="小明", class_="302", sex=True, age=18, description="滚出去..")
            student2 = Student(name="小蓝", class_="303", sex=True, age=18, description="滚出去..") 
            student3 = Student(name="小非", class_="305", sex=True, age=18, description="滚出去..")
            student4 = Student(name="小富", class_="305", sex=True, age=18, description="滚出去..")
            # 添加一条数据
            session.add(student1)
            # 添加多条数据
            session.add_all([student2, student3, student4])

    # 查询数据
    async with async_session() as session:
        async with session.begin():
            q = select(Student).where(Student.class_ == 305).order_by(Student.id)
            print(q)
            # 获取一个结果
            result = await session.execute(q)
            student = result.scalar()
            if student:
                print(student.to_dict())
            # 获取多个结果
            result = await session.execute(q)
            students = result.scalars().all()
            for student in students:
                print(student.to_dict())

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

本篇结束,本合集到此为止,很多用法都说得比较简单,但是并没有讲述诸多的实现原理,作者对其原理也是一知半解,无法再深入去分享相关的言谈,毕竟仅只是一篇入门合集,再加上笔者精力时间有限,写下来也是方便日后的使用查阅。

标签:异步,SQLAlchemy,Column,self,session,操作,async,class
From: https://www.cnblogs.com/gupingan/p/18300469

相关文章

  • SQLAlchemy 执行原生 SQL 语句
    在使用SQLAlchemy进行数据库操作时,虽然ORM提供了强大的模型映射功能,但有时候直接使用原生SQL语句可能更加简单直率,甚至性能更优。下面我们来看一下如何在SQLAlchemy中执行原生的SQL语句。执行原生SQL语句的步骤构造SQL语句调用session中的execute方法执行,得......
  • python——数据类型及常用操作
    1.Intint是一种基本的数据类型,可以存储任意大小的整数,定义简单,将一个值赋给变量即可可以和+-*/等运算符结合a=2b=3c=a+bprint(c)d=b-apint(d)e=a*bprint(e)fa/bprint(f)a=2print(a)2.Floatfloat表示浮点数 也就是我们常说的带有小数......
  • 数量限制、排序与事务操作
    查询限制在关于SQLAlchemy教程的前文中,你应该知道如何使用select和query方法来查询数据。接下来我们尝试使用limit方法来限制返回的结果数量。importdbfrommodelimportStudent#使用select方法限制结果数量q=db.select(Student).where(Student.id.in_([1,......
  • 前端一面之 同步 vs 异步
    异步vs同步先看一下下面的democonsole.log(100)setTimeout(function(){console.log(200)},1000)console.log(300)执行结果100300200console.log(100)alert(200)//1秒钟之后点击确认console.log(300)这俩到底有何区别?——第一个示例中间......
  • 操作系统-(第一章上)
    1.计算机系统的概述定义·:操作系统(Operating,OS)是指控制和管理整个计算机系统的硬件和软件资源(1.操作系统是系统资源的管理者),并合理地组织调度计算机的工作和资源的分配;以提供用户和其他软件方便的接口和环境(2.向上层提供方便易用的服务);它是计算机系统重最基本的系统软件(3.是......
  • vscode操作笔记
    ctrlshifp打开命令窗口 修改vscode左边搜索框或者文件名字显示的字体的方法(设置里面不包含,只有自己改css文件)找到workbench.desktop.main.css文件,修改以下属性.monaco-workbench.part>.content{font-size:14px;font-family:'YouYuan'} 我使用的插件有ms-vscode.cppto......
  • 【操作系统原理】第五章课后习题
    前言课本:操作系统原理(第五版)[费翔林,骆斌编著]习题:主要习题内容是第一章到第六章,具体内容如下表章节内容链接第一章思考题1,3,7、应用题7,12(1)~(4)https://blog.csdn.net/Zchengjisihan/article/details/136493304?spm=1001.2014.3001.5501第二章思考题1,3,10......
  • 【操作系统原理】第四章课后习题
    前言课本:操作系统原理(第五版)[费翔林,骆斌编著]习题:主要习题内容是第一章到第六章,具体内容如下表章节内容链接第一章思考题1,3,7、应用题7,12(1)~(4)https://blog.csdn.net/Zchengjisihan/article/details/136493304?spm=1001.2014.3001.5501第二章思考题1,3,10......
  • 【操作系统原理】第六章课后习题
    前言课本:操作系统原理(第五版)[费翔林,骆斌编著]习题:主要习题内容是第一章到第六章,具体内容如下表章节内容链接第一章思考题1,3,7、应用题7,12(1)~(4)https://blog.csdn.net/Zchengjisihan/article/details/136493304?spm=1001.2014.3001.5501第二章思考题1,3,10......
  • ubuntu 基本操作
    安装输入法参考Ubuntu22.04安装搜狗输入法【经验分享】Ubuntu24.04安装搜狗输入法(亲测有效)[问题求助]安装搜狗输入法显示fcitx依赖不足该怎么处理desktop快捷方式检测desktop文件desktop-file-validatemyapp.desktop更新.desktop数据库更新如下两个位置的.de......