SqlAlchemy 2.0 中文文档(五十八)(5)https://developer.aliyun.com/article/1563137
2.0.23
发布日期:2023 年 11 月 2 日
orm
- [orm] [usecase]
对于新样式批量 ORM 插入,实现了Session.bulk_insert_mappings.render_nulls参数,允许render_nulls=True作为执行选项。这允许参数字典中含有混合的None值的批量 ORM 插入使用给定的字典键的单个行批次,而不是将每个 INSERT 中的 NULL 列分开成批次。
另请参阅
在 ORM 批量 INSERT 语句中发送 NULL 值
参考:#10575 - [orm] [bug]
修复了__allow_unmapped__指令无法允许旧式Column/deferred()映射的问题,这些映射尽管没有Mapped[]作为它们的类型,但仍然具有诸如Any或特定类型的注释,并且不会出现有关定位属性名称的错误。
参考:#10516 - [orm] [bug]
修复了使用with_expression()结构与加载器选项selectinload()、lazyload()结合使用时,在后续缓存运行中无法正确替换绑定参数值的缓存错误。
参考:#10570 - [orm] [bug]
修复了 ORM 注释的声明式中的错误,其中使用ClassVar,但仍然以某种方式引用了 ORM 映射类名,将无法解释为未映射的ClassVar。
参考:#10472
sql
- [sql] [usecase]
为 PostgreSQL 和 Oracle 方言的Interval数据类型实现了“文字值处理”,允许文字渲染间隔值。Pull request 由 Indivar Mishra 提供。
参考:#9737 - [sql] [bug]
修复了在某些与其他文字渲染参数的组合中,使用相同的绑定参数超过一次并且literal_execute=True会导致错误值渲染的问题,这是由于迭代问题造成的。
此更改也已被回溯至:1.4.50
参考:#10142 - [sql] [bug]
为所有包含文字处理的数据类型的“文字处理器”添加了编译器级的 None/NULL 处理,即在 SQL 语句中将值内联呈现而不是作为绑定参数,适用于所有那些不具有显式“null 值”处理的类型。之前,这种行为是未定义且不一致的。
参考:#10535 - [sql]
移除了未使用的占位符方法TypeEngine.compare_against_backend()。该方法被 Alembic 的非常旧的版本使用。有关详细信息,请参见github.com/sqlalchemy/alembic/issues/1293。
asyncio
- [asyncio] [bug]
修复了AsyncSession.close_all()方法的错误。还添加了函数close_all_sessions(),它是close_all_sessions()的等效项。Pull request 由 Bryan 不可思议 提供。
参考:#10421
postgresql
- [postgresql] [bug]
修复了 2.0 中由 #7744 引起的回归,其中涉及 PostgreSQL JSON 操作符与其他操作符(如字符串连接)组合的表达式链会由于特定于 PostgreSQL 方言的实现细节而失去正确的括号,。
参考:#10479 - [postgresql] [bug]
当使用 asyncpg 后端和BIT数据类型时,修复了“insertmanyvalues”的 SQL 处理。 asyncpg 上的BIT显然需要使用 asyncpg 特定的BitString类型,该类型当前在使用此 DBAPI 时公开,使其与其他所有在此处使用普通位串的 PostgreSQL DBAPI 不兼容。 在版本 2.1 中的未来修复将会使这种数据类型在所有 PG 后端上正规化。 感谢 Sören Oldag 提交的拉取请求。
参考:#10532
mysql
- [mysql] [bug]
修复了 MySQL “预 Ping”例程中的新不兼容性,其中传递给connection.ping()的False参数,该参数旨在禁用不需要的“自动重新连接”功能,在 MySQL 驱动程序和后端中被弃用,并且对于某些版本的 MySQL 本机客户端驱动程序正在产生警告。 对于 mysqlclient,它已被删除,而对于 PyMySQL 和基于 PyMySQL 的驱动程序,该参数将在某个时候被弃用并删除,因此使用 API 内省来对抗这些不同阶段的移除。
此更改也已回溯到:1.4.50
参考:#10492
mariadb
- [mariadb] [bug]
当使用 MariaDB 时,调整了 MySQL / MariaDB 方言,如果未使用显式的True或False值指定Column.nullable,则将生成的列默认设置为 NULL,因为 MariaDB 不支持具有生成列的“NOT NULL”短语。 感谢 Indivar 提交的拉取请求。
参考:#10056 - [mariadb] [bug] [regression]
为似乎是 MySQL/MariaDB 驱动程序之间的固有问题建立了一个解决方法,该问题在使用 SQLAlchemy 的“空 IN”条件返回不包含行的 DELETE DML 的 RETURNING 结果时失败,该 DELETE DML 在 2.0 系列中用于“同步会话”功能的批量 DELETE 语句。 为了解决这个问题,当检测到“给定 RETURNING 时没有描述”的特定情况时,将生成一个带有正确游标描述的“空结果”,并将其用于替代不起作用的游标。
参考:#10505
mssql
- [mssql] [usecase]
已添加对基于 pyodbc 和通用 aio*方言架构构建的 SQL Server 的aioodbc驱动程序的支持。
另请参阅
aioodbc - 在 SQL Server 方言文档中。
参考:#6521 - [mssql] [bug] [reflection]
修复了在具有大于 18 位数的大型标识起始值的 bigint 列的情况下,标识列反射将失败的问题。
此更改也反向移植到:1.4.50
参考:#10504
oracle
- [oracle] [bug]
在Interval数据类型中修复了问题,其中 Oracle 实现未用于 DDL 生成,导致day_precision和second_precision参数被忽略,尽管该方言支持。感谢 Indivar 的 Pull 请求。
参考:#10509 - [oracle] [bug]
修复了 cx_Oracle 方言声称支持比实际上在 SQLAlchemy 2.0 系列中实际支持的更低的 cx_Oracle 版本(7.x)的问题。方言导入了仅在 cx_Oracle 8 或更高版本中才有的符号,因此运行时方言检查以及 setup.cfg 要求已更新以反映此兼容性。
参考:#10470
orm
- [orm] [usecase]
实现了Session.bulk_insert_mappings.render_nulls参数,用于新样式的批量 ORM 插入,允许render_nulls=True作为执行选项。这允许在参数字典中使用None值的批量 ORM 插入使用给定的一组字典键的单个行批次,而不是将其拆分为省略每个 INSERT 中的 NULL 列的批次。
另请参阅
在 ORM 批量 INSERT 语句中发送 NULL 值
参考:#10575 - [orm] [bug]
修复了__allow_unmapped__指令无法允许具有Any或没有Mapped[]作为其类型的特定类型的注释的遗留Column/deferred()映射的问题,而无需与定位属性名称相关的错误。
参考:#10516 - [orm] [bug]
修复了使用with_expression()结构与加载器选项selectinload(),lazyload()结合使用时,与后续缓存运行中正确替换绑定参数值失败的缓存错误。
引用:#10570 - [orm] [bug]
修复了 ORM 注释声明中的错误,其中使用了一个ClassVar,尽管以某种方式引用了 ORM 映射的类名,但未能被解释为未映射的ClassVar。
引用:#10472
sql
- [sql] [usecase]
实现了对于Interval数据类型的“字面值处理”,适用于 PostgreSQL 和 Oracle 方言,允许直接渲染间隔值。感谢 Indivar Mishra 提供的拉取请求。
引用:#9737 - [sql] [bug]
修复了一个问题,即在某些与其他字面渲染参数组合使用literal_execute=True时,多次使用相同的绑定参数会由于迭代问题导致错误的值渲染。
此更改还回溯到:1.4.50
引用:#10142 - [sql] [bug]
为所有包含字面处理的数据类型的“字面处理器”添加了编译器级 None/NULL 处理,即在 SQL 语句中将值内联呈现而不是作为绑定参数,对于所有不具有显式“空值”处理的类型。以前,此行为是未定义的且不一致的。
引用:#10535 - [sql]
移除了未使用的占位符方法TypeEngine.compare_against_backend(),此方法仅用于非常旧版本的 Alembic。有关详细信息,请参见github.com/sqlalchemy/alembic/issues/1293。
asyncio
- [asyncio] [bug]
修复了AsyncSession.close_all()方法无法正常工作的错误。还添加了函数close_all_sessions(),它等同于close_all_sessions()。拉取请求由 Bryan 不可思议 提供。
引用:#10421
postgresql
- [postgresql] [bug]
修复了由 #7744 引起的 2.0 版本回归,其中涉及 PostgreSQL JSON 运算符的表达式链与其他运算符(如字符串连接)组合会丢失正确的括号化,这是由于特定于 PostgreSQL 方言的实现细节造成的。
参考:#10479 - [postgresql] [bug]
修复了在使用 asyncpg 后端时使用BIT数据类型的 “insertmanyvalues” 的 SQL 处理问题。在 asyncpg 上,BIT显然需要使用 asyncpg 特定的BitString类型,目前在使用此 DBAPI 时暴露,这使其与其他 PostgreSQL DBAPI 不兼容,所有这些 DBAPI 都在这里使用普通的位字符串。在版本 2.1 中,将通过将此数据类型在所有 PG 后端上归一化来解决此问题。拉取请求由 Sören Oldag 提供。
参考:#10532
mysql
- [mysql] [bug]
修复了 MySQL 的 “pre-ping” 例程中的一个新的不兼容性,其中传递给connection.ping()的False参数,用于禁用不想要的 “自动重新连接” 功能,正在被 MySQL 驱动程序和后端弃用,并且对某些版本的 MySQL 的本机客户端驱动程序产生警告。对于 mysqlclient,它已被移除,而对于 PyMySQL 和基于 PyMySQL 的驱动程序,该参数将在某个时候被弃用并移除,因此使用 API 内省来未来证明对这些移除的各个阶段进行了保护。
这个更改也被回溯到了:1.4.50
参考:#10492
mariadb
- [mariadb] [bug]
调整了 MySQL / MariaDB 方言,当使用 MariaDB 时,默认将生成的列设置为 NULL,如果Column.nullable没有使用显式的True或False值进行指定,因为 MariaDB 不支持带有生成列的“NOT NULL”短语。拉取请求由 Indivar 提供。
参考:#10056 - [mariadb] [bug] [regression]
建立了一个解决 MySQL/MariaDB 驱动程序中似乎存在的一个固有问题的方法,即对于使用 SQLAlchemy 的 “空 IN” 条件返回不返回任何行的 DELETE DML 的 RETURNING 结果,失败提供 cursor.description,然后返回没有行的结果,导致在 2.0 系列中为 ORM 使用 RETURNING 用于“同步会话”功能的批量 DELETE 语句时出现回归。为了解决这个问题,当检测到 “给出 RETURNING 时没有描述” 的特定情况时,会生成一个带有正确游标描述的“空结果”,并在非工作游标的位置使用它。
参考:#10505
mssql
- [mssql] [usecase]
为 SQL Server 实现的aioodbc驱动添加了支持,该驱动建立在 pyodbc 和通用 aio* 方言架构之上。
另请参阅
aioodbc - 在 SQL Server 方言文档中。
参考:#6521 - [mssql] [bug] [reflection]
修复了对于具有大于 18 位数的大整数起始值的 bigint 列的身份列反射失败的问题。
此更改也被 回溯 至:1.4.50
参考:#10504
oracle
- [oracle] [bug]
修复了Interval数据类型中的问题,在 Oracle 实现未用于 DDL 生成,导致day_precision和second_precision参数被忽略,尽管该方言支持这些参数。Indivar 提供的拉取请求。
参考:#10509 - [oracle] [bug]
修复了 cx_Oracle 方言声称支持比实际在 SQLAlchemy 2.0 系列中支持的更低的 cx_Oracle 版本(7.x)的问题。方言导入了仅在 cx_Oracle 8 或更高版本中才存在的符号,因此运行时方言检查以及 setup.cfg 要求已更新以反映此兼容性。
参考:#10470
2.0.22
发布日期:2023 年 10 月 12 日
orm
- [orm] [usecase]
添加了Session.get_one()方法,其行为类似于Session.get(),但是如果未找到具有提供的主键的实例,则引发异常而不是返回None。由 Carlos Sousa 提供的拉取请求。
参考:#10202 - [orm] [usecase]
添加了一个选项以永久关闭会话。将新参数Session.close_resets_only设置为False将阻止在调用Session.close()后执行任何其他操作。
添加了新方法Session.reset(),它将一个Session重置为其初始状态。这是Session.close()的别名,除非Session.close_resets_only设置为False。
参考:#7787 - [orm] [bug]
修复了一系列mapped_column()参数,在 pep-593Annotated对象中使用mapped_column()对象时未被传递,包括mapped_column.sort_order,mapped_column.deferred,mapped_column.autoincrement,mapped_column.system,mapped_column.info等。
另外,仍然不支持使用mapped_column.kw_only等数据类参数,这些参数在通过Annotated接收的mapped_column()中指定,因为这在 pep-681 数据类转换中不受支持。当以这种方式在Annotated中使用这些参数时,将发出警告(并且它们继续被忽略)。
参考:#10046, #10369 - [orm] [bug]
修复了使用 ORM 中的新式select()查询调用Result.unique()方法时的问题,在此查询中,一个或多个列产生的值是“未知可哈希性”,通常是在使用func.json_build_object()等 JSON 函数时没有提供类型时会导致内部失败。在这种情况下,修复了将对象作为接收到的对象测试其可哈希性的行为,并在不可哈希时引发一个信息性错误消息。请注意,对于“已知不可哈希性”的值,例如直接使用JSON或ARRAY类型时,已经会引发一个信息性错误消息。
这里的“可哈希性测试”修复也适用于传统的Query,然而在传统情况下,几乎所有的查询都使用Result.unique(),因此这里不会发出新的警告;在这种情况下,保持了使用id()的传统行为,改进是一个未知类型如果被证明是可哈希的,那么现在将被独特化,而以前是不会的。
参考:#10459 - [orm] [bug]
修复了最近修订的“insertmanyvalues”功能中的回归(可能是问题 #9618),在这种情况下,ORM 会不经意地将一个非 RETURNING 结果误解为具有 RETURNING 结果,这是因为将implicit_returning=False参数应用于映射的Table时指示“insertmanyvalues”不能在不提供主键值的情况下使用。
参考:#10453 - [orm] [bug]
修复了 ORMwith_loader_criteria()不会应用于Select.join()的 bug,其中 ON 子句被给定为一个普通的 SQL 比较,而不是作为一个关系目标或类似的东西。
参考:#10365 - [orm] [bug]
修复了当作为给定注释的子模块的元素引用时,无法正确解析Mapped符号(如WriteOnlyMapped和DynamicMapped)的问题,假设注释是基于字符串或“未来注释”样式的。
参考:#10412 - [orm] [bug]
修复了使用__allow_unmapped__声明选项时的问题,其中使用集合类型(例如list[SomeClass])声明的类型与使用 typing 构造List[SomeClass]的类型无法正确识别。由 Pascal Corpet 提供的拉取请求。
参考:#10385
engine
- [engine] [bug]
修复了一些方言中可能出现的问题,即方言可能会对根本不返回行的 INSERT 语句错误地返回空结果集,这是由于仍然存在来自行的主键的预获取或后获取的影响所致。受影响的方言包括 asyncpg 和所有的 mssql 方言。 - [engine] [bug]
修复了在某些垃圾回收/异常场景下,连接池的清理例程会由于意外的状态集而引发错误的问题,在特定条件下可以重现该问题。
参考:#10414
sql
- [sql] [bug]
修复了一个问题,即在 UPDATE 语句的 SET 子句中引用 FROM 条目时,如果该条目在语句中没有其他地方,则不会将其包括在 UPDATE 语句的 FROM 子句中;目前,对于使用Update.add_cte()添加的 CTE(通用表达式),以提供所需的 CTE 的情况,会出现这种情况。
参考:#10408 - [sql] [bug]
修复了 2.0 版本的回归问题,即由于移除了未被考虑到的on属性而导致DDL结构不再执行__repr__()。由 Iuri de Silvio 提供的拉取请求。
参考:#10443
typing
- [typing] [bug]
修复了传递给Values的参数列表过于严格地与List而不是Sequence绑定的类型问题。由 Iuri de Silvio 提供的拉取请求。
参考:#10451 - [typing] [bug]
更新了代码库以支持 Mypy 1.6.0。
asyncio
- [asyncio] [bug]
修复了未将AsyncSession.get.execution_options参数传播到底层Session并且被忽略的问题。
mariadb
- [mariadb] [bug]
修改了 mariadb-connector 驱动程序,预加载所有查询的cursor.rowcount值,以适应像 Pandas 这样硬编码调用Result.rowcount的工具。SQLAlchemy 通常仅为 UPDATE/DELETE 语句预加载cursor.rowcount,否则会传递给 DBAPI,在那里如果没有值可用,则可以返回-1。然而,mariadb-connector 在关闭光标本身后不支持调用cursor.rowcount,而是引发错误。已添加通用测试支持,以确保所有后端支持在结果关闭后允许Result.rowcount成功(即返回一个整数值,-1 表示“不可用”)。
参考:#10396 - [mariadb] [bug]
为 mariadb-connector 方言添加了额外的修复,以支持 INSERT…RETURNING 语句中结果中的 UUID 数据值。
mssql
- [mssql] [bug]
修复了一个 bug,在这个 bug 中,阻止 ORDER BY 在 SQL Server 的子查询中发出的规则在使用select.fetch()方法限制行数与 WITH TIES 或 PERCENT 结合使用时未被禁用,从而阻止了可以使用带有 TOP / ORDER BY 的有效子查询。
参考:#10458
orm
- [orm] [usecase]
添加了类似于Session.get()但在未找到具有提供的主键的实例时引发异常而不是返回None的方法Session.get_one()。感谢 Carlos Sousa 的拉取请求。
参考:#10202 - [orm] [usecase]
添加了一个选项来永久关闭会话。将新参数Session.close_resets_only设置为False将阻止Session在调用Session.close()后执行任何其他操作。
添加了新方法Session.reset(),将Session重置为初始状态。这是Session.close()的别名,除非设置Session.close_resets_only为False。
参考:#7787 - [orm] [bug]
修复了一系列mapped_column()参数,在使用Annotated对象内部的mapped_column()对象时未被传递,包括mapped_column.sort_order,mapped_column.deferred,mapped_column.autoincrement,mapped_column.system,mapped_column.info等。
此外,在Annotated中接收到
参考:#10046,#10369 - [orm] [bug]
修复了在 ORM 中使用新风格的select()查询调用Result.unique()时的问题,在此情况下,如果一个或多个列产生的值是“未知的可哈希性”,通常是在使用像func.json_build_object()这样的 JSON 函数时没有提供类型时,会在返回的值实际上不可哈希时内部失败。此行为已修复,此时会对接收到的对象进行哈希性测试,如果不可哈希,则会引发一个信息性错误消息。请注意,对于“已知的不可哈希性”值,例如直接使用JSON或ARRAY类型时,已经会引发信息性错误消息。
此处的“哈希性测试”修复也适用于传统的Query,但在传统情况下,几乎所有查询都使用Result.unique(),因此此处不会发出新的警告;在这种情况下,保留了使用id()的传统行为,改进是现在将被证明是可哈希的未知类型现在会被唯一化,而以前则不会。
参考:#10459 - [orm] [bug]
修复了最近修订的“insertmanyvalues”功能中的回归(可能是问题 #9618),在这种情况下,如果将implicit_returning=False参数应用于映射的Table,表示如果未提供主键值,则 ORM 会意外地尝试将非 RETURNING 结果解释为带有 RETURNING 结果,表明“insertmanyvalues”不能在不提供主键值的情况下使用。
参考:#10453 - [orm] [bug]
修复了 ORMwith_loader_criteria()在 ON 子句被给定为普通 SQL 比较而不是作为关系目标或类似的情况下不应用于Select.join()的 bug。
参考:#10365 - [orm] [bug]
修复了Mapped符号,例如WriteOnlyMapped和DynamicMapped在引用为给定注释的子模块的元素时无法正确解析的问题,假定使用基于字符串或“未来注释”样式注释。
参考:#10412 - [ORM] [错误]
修复了__allow_unmapped__声明选项中的问题,其中使用集合类型(如list[SomeClass])声明的类型与使用 typing 构造List[SomeClass]相比将无法被正确识别。 感谢 Pascal Corpet 提供的拉取请求。
参考:#10385
引擎
- [引擎] [错误]
修复了某些方言中的问题,其中方言可能会对根本不返回行的 INSERT 语句错误地返回空结果集,原因是仍然存在来自预先或后期获取行的主键的痕迹。受影响的方言包括 asyncpg,所有 mssql 方言。 - [引擎] [错误]
修复了在某些垃圾收集 / 异常情况下,连接池的清理例程会由于意外的状态集而引发错误的问题,该问题可以在特定条件下重现。
参考:#10414
SQL
- [SQL] [错误]
修复了在 UPDATE 语句的 SET 子句中引用 FROM 条目不会将其包括在 UPDATE 语句的 FROM 子句中的问题,如果该条目在语句中没有其他地方出现;这目前适用于通过Update.add_cte()添加的 CTE,以在语句顶部提供所需的 CTE。
参考:#10408 - [SQL] [错误]
修复了 2.0 版中的回归,其中DDL构造由于已移除的on属性未被容纳而不再__repr__()。 感谢 Iuri de Silvio 提供的拉取请求。
参考:#10443
类型
- [类型] [错误]
修复了类型问题,其中传递给Values的参数列表过于严格地绑定到List而不是Sequence。 感谢 Iuri de Silvio 提供的拉取请求。
参考:#10451 - [类型] [错误]
更新了代码库以支持 Mypy 1.6.0。
异步 IO
- [异步 IO] [错误]
修复了未将AsyncSession.get.execution_options参数传播到底层Session并且被忽略的问题。
mariadb
- [mariadb] [bug]
修改了 mariadb-connector 驱动程序,以预加载所有查询的cursor.rowcount值,以适应像 Pandas 这样硬编码调用Result.rowcount的工具。SQLAlchemy 通常仅为 UPDATE/DELETE 语句预加载cursor.rowcount,否则传递给 DBAPI,在那里如果没有值可用则可以返回 -1。但是,mariadb-connector 不支持在关闭游标本身后调用cursor.rowcount,而是引发错误。已添加通用测试支持,以确保所有后端支持在结果关闭后允许Result.rowcount成功(即返回一个整数值,-1 表示“不可用”)。
参考:#10396 - [mariadb] [bug]
为 mariadb-connector 方言添加了额外的修复,以支持 INSERT…RETURNING 语句中结果中的 UUID 数据值。
mssql
- [mssql] [bug]
修复了一个错误,即在 SQL Server 上阻止 ORDER BY 在子查询中发出的规则未在使用select.fetch()方法限制行数与 WITH TIES 或 PERCENT 结合时被禁用,导致无法使用带有 TOP / ORDER BY 的有效子查询。
参考:#10458
2.0.21
发布日期:2023 年 9 月 18 日
orm
- [orm] [bug]
调整了 ORM 对“target”实体的解释,用于Update和Delete中,以不干扰传递给语句的目标“from”对象,例如在传递 ORM 映射的aliased构造时应在“UPDATE FROM”等短语中保留。像使用“SELECT”语句进行 ORM 会话同步的情况,如与 MySQL/MariaDB 一起使用此类形式的 UPDATE/DELETE 仍然会有问题,因此最好在使用此类 DML 语句时禁用 synchonize_session。
参考:#10279 - [orm] [bug]
为selectin_polymorphic()加载器选项添加了新的功能,允许其他加载器选项作为兄弟节点捆绑在其中,引用其子类之一,在父加载器选项的子选项中。以前,只有在查询的选项的顶层才支持此模式。参见新的文档部分示例。
作为此更改的一部分,改进了Load.selectin_polymorphic()方法/加载策略的行为,因此在对已经关系加载的类使用该选项时,子类加载不会加载父表中已加载的大多数列。先前,仅对顶级类加载的逻辑才能仅加载子类列。
另请参阅
在 selectin_polymorphic 本身作为子选项时应用加载器选项
参考:#10348
引擎
- [engine] [bug]
修复了一系列反射问题,影响到 PostgreSQL、MySQL/MariaDB 和 SQLite 方言,在反映外键约束时,目标列的表名或列名中包含括号的情况下。
参考:#10275
sql
- [sql] [用例]
调整了Enum数据类型,接受Enum.length参数的值为None,在生成的 DDL 中,结果为 VARCHAR 或其他文本类型而没有长度。这允许在模式中存在类型后向类型添加任意长度的新元素。感谢 Eugene Toder 的拉取请求。
参考:#10269 - [sql] [用例]
添加了新的通用 SQL 函数aggregate_strings,接受一个 SQL 表达式和一个分隔符,将多行字符串连接为单个聚合值。该函数根据每个后端编译为诸如group_concat()、string_agg()或LISTAGG()等函数。感谢 Joshua Morris 的拉取请求。
参考:#9873 - [sql] [bug]
调整了字符串连接运算符的操作符优先级,使其等于字符串匹配运算符的优先级,例如ColumnElement.like()、ColumnElement.regexp_match()、ColumnElement.match()等,以及与字符串比较运算符相同优先级的纯==,这样括号将应用于跟在字符串匹配运算符后面的字符串连接表达式。这为后端,例如 PostgreSQL 提供了可能比字符串连接运算符优先级更高的 “regexp match” 运算符的情况。
参考:#9610 - [sql] [bug]
在 DDL 编译器中对hashlib.md5()的使用进行了限定,该函数用于在 DDL 语句中为长索引和约束名称生成确定性的四字符后缀,以包括 Python 3.9+ 中的usedforsecurity=False参数,以便 Python 解释器构建为诸如 FIPS 之类的受限环境时不认为此调用与安全问题有关。
参考:#10342 - [sql] [bug]
Values构造现在将自动创建column的代理(即复制),如果该列已经与现有的 FROM 子句相关联。这允许像values_obj.c.colname这样的表达式即使在colname被传递为已经与以前的Values或其他表构造一起使用的column的情况下,也能产生正确的 FROM 子句。最初认为这可能是一个错误条件的候选项,但是很可能这种模式已经被广泛使用,所以现在添加了支持。
参考:#10280
schema
- [schema] [bug]
修改了仅适用于 Oracle 的Identity.order参数的渲染,该参数是Sequence和Identity的一部分,仅适用于 Oracle 后端,而不适用于其他后端,如 PostgreSQL。未来的版本将重命名Identity.order、Sequence.order和Identity.on_null参数为 Oracle 特定名称,弃用旧名称,这些参数仅适用于 Oracle。
此更改也回溯到:1.4.50
参考:#10207
typing
- [typing] [usecase]
使Mapped的包含类型协变;这是为了允许更大的灵活性,以满足最终用户的类型化场景,例如使用协议来表示传递给其他函数的特定映射类结构。作为此更改的一部分,还使依赖和相关类型的包含类型协变,如SQLORMOperations、WriteOnlyMapped和SQLColumnExpression。拉取请求由 Roméo Després 提供。
参考:#10288 - [typing] [bug]
修复了在 2.0.20 中引入的回归问题,通过 #9600 修复尝试为MetaData.naming_convention添加更正式的类型化。此更改阻止了基本命名约定字典通过类型化,并已调整为再次接受键为字符串的普通字典以及使用约束类型作为键或两者混合使用的字典。
作为此更改的一部分,还对命名约定字典的较少使用形式进行了类型化,包括当前允许将Constraint类型对象用作键。
参考:#10264, #9284 - [typing] [bug]
修复了应用于表达式构造基类Visitable的__class_getitem__()的类型注释,使其接受Any作为键,而不是str,这有助于一些 IDE(如 PyCharm)在尝试为包含泛型选择器的 SQL 构造编写类型注释时。感谢 Jordan Macdonald 的拉取请求。
参考资料:#9878 - [打字] [错误]
修复了核心“SQL 元素”类SQLCoreOperations以支持从类型角度来看的__hash__()方法,因为像Column和 ORMInstrumentedAttribute这样的对象是可散列的,并且在Update和Insert构造的公共 API 中用作字典键。先前,类型检查器不知道根 SQL 元素是可散列的。
参考资料:#10353 - [打字] [错误]
修复了使用 ORM 类时,Existing.select_from()的类型注释问题。
参考资料:#10337 - [打字] [错误]
更新 ORM 加载选项的类型注解,限制其只接受“*”而不是任何字符串作为字符串参数。感谢 Janek Nouvertné 的拉取请求。
参考资料:#10131
postgresql
- [postgresql] [错误]
修复了由于 #8491 在 2.0 中出现的回归问题,当使用create_engine.pool_pre_ping参数时,PostgreSQL 方言的修订“ping”会干扰 asyncpg 与 PGBouncer 的“transaction”模式的使用,因为 asnycpg 发出的多个 PostgreSQL 命令可能被分成多个连接导致错误,因为这种新修订的“ping”周围没有任何事务。现在,在事务内调用 ping,与所有其他基于 pep-249 DBAPI 的后端一样;这保证了由此命令发送的一系列 PG 命令在同一后端连接上被调用,而不是在命令执行中跳转到另一个连接。如果 asyncpg 方言以“AUTOCOMMIT”模式使用,则不使用事务,这与 pgbouncer 事务模式不兼容。
参考资料:#10226
杂项
- [错误] [设置]
修复了一个很久以前的问题,即无法在 pytest 运行之外导入 SQLAlchemy 模块的全部范围,包括sqlalchemy.testing.fixtures。这适用于诸如pkgutil等尝试在所有包中导入所有已安装模块的检查实用程序。
参考:#10321
orm
- [orm] [错误]
调整了 ORM 对于Update和Delete中使用的“target”实体的解释,以避免干扰语句中传递的目标“from”对象,比如传递 ORM 映射的aliased结构,在像“UPDATE FROM”这样的短语中应保持不变。像 ORM 会话同步使用“SELECT”语句的情况,比如 MySQL/MariaDB,仍然会出现这种形式的 UPDATE/DELETE 的问题,因此最好在使用此类 DML 语句时禁用 synchonize_session。
参考:#10279 - [orm] [错误]
为selectin_polymorphic()加载器选项添加了新的功能,允许将其他加载器选项作为同级项捆绑在其中,引用其中一个子类,在父加载器选项的子选项中。以前,只有在查询的选项的顶级中才支持这种模式。请参阅新的文档部分以获取示例。
作为这一变化的一部分,改进了Load.selectin_polymorphic()方法/加载器策略的行为,以便在已经对父表进行关系加载时,子类加载不会加载大部分已加载列。以前,仅加载子类列的逻辑仅适用于顶层类加载。
参见
在 selectin_polymorphic 本身是子选项时应用加载器选项
参考:#10348
engine
- [engine] [错误]
修复了一系列反射问题,影响到 PostgreSQL、MySQL/MariaDB 和 SQLite 方言,在反射外键约束时,目标列中包含括号的情况下,其中一个或两个表名或列名中都包含括号。
参考:#10275
sql
- [sql] [用例]
调整了Enum数据类型,使其接受None参数作为Enum.length参数,从而在生成的 DDL 中得到一个没有长度限制的 VARCHAR 或其他文本类型。这允许在模式中存在该类型后添加任意长度的新元素。感谢 Eugene Toder 的拉取请求。
参考:#10269 - [sql] [usecase]
添加了新的通用 SQL 函数aggregate_strings,接受一个 SQL 表达式和一个分隔符,将多行字符串连接成单个聚合值。该函数根据每个后端编译成函数,如group_concat()、string_agg()或LISTAGG()。感谢 Joshua Morris 的拉取请求。
参考:#9873 - [sql] [bug]
调整了字符串连接运算符的运算优先级,使其与字符串匹配运算符(如ColumnElement.like()、ColumnElement.regexp_match()、ColumnElement.match()等)以及普通的==运算符相等,这样括号将应用于跟在字符串匹配运算符后的字符串连接表达式。这为后端(如 PostgreSQL)提供了支持,其中“regexp match”运算符显然比字符串连接运算符的优先级高。
参考:#9610 - [sql] [bug]
限定了 DDL 编译器中hashlib.md5()的使用,用于为 DDL 语句中的长索引和约束名称生成确定性的四字符后缀,以包括 Python 3.9+的usedforsecurity=False参数,以便 Python 解释器构建用于受限环境(如 FIPS)时不将此调用视为与安全问题相关。
参考:#10342 - [sql] [bug]
Values构造现在将自动创建一个代理(即复制),如果列已经与现有的 FROM 子句相关联。这样一来,即使colname已经作为一个column被传递给了先前的Values或其他表构造,表达式values_obj.c.colname也会产生正确的 FROM 子句。最初认为这可能会导致错误,但很可能这种模式已经被广泛使用,所以现在添加以支持。
参考:#10280
模式
- [模式] [错误]
修改了仅适用于 Oracle 的Identity.order参数的呈现方式,该参数既属于Sequence又属于Identity,现在只在 Oracle 后端生效,而不是像 PostgreSQL 那样适用于其他后端。将来的版本将会将Identity.order、Sequence.order和Identity.on_null参数重命名为 Oracle 特定的名称,并弃用旧名称,这些参数仅适用于 Oracle。
此更改也回溯到:1.4.50
参考:#10207
typing
- [类型] [用例]
对于Mapped中包含的类型进行了协变处理;这样做是为了在端用户的类型场景中提供更大的灵活性,比如使用协议来表示特定映射类结构,这些结构会传递给其他函数。作为这一变更的一部分,对于依赖和相关类型,如SQLORMOperations、WriteOnlyMapped和SQLColumnExpression,也对其中包含的类型进行了协变处理。感谢 Roméo Després 提交的拉取请求。
参考:#10288 - [类型] [错误]
修复了在 2.0.20 中引入的回归问题,通过 #9600 修复,该修复尝试为MetaData.naming_convention添加更正式的类型注解。这一变更阻止了基本的命名约定字典通过类型检查,并已调整为再次接受纯字符串键的普通字典以及使用约束类型作为键或两者混合使用的字典。
作为这一变更的一部分,还对命名约定字典的较少使用形式进行了类型化,其中目前允许Constraint类型对象作为键。
参考:#10264, #9284 - [typing] [bug]
修复了应用于表达式构造基础的Visitable类的__class_getitem__()的类型注解,以接受Any作为键,而不是str,这有助于一些 IDE,如 PyCharm,在尝试为包含通用选择器的 SQL 构造编写类型注解时。感谢 Jordan Macdonald 的拉取请求。
参考:#9878 - [typing] [bug]
修复了核心“SQL 元素”类SQLCoreOperations,以支持从类型的角度看待__hash__()方法,因为像Column和 ORMInstrumentedAttribute这样的对象是可哈希的,并且在公共 API 中用作字典键,用于Update和Insert构造。以前,类型检查器不知道根 SQL 元素是可哈希的。
参考:#10353 - [typing] [bug]
修复了与Existing.select_from()的类型问题,这阻止了它与 ORM 类的使用。
参考:#10337 - [typing] [bug]
更新了 ORM 加载选项的类型注解,将其限制为仅接受“*”而不是任何字符串作为字符串参数。感谢 Janek Nouvertné 的拉取请求。
参考:#10131
postgresql
- [postgresql] [bug]
修复了 2.0 版本中出现的回归问题,这是由于#8491导致的,其中当使用create_engine.pool_pre_ping参数时,用于 PostgreSQL 方言的修订“ping”会干扰 asyncpg 与 PGBouncer“事务”模式的使用,因为 asnycpg 发出的多个 PostgreSQL 命令可能会被分配到多个连接中,导致错误,由于对此新修订的“ping”周围没有任何事务。现在,在事务中调用 ping,就像所有其他基于 pep-249 DBAPI 的后端隐式使用的一样;这保证了由于此命令发送的 PG 命令系列会在同一后端连接上调用,而不是在命令中间跳到不同的连接。如果使用 asyncpg 方言处于“AUTOCOMMIT”模式下,则不使用事务,这仍然与 pgbouncer 事务模式不兼容。
参考资料:#10226
杂项
- [错误] [设置]
修复了很旧的问题,即无法在 pytest 运行外导入 SQLAlchemy 模块的全部内容,包括sqlalchemy.testing.fixtures。这适用于诸如pkgutil等试图导入所有包中所有已安装模块的检查工具。
参考资料:#10321
SqlAlchemy 2.0 中文文档(五十八)(7)https://developer.aliyun.com/article/1563139