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

SqlAlchemy 2.0 中文文档(七十二)

,而不是创建子查询 为了实现 2.0 风格对Select的使用,特别是统一Query和Select的目标,关键是有一个工作的Select.join()方法,其行为类似于Query.join()方法,向现有...SELECT 的 FROM 子句添加额外条目,然后返回新的Select对象以进行进一步修改,而不是将对象包装在未命名的子查询中并从该子查询返回 JOIN,这种行为对用户来说一直是几乎无用和完全误导的。...为实现这一目标,构建语句中发生的大部分 Python 计算,特别是 ORM Query以及在调用 ORM 查询时使用的select() 构造时的计算,正在被移至语句的编译阶段,该阶段仅在语句被调用后发生...在另一个 SELECT 的 FROM 子句中包含一个 SELECT 的行为,而不先创建别名或子查询,会导致创建一个无名称的子查询。虽然标准 SQL 支持这种语法,但实际上大多数数据库都会拒绝。...子句添加额外条目,然后返回新的Select对象以进行进一步修改,而不是将对象包装在一个无名子查询中,并从该子查询返回 JOIN,这种行为对用户来说一直是几乎无用和完全误导的。

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

    SqlAlchemy 2.0 中文文档(八十)

    在这些情况下,预加载连接直接针对父表进行,同时包括限制/偏移,而不需要额外的子查询开销,因为多对一连接不会向结果添加行。...在与 SQLite 一起使用复杂的复合时,现在需要将第一个元素转换为子查询(这也在 PG 上兼容)。...子查询加载通常对加载许多较大的集合更有效,因为它无条件地使用 INNER JOIN,并且还不会重新加载父行。...在 0.5 中,已移除了此自动转换,因此实际上可以使用表绑定列来覆盖多态查询时发生的转换;这使得Query能够在连接表或具体表继承设置中创建优化的选择,以及可移植的子查询等。...在 0.5 中,这种自动转换已被移除,因此实际上可以使用表绑定的列来覆盖多态查询时发生的转换;这使得Query能够在连接表或具体表继承设置中创建优化的选择,以及可移植的子查询等。

    20310

    SqlAlchemy 2.0 中文文档(二)

    然后,该子查询在包含 SELECT 语句的 COLUMNS 或 WHERE 子句中使用,并且与常规子查询不同之处在于它不在 FROM 子句中使用。...结果显示了一系列User和Address对象,其中每个Address对象的数据最终来自对address表的子查询,而不是直接来自该表: >>> subq = select(Address).where(...结果显示了一系列 User 和 Address 对象,其中每个 Address 对象的数据最终来自于对 address 表的子查询,而不是直接来自该表: >>> subq = select(Address...然后,在封闭的 SELECT 语句的 COLUMNS 或 WHERE 子句中使用该子查询,它与常规子查询不同,因为它不在 FROM 子句中使用。...某些类别的函数返回整行而不是列值,在需要引用特定列的情况下;这些函数被称为表值函数。

    45410

    SqlAlchemy 2.0 中文文档(十八)

    使用列推迟限制加载的列 列推迟 指的是在查询该类型的对象时,从 SELECT 语句中省略的 ORM 映射列。...with_expression() 作为对象加载选项,仅对查询的最外层部分以及对完整实体的查询起作用,而不适用于任意列选择、子查询或复合语句的元素,比如 UNION。...] (4,) 可以在一条语句中使用多个defer()选项,以将多个列标记为延迟加载。 与load_only()一样,defer()选项也包括将延迟属性在访问时引发异常而不是惰性加载的能力。...with_expression() 作为对象加载选项,只对查询的最外层部分生效,并且仅适用于对完整实体进行的查询,而不适用于子查询中的任意列选择或复合语句(如 UNION)的元素。...如果在将用作子查询或作为联合等复合语句中的元素的`select()`内部使用,则不会产生任何效果。 为了在子查询中使用任意的 SQL 表达式,应该使用正常的 Core 风格添加表达式的方法。

    27910

    SqlAlchemy 2.0 中文文档(五十六)

    ORM 查询 - 使用属性列表进行链接的链式形式,而不是单独调用,已移除 概要 关于 ORM 查询 - 加入 / 加载关系使用属性,而不是字符串的方式将被移除: # chaining removed q...在版本 1.4 中,它已经增强,以便对同一个子查询多次进行不同实体的使用。...随着新方法的推出,对象演变为 Query 对象,新增功能如能够选择单个列、能够一次选择多个实体、能够从 Query 对象而不是从 select 对象构建子查询。...在 1.4 版本中已增强了对同一子查询多次使用不同实体的支持。...随着新方法的推出,该对象演变为Query对象,新增了诸如能够选择单个列、能够一次选择多个实体、能够从Query对象构建子查询而不是从select对象开始的新功能。

    48810

    SqlAlchemy 2.0 中文文档(七十三)

    这再次提供了显著的性能改进,因为 ORM 现在可以在一个查询中加载大量集合,而根本不使用 JOIN 或子查询。...#4365 ### FOR UPDATE 子句在联合加载子查询中以及外部呈现 此更改特别适用于使用joinedload()加载策略与行限制查询结合使用时,例如使用Query.first()或Query.limit...在读取方面,在 Python 2 下已添加了对 CHAR/VARCHAR/CLOB 结果行的自动 Unicode 转换,以匹配 Python 3 下 cx_Oracle 的行为。...这再次提供了显着的性能改进,因为 ORM 现在可以一次性加载大量集合,而完全不使用 JOIN 或子查询。...#4365 FOR UPDATE 子句在连接贪婪加载子查询内部以及外部都被渲染 此更改特别适用于使用joinedload()加载策略与行限制查询结合使用时,例如使用Query.first()或Query.limit

    24410

    SqlAlchemy 2.0 中文文档(七十七)

    #2161 行为变化 - ORM 当按属性查询时,现在会返回组合属性的对象形式 现在,将Query与组合属性结合使用时,会返回由该组合维护的对象类型,而不是被拆分为个别列。...对于某些查询,子查询预加载将在最内层的 SELECT 上应用 DISTINCT 在涉及到一对多关系时,子查询预加载可能会生成重复行的数量,因此当连接目标列不包含主键时,会对最内层的 SELECT 应用...#2161 行为变更 - ORM 当按属性查询时,现在会以它们的对象形式返回复合属性 现在,使用 Query 与复合属性一起,会返回该复合属性维护的对象类型,而不是拆分为各个列。...子查询急加载将对某些查询的最内层 SELECT 应用 DISTINCT 为了减少在涉及到多对一关系时子查询急加载可能生成的重复行数,当连接的目标是不包含主键的列时,将在最内层的 SELECT 中应用 DISTINCT...子查询急切加载将对某些查询的最内部 SELECT 应用 DISTINCT 为了减少涉及多对一关系时子查询急切加载可能生成的重复行数,当连接针对不包括主键的列时,将在最内部 SELECT 中应用 DISTINCT

    15010

    SqlAlchemy 2.0 中文文档(七十五)

    #3601 ### 修复涉及用户发起的外键操作的多对一对象移动 已修复了涉及用另一个对象替换多对一引用机制的 bug。在属性操作期间,先前引用的对象位置现在使用数据库提交的外键值,而不是当前外键值。...;文本 SQL 的位置列设置 在 1.0 系列中对ResultProxy系统进行了一系列改进,作为#918的一部分,重新组织内部以按位置匹配游标绑定的结果列与表/ORM 元数据,而不是通过匹配名称,用于包含有关要返回的结果行的完整信息的编译...对多态映射使用相关子查询仍然存在一些未完善的地方。例如,如果Person多态链接到所谓的“具体多态联合”查询,上述子查询可能无法正确引用此子查询。...(),允许将属性上的 None 值设置为 NULL,而不是在 INSERT 语句中省略该列,这会导致使用列级默认值。...对多态映射使用相关子查询仍然存在一些未完善的地方。例如,如果Person多态链接到所谓的“具体多态联合”查询,上述子查询可能无法正确引用此子查询。

    33010

    SqlAlchemy 2.0 中文文档(三十七)

    当覆盖内置 SQL 结构的编译时,@compiles 装饰器会调用适当的类(确保使用类,即 Insert 或 Select,而不是创建函数,比如 insert() 或 select())。...你在 SELECT 语句的“列”子句中(以及 order by 和 group by)放置的任何东西都可以从这个派生 - 该对象将自动具有 Python 的“比较”行为。...结构引用的映射器、表、列、会话等在序列化形式中不会被持久化,而是在反序列化时重新关联到查询结构。...序列化器模块仅适用于查询结构。不需要: 用户定义类的实例。在典型情况下,这些类不包含对引擎、会话或表达式构造的引用,因此可以直接序列化。...如果对应于对象的 SQL 不根据此类的本地属性(而不是其超类)更改,则可以在特定类上将此标志设置为 True。

    35410

    SqlAlchemy 2.0 中文文档(十五)

    ON UPDATE CASCADE,没有外键支持 在使用不支持引用完整性的数据库,并且使用具有可变值的自然主键时,SQLAlchemy 提供了一个功能,允许将主键值传播到已引用的外键到有限程度,通过针对立即引用主键列的外键列发出...SQLAlchemy 2.0 中的新 PEP 484 特性还利用了属性在源代码中明确存在而不是使用动态属性生成。...;子查询返回的列与实体映射的列之间必须存在列对应关系,这意味着子查询最终需要来自这些实体,就像下面的示例中一样: >>> inner_stmt = select(User).where(User.id...,该查询可以通过将其组织成子查询并使用 aliased() 将其链接到 ORM 实体来进一步修改,如 从子查询中选择实体 中已说明。...包含跨越多个 ORM 实体的列的子查询可以同时应用于多个aliased()构造,并且在每个实体的情况下都可以在相同的Select构造中使用。

    26110

    SqlAlchemy 2.0 中文文档(二十一)

    对于对特定列进行精细控制的计数,跳过子查询的使用或以其他方式控制 FROM 子句,或使用其他聚合函数,可以结合使用expression.func表达式和 Session.query(),例如: from...如果返回多个对象标识,或者对于仅返回标量值而不是完全映射实体的查询返回多行,则引发 sqlalchemy.orm.exc.MultipleResultsFound。...如果返回多个对象标识,或者如果对于返回标量值而不是完整标识映射的实体的查询返回多行,则引发sqlalchemy.orm.exc.MultipleResultsFound。...如果不是,ObjectDeletedError 被引发。 Query.get() 仅用于返回单个映射实例,而不是多个实例或单个列构造,并且严格地基于单个主键值。...如果返回多个对象标识,或者如果返回多行用于仅返回标量值而不是完整身份映射实体的查询,则引发sqlalchemy.orm.exc.MultipleResultsFound。

    57410

    SqlAlchemy 2.0 中文文档(七十四)

    这用于在语句执行时将元素列表渲染为单独的绑定参数,而不是在语句编译时。这允许将单个绑定参数名称链接到多个元素的 IN 表达式,同时还允许使用查询缓存与 IN 表达式。...这将改变查询的结果,该查询比较了一个在与空集合进行比较时求值为 NULL 的 SQL 表达式或列,产生了布尔值 false 或 true(对于 NOT IN),而不是 NULL。...这是用于 IN 表达式的,其中元素列表在语句执行时被渲染为单独的绑定参数,而不是在语句编译时。这允许将单个绑定参数名称链接到多个元素的 IN 表达式,并且允许使用查询缓存与 IN 表达式。...这用于在IN表达式中,元素列表在语句执行时被渲染为单独的绑定参数,而不是在语句编译时。这允许将单个绑定参数名称链接到多个元素的 IN 表达式,并允许使用查询缓存与 IN 表达式一起使用。...#2694 对“float”数据类型进行了更强的类型化 一系列更改允许使用Float数据类型更强烈地将其与 Python 浮点值关联起来,而不是更通用的Numeric。

    40710

    SqlAlchemy 2.0 中文文档(七十六)

    在编译期间,字符串参数会被主动与列子句中的条目匹配,因此上述语句将产生我们期望的结果,不会有警告(尽管请注意 "name" 表达式已解析为 users.name!)...#3139 ### 使用 yield_per 明确禁止连接/子查询即时加载 为了使 Query.yield_per() 方法更容易使用,在使用 yield_per 时如果任何子查询即时加载器或将使用集合的连接即时加载器生效...在编译过程中,给定的字符串参数会与列子句中的条目进行主动匹配,因此上述语句将按我们的期望产生,没有警告(尽管请注意,"name"表达式已解析为users.name!)...在编译过程中,给定的字符串参数会被主动匹配到列子句中的条目,因此上述语句会按我们的期望产生结果,没有警告(尽管请注意"name"表达式已解析为users.name!)...在编译过程中,给定的字符串参数会被主动匹配到列子句中的条目,因此上述语句会按我们的期望产生结果,���有警告(尽管请注意"name"表达式已解析为users.name!)

    10510

    SqlAlchemy 2.0 中文文档(五十五)

    ,在另一个 SELECT 语句中使用 SELECT 会产生一个带括号的无名称子查询。...对于连接继承和其他基于连接的映射,通常希望添加使用aliased.flat参数,这将允许通过将别名应用于连接中的各个表来对两个或更多表进行连接别名化,而不是将连接嵌入到新的子查询中: >>> from...在大多数情况下,这种形式的 SQL 不是很有用,因为像 MySQL 和 PostgreSQL 这样的数据库要求 FROM 子句中的子查询具有命名别名,这意味着需要使用SelectBase.alias()...在其他数据库中,为子查询命名仍然更清晰,以解决在子查询内部对列名的未来引用可能产生的任何歧义。 除了上述实际原因外,还有许多其他基于 SQLAlchemy 的原因导致了这一更改的进行。...对于连接继承和其他基于连接的映射,通常希望添加使用 aliased.flat 参数的使用,这将允许通过将别名应用于连接中的各个表来对两个或多个表进行 JOIN,而不是将连接嵌入到新的子查询中: >>>

    44310

    SqlAlchemy 2.0 中文文档(三十六)

    注意 使用 Python 可调用函数的 Python 端默认值仅在整个语句中被调用一次,而不是每行一次。 method inline() → Self 使此 Insert 构造“内联”。...当设置时,通过default关键字在Column对象上存在的 SQL 默认值将被‘内联’编译到语句中,而不是预先执行。...注意 使用 Python 可调用函数的 Python 端默认值将仅在整个语句中被调用 一次,而不是每行一次。 method inline() → Self 将此 Insert 构造“内联”。...joins_implicitly - 当为 True 时,可以在 SQL 查询的 FROM 子句中使用表值函数,而无需对其他表进行显式的 JOIN,并且不会生成“笛卡尔积”警告。...joins_implicitly – 当为 True 时,可以在 SQL 查询的 FROM 子句中使用表值函数,而无需对其他表进行显式 JOIN,并且不会生成“笛卡尔积”警告。

    40410

    SqlAlchemy 2.0 中文文档(五十八)

    参考:#6195 [sqlite] [用例] SQLite 方言现在支持 UPDATE…FROM 语法,用于 UPDATE 语句可能在语句的 WHERE 条件中引用其他表而无需使用子查询。...参考:#9610 [sql] [bug] 在 DDL 编译器中对 hashlib.md5() 的使用进行了限定,该函数用于在 DDL 语句中为长索引和约束名称生成确定性的四字符后缀,以包括 Python...参考:#10192 [orm] [bug] 修复了一些形式的 ORM “注释” 无法对使用 Select.join() 进行的子查询进行注释的根本问题,这些子查询在特殊情况下使用,比如在 PropComparator.and...然而,目前“ORM 标志”的规则已经放宽,因此任何语句,包括在 WHERE / ORDER BY / GROUP BY 子句中的 ORM 实体或属性,在标量子查询中等都将启用此标志。...但是,目前,“ORM-flag”的规则已经放宽,以便包含 ORM 实体或属性的语句中的任何地方,包括仅在 WHERE / ORDER BY / GROUP BY 子句中,在标量子查询中等,将启用此标志。

    16710

    SqlAlchemy 2.0 中文文档(十九)

    user: Mapped[User] = relationship(lazy="joined") 连接预加载通常作为查询的选项应用,而不是作为映射的默认加载选项,特别是在用于集合而不是多对一引用时。...这种加载样式发出一个 SELECT,该 SELECT 引用父对象的主键值,或者在一对多关系的情况下引用子对象的主键值,以便在 IN 子句中加载相关联的关系: >>> from sqlalchemy import...子查询本身也可能因为所使用的数据库的具体情况而产生性能惩罚。 “子查询”加载在正确工作时会施加一些特殊的排序要求。...user: Mapped[User] = relationship(lazy="joined") 连接式急加载通常作为查询的选项应用,而不是作为映射的默认加载选项,特别是当用于集合而不是多对一引用时。...这种加载样式发出一个 SELECT,该 SELECT 引用父对象的主键值,或者在一对多关系的情况下引用子对象的主键值,位于 IN 子句中,以加载相关联的关系: >>> from sqlalchemy import

    28010
    领券