首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SqlAlchemy 2.0 中文文档(十九)

加载器策略背后的理念是,任何一组加载方案都可以应用于特定查询,结果不会改变 - 只有用于完全加载相关对象和集合所需的 SQL 语句数量会改变。一个特定的查询可能首先使用所有惰性加载。...当使用联接式的急加载时,如果查询包含影响联接外返回的行的修改器,比如使用 DISTINCT、LIMIT、OFFSET 或等效的修改器时,完成的语句首先被包裹在一个子查询中,并且专门用于联接式的急加载的联接应用于子查询...由此自然地可以选择修改要存储在集合中的值,通过编写 SQL 来加载集合或标量属性的子集。...装载策略背后的哲学是,任何一组装载方案都可以应用于特定的查询,并且结果不会改变——只有完全加载相关对象和集合所需的 SQL 语句数量会改变。一个特定的查询可能首先使用所有的延迟加载。...当使用连接式急切加载时,如果查询包含影响联接外部返回的行的修饰符,例如使用 DISTINCT、LIMIT、OFFSET 或等效的修饰符,完成的语句首先包装在一个子查询中,并且专门用于连接式急切加载的联接应用于子查询

28010

Flask数据库过滤器与查询集

sql语句,然后通过数据库驱动访问mysql,在获取到结果后再把数据转换为模型对象 Flask的数据库设置: app.config[‘SQLALCHEMY_DATABASE_URI’] = 'mysql...在一对多关系中,要在多这一侧加入一个外键,指向一这一侧联接的记录,即relationship()声明出现在代表少那个类,而外键声明出现在代表多的那个类中。...只在模棱两可的关系中需要指定 lazy:决定了SQLAlchemy什么时候从数据库中加载数据。...这种信息只能存储在关联表中,但是在之前实现的学生和课程之间的关系中,关联表完全是由SQLAlchemy掌控的内部表。...删除对象时,默认的层叠行为是把对象联接的所有相关对象的外键设为空值。但在关联表中,删除记录后正确的行为应该是把指向该记录的实体也删除,因为这样能有效销毁联接。

7K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SqlAlchemy 2.0 中文文档(九)

    最常见的继承形式是单一和联接表,而具体继承则提出了更多的配置挑战。 当映射器配置在继承关系中时,SQLAlchemy 有能力以多态方式加载元素,这意味着单个查询可以返回多种类型的对象。...另请参见 为继承映射编写 SELECT 语句 - 在 ORM 查询指南 中 继承映射示例 - 联接、单一和具体继承的完整示例 联接表继承 在联接表继承中,沿着类层次结构的每个类都由一个不同的表表示。...对类层次结构中特定子类的查询将作为 SQL JOIN 在其继承路径上的所有表之间进行。如果查询的类是基类,则查询基表,同时可以选择包含其他表或允许后续加载特定于子表的属性的选项。...## 连接表继承 在连接表继承中,类层次结构中的每个类都由一个不同的表表示。在层次结构中查询特定子类将作为 SQL JOIN 渲染其继承路径上的所有表。...如果不需要多态加载,则可以使用普通的非继承映射,如果每个类都完全引用其自己的表格。 虽然联接和单表继承在“多态”加载方面很流畅,但在具体继承中却是一种更笨拙的事情。

    26710

    SqlAlchemy 2.0 中文文档(八十)

    这是一种在第一个 SQL 查询之后立即发出第二个 SQL 查询的加载方式,为第一个查询中的所有父级加载完整集合,使用 INNER JOIN 向上连接到父级。...users AS users_1 ON users_1.id = addresses.user_id LIMIT 10 具有联接表继承的可变主键 在子表具有外键指向父表主键的联接表继承配置现在可以在像...这是一种在第一个 SQL 查询之后立即发出第二个 SQL 查询的加载,该查询为第一个查询中的所有父项加载完整集合,使用 INNER JOIN 向上连接到父项。...[ticket:1544] 联接急切加载的行为,即当 LIMIT/OFFSET 存在时,主查询被包装在子查询中,现在对所有急切加载都是多对一联接的情况做了一个例外。...JOIN users AS users_1 ON users_1.id = addresses.user_id LIMIT 10 使用联接表继承的可变主键 在子表具有外键到父表主键的联接表继承配置中

    20310

    InnoDB在SQL查询中的关键功能和优化策略

    前言通过上篇文章《MySQL的体系结构与SQL的执行流程》了解了SQL语句的执行流程以及MySQL体系结构中「连接器」、「SQL接口」、「解析器」、「优化器」、「执行器」的功能以及在整个流程中的作用。...在MySQL的体系结构中,存储引擎是负责和磁盘交互的,当执行一条SQL语句,最终是通过存储引擎获取结果,不论是查询语句、插入语句还是更新语句,所以存储引擎是用来查询、存储、管理数据的。...很显然,当InnoDB收到一个查询SQL的请求后会有两个操作:先去内存中查找有没有符合条件的数据,有,直接将数据返回给执行器。...如果内存中符合条件的数据,此时需要去磁盘中查找并加载到内存,然后将数据返回给执行器。没错,在查询数据时InnoDB干的活就是这么简单。当然,我们还是要深入内部了解一下原理。...关于buffer_pool的优化详见MySQL官网总结最后,再通过一张图总结一下在执行器调用存储引擎后,InnoDB做了什么事。InnoDB根据SQL请求去Buffer Pool中查找「行数据」。

    62475

    如何使用 Python 和 SQLAlchemy 结合外键映射来获取其他表中的数据

    在使用 Python 和 SQLAlchemy 时,结合外键映射可以让你在查询时轻松地获取其他表中的数据。...SQLAlchemy 提供了丰富的 ORM(对象关系映射)功能,可以让你通过定义外键关系来查询并获取关联的数据。下面我会演示如何设置外键关系,并通过 SQLAlchemy 查询获取其他表中的数据。...1、问题背景在使用 SQLAlchemy 进行对象关系映射时,我们可能需要获取其他表中的数据。...2.3 添加另一个外键如果我们需要在 Order 表中添加另一个外键,例如 product_id 字段,并且希望获取该订单所属产品的信息,那么我们可以在 Order 类中定义一个新的关系属性,使用 relationship...联接查询 (joinedload):通过联接查询加载关联数据,提高查询效率。直接访问外键列:直接访问与外键相关的表格数据。

    14310

    SqlAlchemy 2.0 中文文档(二十)

    另请参阅 ORM 实体别名 - 在 SQLAlchemy 统一教程 中 选择 ORM 别名 - 在 ORM 查询指南 中 参数: element – 要别名化的元素。...with_loader_criteria()选项旨在向查询中的特定类型的实体全局添加限制条件,这意味着它将应用于实体在 SELECT 查询中的出现以及在任何子查询、联接条件和关系加载中,包括急切和延迟加载器...另请参阅 ORM 实体别名 - 在 SQLAlchemy 统一教程 中 选择 ORM 别名 - 在 ORM 查询指南 中 参数: element – 要别名的元素。...例如,在联接表继承场景中,"table"将引用给定实体的本地表。...SQL 相同,这意味着在 Python 中从父对象中取得适当的状态而无需将父表的联接渲染到渲染的语句中。

    32710

    SqlAlchemy 2.0 中文文档(五十四)

    ,在 SQL 中,所有表应该真的有某种主键,以免您实际上需要更新或删除特定行)。...该系统依赖于为所有 SQL 构造实现的功能,包括诸如Column、select()和TypeEngine对象等,以生成完全代表它们状态的缓存键,在影响 SQL 编译过程的程度上。...但是,有一种情况,即如果禁用了 SQLAlchemy 的新缓存系统(由于以下原因),则 ORM 的性能实际上可能显着低于 1.3 或其他先前版本,原因是在 1.3 和以前的版本中,ORM 惰性加载器和对象刷新查询中没有缓存...User.name == "jack" ... ).all() [(5, 'jack'), (5, 'jack')] Query 将去重的主要原因有两个: 允许联接预加载正常工作 - 联接预加载通过使用与相关表的连接来查询行...要极大地简化事情,Session 本身是在完全隔离的事务中运行的,并且不会覆盖任何已经读取的映射属性,除非你告诉它这样做。

    36110

    一条查询SQL在MySQL中是怎么执行的

    平时我们使用的数据库,看到的通常是一个整体,比如我们执行一条查询SQL,返回一个结果集,却不知道这条语句在MySQL内部是如何执行的,接下来我们就来简单的拆解一下MySQL,看看MySQL是由哪些“零件...这样在我们以后遇到MySQL的一些异常或者问题的时候,就可以快速定位问题并解决问题。 下边通过一张图来看一下SQL的执行流程,从中可以清楚的看到SQL语句在MySQL的各个功能模块中执行的过程。 ?...如果查询语句在缓存中可以查到这个key,就直接把结果返回给客户端。如果语句不在缓存中,就会继续执行后边的阶段。执行完成后,将执行结果存入缓存中。...在数据库的慢查询日志中可以看到一个rows_examined的字段,表示这个语句执行过程中扫描了多少行,这个值是在执行器每次调用引擎的时候累加的,有时候执行器调用一次,在引擎内部扫描了多行,隐藏引擎扫描行数跟...rows_examined并不完全相同。

    4.8K20

    SqlAlchemy 2.0 中文文档(七十八)

    #2590 不再将“=”自动转换为 IN,当与 MS-SQL 中的子查询进行比较时 我们在 MSSQL 方言中发现了一个非常古老的行为,当用户尝试执行类似以下操作时,它会试图拯救用户: scalar_subq...在 0.8 中,passive参数将不起作用,并且未加载的属性永远不会被检查历史记录,因为根据定义,未加载的属性上不会有待处理的状态更改。...#2590 不再将“=”自动转换为 IN,用于与 MS-SQL 中的子查询进行比较 我们在 MSSQL 方言中发现了一个非常古老的行为,当用户执行类似以下操作时,它会试图拯救用户: scalar_subq...在 0.8 版本中,passive参数将不起作用,并且未加载的属性永远不会检查历史记录,因为根据定义,未加载的属性上不会有待处理的状态更改。...#2590 不再将“=”在 MS-SQL 中与子查询比较时自动转换为 IN 我们在 MSSQL 方言中发现了一个非常古老的行为,当用户尝试做类似这样的事情时,它会试图拯救用户: scalar_subq

    15410

    SqlAlchemy 2.0 中文文档(五十六)

    这些子查询在大多数数据库中都会被拒绝,因为通常需要一个名称,除了 SQLite 外。然而,一些应用程序可能需要调整一些意外依赖于此的查询。...在现代 SQLAlchemy 中,已经实现了这个目标,这两个对象现在在功能上完全重叠。统一这些对象的主要挑战是 select() 对象需要保持对 ORM 完全不可知。...这些子查询在大多数数据库中都会被拒绝,因为通常需要一个名称,除了 SQLite 外。然而,一些应用程序可能需要调整一些意外依赖于此的查询。...在现代 SQLAlchemy 中,这一目标已经实现,这两个对象现在在功能上完全重叠。统一这些对象的主要挑战是,select() 对象需要保持与 ORM 完全无关。...在现代 SQLAlchemy 中,当使用联接预加载集合时,必须调用Result.unique()方法时,在现代 SQLAlchemy 中,selectinload()策略提供了一个集合导向的预加载器,在大多数情况下优于

    48810

    SqlAlchemy 2.0 中文文档(七十六)

    另请参见 右嵌套内连接在联接急切加载中可用 - 介绍了 0.9.4 中引入的功能。...然而,联接的急切加载一直将上述情况视为主查询需要在子查询中的情况,就像在主查询应用了 LIMIT 时通常需要的 B 对象集合一样: SELECT anon_1.a_id AS anon_1_a_id...因此,这里的更改是鼓励用户在部分或完全由文本片段组成的 SQL 中对文本字符串进行限定。...另请参阅 处理重复的联接目标中的更改和修复 #3222 关键行为更改 - 核心 将完整的 SQL 片段强制转换为 text() 时发出警告 自 SQLAlchemy 成立以来,一直强调不妨碍纯文本的使用...因此,这里的更改是鼓励用户在部分或完全由文本片段组成的 SQL 中对文本字符串进行限定。

    10510

    SqlAlchemy 2.0 中文文档(五十五)

    在其他数据库中,为子查询命名仍然更清晰,以解决子查询内部列名的任何歧义。 除了上述实际原因外,还有许多其他与 SQLAlchemy 相关的原因导致进行了更改。...如果我们想要使用连接从Employee和Manager模型中查询,那么在 SQL 层面上,“employee”表需要在查询中包含两次,这意味着它必须被别名化。...在其他数据库中,子查询有一个名称来解析子查询内部列名的任何歧义仍然更清晰。 除了上述实际原因外,还有很多其他与 SQLAlchemy 相关的原因导致进行此更改。...对于联接继承和其他基于联接的映射,通常希望添加使用aliased.flat参数,这将允许通过将别名应用于联接中的各个表来对两个或更多表进行联接别名化,而不是将联接嵌入到新的子查询中: >>> from...在其他数据库中,为子查询命名仍然更清晰,以解决在子查询内部对列名的未来引用可能产生的任何歧义。 除了上述实际原因外,还有许多其他基于 SQLAlchemy 的原因导致了这一更改的进行。

    44310

    mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    需要强调,表的连接所依据的关系是在where子句中定义的。在实际应用中,用户要实现表的连接必然要依据一定的关系。 如果不指明连接关系,即不使用where子句。...它实际返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行乘以第二个表中符合查询条件的数据行数,即10X11=110条记录。...缺点是,虽然可以指定查询结果包括哪些列,但是不能人为地指定哪些列被匹配。另外,自然连接的一个特点是连接后的结果表中匹配的列只有一个。如上,在自然连接后的表中只有一列C。...外连接 不管是内连接还是带where子句的多表查询,都组合自多个表,并生成结果表。换句话说,如果任何一个源表中的行在另一个源表中没有匹配,DBMS将把该行放在最后的结果表中。...SQL的外连接共有三种类型:左外连接,右外连接,全外连接。

    2.5K20

    SqlAlchemy 2.0 中文文档(十五)

    另请参见 动态关系加载器 - 在 ORM 查询指南中 仅写关系 - 用于大型集合的更普遍有用的方法,不应完全加载到内存中。...另请参阅 创建自定义外键条件 remote() function sqlalchemy.orm.remote(expr: _CEA) → _CEA 使用“remote”注解注释主要联接表达式的一部分。...对于 SQLAlchemy 1.x 的用户 在 SQLAlchemy 2.x 系列中,ORM 的 SQL SELECT 语句是使用与 Core 中相同的select()构造而构建的,然后在Session...此对象用于在标量子查询中与 SQL EXISTS 关键字一起呈现。relationship() 构造提供了一些辅助方法,可用于生成一些常见的 EXISTS 样式的查询,这些查询涉及关系。...SQLAlchemy 统一教程中的 EXISTS 子查询一节中引入。

    26110

    SqlAlchemy 2.0 中文文档(七十五)

    #3708 ### 改进了具有多态实体的 Query.correlate 方法 在最近的 SQLAlchemy 版本中,许多形式的“多态”查询生成的 SQL 比以前更“扁平化”,不再无条件地将多个表的...通过在相关子查询中明确引用它,多态形式被正确使用。...#3708 ### 改进 Query.correlate 方法与多态实体 在最近的 SQLAlchemy 版本中,许多形式的“多态”查询生成的 SQL 比以前更“扁平化”,其中多个表的 JOIN 不再无条件地捆绑到子查询中...#3708 改进查询中的 Query.correlate 方法与多态实体 在最近的 SQLAlchemy 版本中,许多形式的“多态”查询生成的 SQL 比以前更“扁平化”,其中多个表的 JOIN 不再无条件地捆绑到子查询中...通过在相关子查询中明确引用它,多态形式被正确使用。

    33010

    SQL和Python中的特征工程:一种混合方法

    我的特征工程代码看起来很丑陋,散布在许多单元中。 当我直接开始使用SQL进行功能设计时,这些问题自然就会解决。因此,在这篇文章中,我将通过处理实战挑战数据集来分享一些我最喜欢的技巧。...安装sqlalchemy 您需要Pandas和sqlalchemy才能在Python中使用SQL。你可能已经有Pandas了。...连接表是最慢的操作,因此我们希望从每个连接中获得尽可能多的功能。在此数据集中,我实现了四种类型的联接,从而产生了四组要素。详细信息并不重要,但是您可以在此处找到我的所有SQL代码段 。...在两种情况下,SQL方法更加有效: 如果您的数据集已部署在云上,则您可以运行分布式查询。今天,大多数SQL Server支持分布式查询。在熊猫中,您需要一些名为Dask DataFrame的扩展 。...这种方法的一个基本限制是您必须能够直接使用Python连接到SQL Server。如果无法做到这一点,则可能必须将查询结果下载为CSV文件并将其加载到Python中。 希望这篇文章对您有所帮助。

    2.7K10
    领券