SQLAlchemy中常用的查询方法[示例学习]

SQLAlchemy 是一个强大的 Python ORM(对象关系映射)工具,它提供了多种方法来执行数据库查询操作。以下是 SQLAlchemy 中常用的查询方法的总结:

  1. session.query():使用 session.query(Model) 来创建一个查询对象,其中 Model 是你要查询的数据库模型类。

  2. filter():在查询对象上使用 filter() 方法可以添加过滤条件,例如 filter(Model.column == value)

  3. all():使用 all() 方法可以获取查询的所有结果,并以列表的形式返回。

  4. first():使用 first() 方法可以获取查询结果的第一条记录。

  5. get():使用 get(primary_key_value) 方法可以根据主键值直接获取相应的记录。

  6. filter_by():使用 filter_by(column=value) 方法可以根据指定列的数值进行过滤。

  7. join():使用 join() 方法可以进行表的内连接查询。

  8. outerjoin():使用 outerjoin() 方法可以进行表的外连接查询。

  9. group_by():使用 group_by() 方法可以按指定列分组查询。

  10. order_by():使用 order_by() 方法可以对查询结果进行排序。

  11. count():使用 count() 方法可以统计查询结果的数量。

  12. delete():使用 delete() 方法可以删除满足条件的记录。

  13. update():使用 update() 方法可以更新满足条件的记录。

from sqlalchemy.orm import declarative_base,sessionmaker
from sqlalchemy import create_engine, ForeignKeyfrom sqlalchemy import Column, Integer, StringBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)class Address(Base):__tablename__ = 'addresses'id = Column(Integer, primary_key=True)user_id = Column(Integer, ForeignKey('users.id'))street = Column(String)city = Column(String)# 创建数据库连接
engine = create_engine('sqlite:///users_addresses_example.db')
Base.metadata.create_all(engine)# 创建会话
Session = sessionmaker(bind=engine)
session = Session()# 清空 User 表数据
session.query(User).delete()
session.commit()# 清空 Address 表数据
session.query(Address).delete()
session.commit()# 插入数据到 User 表
user1 = User(name='Alice', age=25)
user2 = User(name='Bob', age=30)
user3 = User(name='Charlie', age=22)
user4 = User(name='pemp', age=34)
user5 = User(name='pita', age=39)session.add_all([user1, user2, user3, user4, user5])
session.commit()# 插入数据到 Address 表
address1 = Address(user_id=user1.id, street='123 Main St', city='New York')
address2 = Address(user_id=user2.id, street='456 Park Ave', city='Los Angeles')
address3 = Address(user_id=user3.id, street='789 Elm St', city='Chicago')session.add_all([address1, address2, address3])
session.commit()# 进行表的联合查询
result = session.query(User, Address).join(Address, User.id == Address.user_id).all()for user, address in result:print(f"User: {user.name}, Age: {user.age}, Address: {address.street}, {address.city}")print('*'*40)from sqlalchemy import and_# 进行表的外连接查询
# outerjoin外连接查询将返回左表User的所有记录,以及右表Address 表中与左表记录关联的数据,如果没有匹配的记录,则右表数据部分为 NULL。
# result = session.query(User.id, Address.id).outerjoin(Address, User.id == Address.user_id).all()# # 找出没有关联的记录
# unassociated_records = [(user_id, address_id) for user_id, address_id in result if address_id is None]# print("User 和 Address 表中没有关联的 ID:")
# for user_id, _ in unassociated_records:
#     print(f"独立User ID: {user_id}")# 进行表的外连接查询
result = session.query(User, Address).outerjoin(Address, User.id == Address.user_id).all()for user, address in result:if address is None:print(f"独立User: {user.name}, Age: {user.age}, Address: None")else:print(f"User(关联ID): {user.name}, Age: {user.age}, Address: {address.street}, {address.city}")# 关闭会话
session.close()
from sqlalchemy import create_engine, Column, Integer, String,select
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy import func# 创建数据库连接
engine = create_engine('sqlite:///users_example.db')Base = declarative_base()# 定义模型类
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)# 创建数据表
Base.metadata.create_all(engine)# 创建 Session 类
Session = sessionmaker(bind=engine)
session = Session()# 事先清空数据
session.query(User).delete() 
session.commit()# 插入更多数据
users_data = [{'name': 'Charlie', 'age': 28},{'name': 'David', 'age': 32},{'name': 'Eve', 'age': 27},{'name': 'gemm', 'age': 43},{'name': 'riyu', 'age': 43}
]for user_data in users_data:user = User(**user_data)session.add(user)
session.commit()# 查询数据
query = session.query(User)# 使用 filter() 方法添加过滤条件
result = query.filter(User.age > 25).all()
print("年龄大于25的用户:", [(user.name, user.age) for user in result])# 使用 func.group_concat() 函数将同一年龄下的用户名合并成一个字符串
result = session.query(User.age, func.group_concat(User.name)).group_by(User.age).all()
print("按年龄分组查询:")
for age, names in result:name_list = names.split(',')print(f"年龄 {age} 的用户有:{', '.join(name_list)}")# # 使用 group_by() 方法按年龄分组查询
# result = query.with_entities(User.age, func.group_concat(User.name)).group_by(User.age).all()
# print("按年龄分组查询:")
# for age, names in result:
#     name_list = names.split(',')
#     print(f"年龄 {age} 的用户有:{', '.join(name_list)}")# 使用 order_by() 方法对结果进行排序
result = query.order_by(User.age).all()
print("按年龄排序:", [(user.name, user.age) for user in result])# 统计查询结果的数量
count = query.count()
print("查询结果的数量:", count)# 删除满足条件的记录
session.query(User).filter(User.name == 'Charlie').delete()
session.commit()# 更新满足条件的记录
session.query(User).filter(User.name == 'David').update({User.age: 35})
session.commit()# 执行 SELECT 查询
# 使用 select(User) 会创建一个 SELECT 查询,查询的对象是 User 这个表格(模型类)。这意味着你将检索 User 表中的所有列
with engine.connect() as connection:stmt = select(User).where(User.age > 25)result = connection.execute(stmt)for row in result:print(row)

---------------
sqlalchemy
select 函数的参数可以是一个或多个表达式,用于指定要查询的列。
它接受一个可迭代对象作为参数,该可迭代对象包含要选择的列或其他表达式。

以下是 select 函数的基本语法:

select(columns, whereclause=None, from_obj=[], **kwargs)

  • columns:要选择的列或其他表达式,可以是一个或多个。select(User模型类)
  • whereclause:可选参数,用于指定 WHERE 子句中的条件表达式。
  • from_obj:可选参数,用于指定查询的来源表(FROM 子句)。
  • **kwargs:其他可选参数,例如 group_byhavingorder_by 等。

在使用 select 函数时,你至少需要提供一个 columns 参数来指定要选择的列。其他参数都是可选的,根据实际需要来决定是否使用。
------------------------

session.scalars() 方法是 SQLAlchemy 中用于执行查询并返回标量值(Scalar)的方法。在 ORM 查询中,当你只需要获取一列数据的值而不是整个对象时,可以使用 session.scalars() 方法。 

from sqlalchemy import select# 创建一个 SELECT 查询,选择名字为 "spongebob" 或 "sandy" 的用户的 id 列
stmt = select(User.id).where(User.name.in_(["spongebob", "sandy"]))# 使用会话执行查询
with Session(engine) as session:# 执行查询并返回标量值for user_id in session.scalars(stmt):print(user_id)

 

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

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

相关文章

Swift xcode app自动化

在本文中,我将教您如何使用Swift和Xcode进行应用程序自动化。如果您是一名经验丰富的开发者,我将引导您如何帮助一位刚入行的小白实现这一目标。我们将按照以下步骤进行操作: 创建一个新的Xcode项目 配置自动化测试目标 编写测试用例 运行自…

R: 网状Meta分析进行模型构建及图形绘制

网状meta分析的制作步骤主要包括: 1. 绘制网状证据图 2. 普通Meta分析(两两之间的直接比较) 3. 网状Meta分析(整合直接比较和间接比较的结果,绘制相关图形) 4. 绘制累积概率排序图 5. 三个假设的检验…

江协STM32:点亮第一个LED灯和流水灯

很多单片机都是高电平弱驱动,低电平强驱动,所以这里是低电平有效 点亮一个LED灯 操作STM32的GPIO需要三个操作: 第一个使用RCC开启GPIO的时钟 第二步使用GPIO_Init函数初始化GPIO 第三步使用输出或输入函数控制GPIO 1.使用RCC开启GPIO的时…

游戏开发笔记:游戏海外版本时区问题(解释时区问题,分解为js写法和lua写法来分析记录,整理出对应语言的相关函数方法。)

对于海外游戏而言,与时间相关的功能,都不能忽略时区的计算。根据 ‘ 服务端资源是有限的,客户端资源是无穷无尽的 ’的定义来说,基本上时区包括时间的计算都是由客户端来进行计算,今天内容也是围绕客户端来展开。 时区算法常见的时间描述时区需要计算的点在lua语言中的写…

Vue 模版编译原理

当我们使用Vue编写完一个组件以后,Vue会根据模版编译一个render函数,调用render函数生成虚拟DOM,然后将虚拟DOM映射成真实DOM 当数据发生变化时,Vue会触发更新视图,调用render函数返回新的虚拟DOM,对比新旧…

重置reactive对象(深拷贝与浅拷贝)

需求&#xff0c;点击不同登录方式&#xff0c;该图标高亮&#xff0c;别的图标置灰。&#xff08;高亮和置灰都有相应的引入图片&#xff09; <div class"other_icon"><img click"changeLoginType(item.index)" v-for"item in imgAddress&…

Docker数据卷挂载

一、容器与数据耦合的问题: 数据卷是虚拟的&#xff0c;不真实存在的&#xff0c;它指向文件中的文件夹 &#xff0c;属主机文件系统通过数据卷和容器数据进行联系&#xff0c;你改变我也改变。 解决办法&#xff1a; 对宿主机文件系统内的文件进行修改&#xff0c;会立刻反应…

HBase的Python API操作(happybase)

一、Windows下安装Python库&#xff1a;happyhbase pip install happybase -i https://pypi.tuna.tsinghua.edu.cn/simple 二、 开启HBase的Thrift服务 想要使用Python API连接HBase&#xff0c;需要开启HBase的Thrift服务。所以&#xff0c;在Linux服务器上&#xff0c;执行…

Day23:事务管理、显示评论、添加评论

事务管理 事务的定义 什么是事务 事务是由N步数据库操作序列组成的逻辑执行单元&#xff0c;这系列操作要么全执行&#xff0c;要么全放弃执行。 事务的特性(ACID) 原子性(Atomicity):事务是应用中不可再分的最小执行体&#xff08;事务中部分执行失败就会回滚 。一致性(C…

Windows入侵排查

目录 0x00 前言 0x01 入侵排查思路 1.1 检查系统账号安全 1.2 检查异常端口、进程 1.3 检查启动项、计划任务、服务 0x00 前言 当企业发生黑客入侵、系统崩溃或其它影响业务正常运行的安全事件时&#xff0c;急需第一时间进行处理&#xff0c;使企业的网络信息系统在最短时…

adb: error: failed to get feature set: no devices/emulators found

这个错误信息 adb: error: failed to get feature set: no devices/emulators found 表明 adb 工具无法找到任何连接的Android设备或模拟器来执行安装操作。这通常发生在以下几种情况&#xff1a; 没有设备连接&#xff1a;确保你的Android设备已经通过USB线连接到电脑&#xf…

Scikit-learn 数据挖掘和数据分析工具的使用指南

Scikit-learn是Python中一款非常强大且广泛使用的数据挖掘和数据分析工具。它为数据挖掘和数据分析任务提供了简单高效的接口&#xff0c;涵盖了分类、回归、聚类、降维、模型选择等多个方面。以下是一份详细的使用指南&#xff0c;帮助用户更好地理解和使用Scikit-learn。 一…

js如何遍历查询一个颗树

近段时间去面试的时候&#xff0c;被面试官问到如何遍历查询一个颗树的时候&#xff0c;可能最近自己看了数据结构的书之后&#xff0c;隐隐约约就想到二叉树的三种排序&#xff08;前序、中序、后序&#xff09;&#xff0c;但是当时自己没有想起这三种排序的名字&#xff0c;…

6_相机坐标系_相机4个坐标系详述

相机系列文章是用来记录使用opencv3来完成单目相机和6轴机械臂手眼标定。本人吃饭的主职是linux下6轴机械臂相关应用开发。但对于机械臂运动学、相机应用等都非常感兴趣&#xff0c;所以对一些线性代数基础薄弱又想深入了解机械臂内部运算的同志比较有体会。由于是探索性学习&a…

9.windows ubuntu 子系统,centrifuge:微生物物种分类。

上次我们用了karken2和bracken进行了物种分类&#xff0c;这次我们使用centrifuge. Centrifuge 是一种用于快速和准确进行微生物分类和物种鉴定的软件。其主要功能包括&#xff1a; 快速分类和物种鉴定: Centrifuge 可以对高通量测序数据&#xff08;如 metagenomic 或 RNA-Se…

2018年亚马逊云科技推出基于Arm的定制芯片实例

2018年&#xff0c;亚马逊云技术推出了基于Arm的定制芯片。 据相关数据显示&#xff0c;基于Arm的性价比比基于x86的同类实例高出40%。 这打破了对 x86 的依赖&#xff0c;开创了架构的新时代&#xff0c;现在能够支持多种配置的密集计算任务。 这些举措为亚马逊云技术的其他创…

OSPF-区域间路由计算

一、概述 前面学习了我们学习了Router-LSA和Network-LSA&#xff0c;它们都只能在区域内进行泛洪&#xff0c;而且我们之前一直主要是单区域学习。OSPF的核心是骨干区域Area 0&#xff0c;其它都为非骨干区域。但是在大型网络中&#xff0c;单区域OSPF会存在一定的问题&#xf…

linux的git命令学习[常见命令]

linux的git命令学习 工作做使用vscode下的git插件来管理代码的。 #安装git apt-get install git #配置ssh密钥 ssh-keygen -t rsa -C "name"cat ~/.ssh/id_rsa.pub#复制ssh密钥到github账号配置好就可以进行ssh克隆了 #配置账号&#xff0c;邮箱 git config -…

HWOD:九键输入法的转换

一、知识点 A的ASCII码是65&#xff0c;Z的ASCII码是90 a的ASCII码是97&#xff0c;z的ASCII码是122 从z到a的反循环&#xff0c;用26求余数 二、题目 1、描述 九键手机键盘上的数字与字母的对应&#xff1a; 1--1&#xff0c; abc--2, def--3, ghi--4, jkl--5, mno--6, …

企微获客助手功能,行为触发如何实现回传的?

获客助手&#xff0c;这个听起来就相当酷炫的名字&#xff0c;它实际上是一个帮助企业将推广流量快速导入企业微信的神器。通过它&#xff0c;企业可以吸引越来越多的用户加为好友&#xff0c;从而建立起更紧密的客户关系。但是&#xff0c;如何进一步提升导入企业微信的流量质…