首页 > 数据库 >async sqlalchemy 异步查询

async sqlalchemy 异步查询

时间:2024-07-18 10:29:21浏览次数:12  
标签:异步 sqlalchemy join models order User async id user

 

 实体和属性

返回多条数据 fetchall()

q = select(models.User)
result = await session.execute(q)
for i in result:
    print(i)

fetchone() 返回一条数据

q = select(models.User)
result = await session.execute(q)
print(result.fetchone())

>>>(<model.models.User object at 0x0000021E63C284C0>,)

scalars() 返回实体

q = select(models.User)
result = await session.execute(q)
print(result.scalars().all())
>>>[<model.models.User object at 0x00000257683A64F0>, <model.models.User object at 0x00000257683A69A0>]

同时返回2个人实体 select(models.User, models.Order).join(models.User.orders)

q = select(models.User, models.Order).join(models.User.orders).order_by(models.User.id, models.Order.id)
result = await session.execute(q)
print(result.fetchall())
>>>[(<model.models.User object at 0x00000227D150E160>, <model.models.Order object at 0x00000227D150E1C0>), ]

同时返回2个实体的具体数据 select(models.User.name, models.Order.id).join(models.User.orders)

q = select(models.User.name, models.Order.id).join(models.User.orders).order_by(models.User.id, models.Order.id)
result = await session.execute(q)
for i in result:
    print(i)
>>>
('Updated User', 1)
('Updated User', 2)
('cuicui', 3)

将一组列表达式分组到结果行中 Bundle()

q = select(
     Bundle("user", models.User.name, models.User.mobile),
    Bundle("email", models.Order.user_id)
).join_from(models.User, models.Order).order_by(models.User.id, models.Order.id)
result = await session.execute(q)
for i in result:
    print(i)
>>>
(('Updated User', '777-666666-777'), (2,))
(('cuicui', '111111122'), (4,))

使用别名 aliased(models.User, name="a")

a = aliased(models.User, name="a")
q = select(a).order_by(a.id)
result = await session.execute(q)
for i in result:
    print(i)

执行sql语句 text()

q = text("SELECT id, name, mobile FROM third_api_user ORDER BY id")
result = await session.execute(q)
for i in result:
    print(i)
>>>
(2, 'Updated User', '777-666666-777')
(4, 'cuicui', '111111122')
(70, 'ytf11112', '111111122')

sql语句转成 实体对象 from_statement()

# sql语句
q = text("SELECT id, name, mobile FROM third_api_user ORDER BY id")
# sql生成字段
textual_sql = q.columns(models.User.id, models.User.name, models.User.mobile)
# 转成实体对象
orm_sql = select(models.User).from_statement(textual_sql)
result = await session.execute(orm_sql)
for i in result.scalars():
    print(i.__dict__)
>>>
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x00000176E1EC40A0>, 'id': 2, 'mobile': '777-666666-777', 'name': 'Updated User'}
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x00000176E1EC4100>, 'id': 3, 'mobile': '111111122', 'name': 'cuicui'}
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x00000176E1EC4280>, 'id': 72, 'mobile': '11', 'name': 's'}

 

连表

根据User.addresses

>>> stmt = select(User).join(User.addresses)
>>> print(stmt)
SELECT user_account.id, user_account.name, user_account.fullname FROM user_account JOIN address ON user_account.id = address.user_id

 链接多个连接:

构造一个连接链,多个 Select.join() 可以使用呼叫。relationship-bound属性同时表示连接的左侧和右侧。考虑其他实体 Order 和 Item 那里 User.orders 关系是指 Order 实体,以及 Order.items 关系是指 Item 实体,通过关联表 order_items . 二 Select.join() 将加入来自第一个调用的结果 User 到 Order ,还有一秒钟 Order 到 Item . 但是,自从 Order.items 是一个 many to many 关系中,它将生成两个单独的JOIN元素,结果SQL中总共有三个JOIN元素:

>>> stmt = (
...     select(User).
...     join(User.orders).
...     join(Order.items)
... )
>>> print(stmt)
SELECT user_account.id, user_account.name, user_account.fullname
FROM user_account
JOIN user_order ON user_account.id = user_order.user_id
JOIN order_items AS order_items_1 ON user_order.id = order_items_1.order_id
JOIN item ON item.id = order_items_1.item_id

每次调用 Select.join() 方法的重要性仅限于我们希望从中连接的内容的“左”端需要在我们指示新目标之前出现在from列表中。 Select.join() 例如,如果我们指定 select(User).join(Order.items).join(User.orders) ,并将引发错误。在正确的实践中 Select.join() 方法的调用方式与我们希望如何呈现SQL中的JOIN子句一致,并且每个调用都应该表示与它前面的内容之间的清晰链接。

我们在FROM子句中目标的所有元素都可以作为继续从连接的潜在点。我们可以继续添加其他元素从 User 上面的实体,例如在 User.addresses 与我们的连接链的关系:

>>> stmt = (
...     select(User).
...     join(User.orders).
...     join(Order.items).
...     join(User.addresses)
... )
>>> print(stmt)
SELECT user_account.id, user_account.name, user_account.fullname
FROM user_account
JOIN user_order ON user_account.id = user_order.user_id
JOIN order_items AS order_items_1 ON user_order.id = order_items_1.order_id
JOIN item ON item.id = order_items_1.item_id
JOIN address ON user_account.id = address.user_id

 

标签:异步,sqlalchemy,join,models,order,User,async,id,user
From: https://www.cnblogs.com/shizhengwen/p/17673611.html

相关文章

  • c# 异步客户端服务器端
    服客发➡️收收⬅️循环发while(true){stringsendStr="你好我是客户端";Console.Write(sendStr);ClientSocket.Send(Encoding.UTF8.GetBytes(sendStr));}服务端给多个客户端发送消息服客发➡️收循环收⬅️发异步的时候开始还是先发送给客户端一条消息......
  • C# 一个自己写的异步并行执行器
    有的时候咱们需要循环执行业务,如果单以处理过程不是计算密集型,就可以使用多线程并行处理,这样能大幅度提高执行效率最开始我是想着有没有现成的,结果找了半天没发现有现成的,于是就自己封装了一个,简单测试了一下发现没啥问题异步并行执行器///<summary>///异步并行执......
  • 使用forEach循环异步方法,导致使用深拷贝时,得不到最新数据,控制台会打印出最新的数据
    在使用forEach循环遍历一个数组,如果循环时有异步方法,会导致最终深拷贝得不到最新数据,但是控制台会打印最新的数据constarr=[{name:"Jone",age:18},{name:"Tom",age:15},{name:"Liu",age:48}];functionfunTimeout(param){......
  • setState异步更新数据导致的问题
    背景子组件使用ProDescriptions组件,通过传入columns和request构建列表。<Modalopen={visible}><ProDescriptionscolumns={columnsasany}request={getTableRequestasany}/></Modal>父组件通过调用子组件useImperativeHandle提供的方法,改......
  • 异步任务队列
    #周朱张孙宋刘陈"胡王周朱谢周朱刘庄谢.黄"#周朱张孙宋刘陈"./宋周_胡王周朱谢周朱刘庄谢.黄"//#周朱张孙宋刘陈"孙周李袁王郭宋董陈朱.黄"#周朱张孙宋刘陈"赵陈罗曾庄朱罗.黄"#周朱张孙宋刘陈"欧陈朱刘陈郭姜邓曾.黄"#周朱张孙宋刘陈"邓周杨杨蒋胡赵.黄"#周朱张孙宋......
  • 基于快照的异步远程复制介绍
    本文分享自天翼云开发者社区《基于快照的异步远程复制介绍》,作者:l****n1、简介:本文介绍了基于RBD快照的异步远程复制技术2、概念介绍:异步远程复制:通过定时的将业务端的数据同步到备份端,从而实现数据的备份和灾难恢复的技术;RBD快照:RBD快照是RBD在某一时刻全部数据的只读镜像......
  • 在JavaScript中,如何实现异步编程?
    在JavaScript中,如何实现异步编程?请列举几种常见的方法(如Promise、async/await)。在JavaScript中,异步编程是处理长时间运行的任务(如网络请求、文件读写、大量计算等)的关键。JavaScript是单线程的,但通过使用异步编程模式,我们可以编写出既不会阻塞主线程执行又能处理耗时任务的......
  • 算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、O
    ​大侠幸会,在下全网同名「算法金」0基础转AI上岸,多个算法赛Top「日更万日,让更多人享受智能乐趣」今日215/10000抱个拳,送个礼为模型找到最好的超参数是机器学习实践中最困难的部分之一1.超参数调优的基本概念机器学习模型中的参数通常分为两类:模型参数和超......
  • 如何实现异步操作
    文章目录1.概念介绍2.使用方法2.1async和awit配合使用2.2Future类单独使用3.示例代码我们在上一章回中介绍url_launcher包相关的内容,本章回中将介绍如何Flutter中的异步操作.闲话休提,让我们一起TalkFlutter吧。1.概念介绍异步操作是程序中不可缺少的内容......
  • asyncio/trio fastdfs python client
    Codets.py#!/usr/bin/envpython"""FastDFS并发测试脚本Usage::$python<me>.py200--show"""importfunctoolsimportitertoolsimportjsonimportosimportpickleimportsysimporttimefrompathlibimportPathfr......