SqlAlchemy 2.0 中文文档(五十八)(1)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: SqlAlchemy 2.0 中文文档(五十八)


原文:docs.sqlalchemy.org/en/20/contents.html

2.0 更新日志

原文:docs.sqlalchemy.org/en/20/changelog/changelog_20.html

2.0.30

无发布日期

orm

  • [orm] [bug]
    添加了新的属性 ORMExecuteState.is_from_statement,用于检测形式为 select().from_statement() 的语句,并且还增强了FromStatement以设置 ORMExecuteState.is_selectORMExecuteState.is_insertORMExecuteState.is_updateORMExecuteState.is_delete 根据发送到 Select.from_statement() 方法本身的元素。
    References: #11220

engine

  • [engine] [bug]
    Connection.execution_options.logging_token 选项中修复了问题,当在已经记录了消息的连接上更改logging_token的值时,不会更新以反映新的日志令牌。具体来说,这会阻止使用 Session.connection() 来更改连接上的选项,因为 BEGIN 记录消息已经被发出。
    References: #11210

打字

  • [typing] [bug] [regression]
    修复了由版本 2.0.29 中 PR #11055 引起的打字退化,该版本试图将ParamSpec添加到 asyncio 的run_sync()方法中,使用 AsyncConnection.run_sync()MetaData.reflect() 将会由于错误导致 mypy 失败。详细信息请参阅 github.com/python/mypy/issues/17093。由 Francisco R. Del Roio 提供的拉取请求。
    References: #11200

杂项

  • [bug] [test]
    确保在测试中使用subprocess.run时正确初始化PYTHONPATH变量。
    References: #11268

2.0.29

发布日期:2024 年 3 月 23 日

orm

  • [orm] [usecase]
    增加了对PEP 695 TypeAliasType构造以及 python 3.12 原生的type关键字的支持,以便在使用这些构造链接到PEP 593 Annotated容器时,允许解析Annotated在这些构造用于Mapped类型容器时继续进行。
    参考:#11130
  • [orm] [bug]
    修复了声明性问题,其中使用Relationship而不是Mapped来定义关系会意外地为该属性引入“动态”关系加载策略。
    参考:#10611
  • [orm] [bug]
    修复了在 ORM 注释声明中使用mapped_column()mapped_column.indexmapped_column.unique设置为 False 时,会被具有该参数设置为True的传入Annotated元素覆盖的问题,即使直接的mapped_column()元素更具体且应优先考虑。增强了协调布尔值的逻辑,以适应本地值为False仍然优先于来自注释元素的True值的情况。
    参考:#11091
  • [orm] [bug] [regression]
    修复了从版本 2.0.28 引起的回归,该回归是由于修复#11085而引起的,其中调整后缓存绑定参数值的新方法会干扰subqueryload()加载器选项的实现,该加载器选项在内部使用一些更具传统模式的模式,当使用此加载器选项与此加载器选项一起使用附加加载器条件功能时。
    参考:#11173

引擎

  • [engine] [bug]
    修复了 “插入多个值”行为对 INSERT 语句的行为 功能中的问题,其中使用带有“内联执行”默认生成器的主键列,例如具有显式 Sequence 并具有显式模式名称的生成器,同时使用 Connection.execution_options.schema_translate_map 功能将无法正确呈现序列或参数,导致错误。
    参考: #11157
  • [engine] [bug]
    对版本 2.0.10 中对 #9618 所做的调整进行了更改,该调整增加了从批量 INSERT 中协调 RETURNING 行到传递给它的参数的行为。该行为包括已经 DB  转换的绑定参数值与返回的行值之间的比较,并不总是对于 SQL 列类型(如 UUID)是“对称”的,具体取决于不同的 DBAPI  如何接收这些值以及它们如何返回它们,因此需要在这些列类型上添加额外的“标志值解析器”方法。不幸的是,这破坏了第三方列类型,如 SQLModel  中未实现此特殊方法的 UUID/GUID  类型,引发错误“无法将结果集中的标志值与参数集匹配”。与其试图进一步解释和文档化“insertmanyvalues”功能的此实现细节,包括新方法的公共版本,不如将方法调整为不再需要此额外的转换步骤,并且执行比较的逻辑现在在预转换的绑定参数值与后处理结果值之间进行,后者应始终具有匹配的数据类型。在不寻常的情况下,如果自定义  SQL 列类型同时也用作批量 INSERT  的“标志”列不接收和返回相同类型的值,则将引发“无法匹配”错误,但缓解方法很简单,即应传递与返回值相同的 Python 数据类型。
    参考: #11160

sql

  • [sql] [bug] [regression]
    从 1.4 系列的回归中修复了重构TypeEngine.with_variant()方法的问题,该问题在“with_variant()”克隆原始 TypeEngine 而不是更改类型中介绍。该问题未考虑到.copy()方法,该方法会丢失设置的变体映射。对于“schema”类型的非常特定情况而言,这是一个问题,该类型包括EnumARRAY等类型,当它们在 ORM Declarative 映射与混入一起使用时,类型的复制就会起作用。现在还复制了变体映射。
    参考:#11176

typing

  • [typing] [错误]
    修复了允许 asyncio run_sync()方法正确类型化参数的类型问题,该方法根据传递的可调用函数使用了PEP 612 ParamSpec变量。感谢 Francisco R. Del Roio 提供的拉取请求。
    参考:#11055

postgresql

  • [postgresql] [用例]
    PostgreSQL 方言现在在反射具有域作为类型的列时返回DOMAIN实例。之前,返回的是域数据类型。作为此更改的一部分,改进了域反射以返回文本类型的校对。感谢 Thomas Stephenson 提供的拉取请求。
    参考:#10693

测试

  • [测试] [错误]
    将对与 asyncio 相关的测试运行方式进行了改进,并将其后移至 SQLAlchemy 2.0,现在使用较新的 Python 3.11 asyncio.Runner或后移的等效版本,而不是依赖于以前基于asyncio.get_running_loop()的实现。这样做有望防止在 CPU 负载硬件上进行大型测试套件运行时出现问题,其中事件循环似乎会损坏,从而导致级联失败。
    参考:#11187

2.0.28

发布日期:2024 年 3 月 4 日

orm

  • [orm] [性能] [错误] [回归]
    调整了在#10570中进行的修复,发布在 2.0.23 中,其中添加了新的逻辑来协调可能在with_expression()构造中用于缓存键生成的绑定参数值的更改。新的逻辑改变了将新的绑定参数值与语句关联的方法,避免了需要深复制语句的需要,这可能会对非常深/复杂的 SQL 结构造成重大性能损失。新方法不再需要这个深复制步骤。
    参考:#11085
  • [orm] [错误] [回归]
    修复了由#9779引起的回归,其中在关系and_()表达式中使用“secondary”表将无法被别名化以匹配“secondary”表在Select.join()表达式中通常的渲染方式,导致查询无效。
    参考:#11010

引擎

  • [引擎] [用例]
    添加了新的核心执行选项Connection.execution_options.preserve_rowcount。设置后,将在语句执行时无条件地将 DBAPI 游标的cursor.rowcount属性存储,以便无论 DBAPI 为任何类型的语句提供的值都可以使用CursorResult.rowcount属性从CursorResult中获取。这允许访问行计数,例如 INSERT 和 SELECT 语句,至少在使用的 DBAPI 支持的程度上。INSERT 语句的“插入多个值”行为也支持此选项,并将在设置时确保为批量插入行时正确设置CursorResult.rowcount
    参考:#10974

asyncio

  • [asyncio] [错误]
    如果将 QueuePool 或其他非异步池类传递给 create_async_engine(),则会引发错误。此引擎仅接受与 asyncio 兼容的池类,包括 AsyncAdaptedQueuePool。其他池类(例如 NullPool)与同步和异步引擎都兼容,因为它们不执行任何锁定。
    参见
    API 文档 - 可用的连接池实现
    参考资料:#8771

测试

  • [tests] [change]
    tox.ini 文件中的 pytest 支持已更新,以支持 pytest 8.1。

2.0.27

发布日期:2024 年 2 月 13 日

postgresql

  • [postgresql] [bug] [regression]
    由于刚发布的修复了#10863的修复导致的回归已经修复,其中将一个无效的异常类添加到了“except”块中,除非实际发生这样的捕获,否则不会被执行。已经添加了一种模拟式测试,以确保在单元测试中执行此捕获。
    参考资料:#11005

2.0.26

发布日期:2024 年 2 月 11 日

orm

  • [orm] [bug]
    已用一个较短的消息替换了“加载器深度过深”的警告,该消息被添加到  SQL 日志中的缓存徽章中,用于 ORM 由于加载器选项的过深链而禁用缓存的语句。此警告突出显示的条件难以解决,并且通常只是 ORM 在应用  SQL 缓存时的限制。未来的功能可能包括调整禁用缓存的阈值的能力,但目前此警告将不再是一个麻烦。
    参考资料:#10896
  • [orm] [bug]
    修复了在类主体内部声明类型(如枚举)时无法在Mapped容器类型中使用该类型的问题。现在,用于评估的本地变量范围包括类主体本身。此外,Mapped内的表达式还可以引用类名本身,如果作为字符串使用或者使用了未来的注释模式。
    参考资料:#10899
  • [orm] [bug]
    修复了使用 Session.delete()Mapper.version_id_col 功能时,如果由于对象上使用了 relationship.post_update 而导致目标对象上发出了额外的 UPDATE,则会失败使用正确的版本标识符的问题。这个问题类似于#10800,只是对于仅有更新的情况,版本 2.0.25 中刚刚修复了。
    参考:#10967
  • [orm] [错误]
    修复了 with_expression() 实现中的断言,如果使用了不可缓存的 SQL 表达式,则会引发断言错误;这是从 1.4 版本以来的一个 2.0 回归。
    参考:#10990

示例

  • [示例] [错误]
    修复了 history_meta 示例中的回归,其中使用 MetaData.to_metadata() 复制历史表也会复制索引(这是一件好事),但不管用于这些索引的命名方案如何,都会导致命名冲突。现在这些索引都会添加一个“_history”后缀,方式与表名的方式相同。
    参考:#10920
  • [示例] [错误]
    通过将 Identity 构造添加到所有表中,并允许在此后端上进行主键生成,修复了 examples/performance 中性能示例脚本在 Oracle 数据库上基本可用的问题。一些“原始 DBAPI” 情况仍与 Oracle 不兼容。

sql

  • [sql] [错误]
    修复了 case() 中的问题,即确定表达式类型的逻辑可能导致如果“whens”中的最后一个元素没有类型,或在其他情况下类型可能解析为 None,则会导致 NullType。逻辑已更新为扫描所有给定表达式,以便使用第一个非空类型,并始终确保存在类型。感谢 David Evans 提交的拉取请求。
    参考:#10843

typing

  • [类型] [错误]
    修复了 PoolEvents.checkin() 事件的类型签名,指示给定的 DBAPIConnection 参数在连接无效时可能为 None 的情况。

postgresql

  • [postgresql] [usecase] [reflection]
    增加对以“NO INHERIT”标记的 PostgreSQL CHECK 约束的反射支持,将 no_inherit=True 设置为反射数据的键。感谢 Ellis Valentiner 的拉取请求。
    引用:#10777
  • [postgresql] [usecase]
    支持 USING 选项用于 PostgreSQL CREATE TABLE,以指定用于存储新表内容的访问方法。感谢 Edgar Ramírez-Mondragón 的拉取请求。
    另请参阅
    PostgreSQL 表选项
    引用:#10904
  • [postgresql] [usecase]
    正确地将 PostgreSQL RANGE 和 MULTIRANGE 类型标记为 Range[T]Sequence[Range[T]]。引入了实用程序序列 MultiRange ,以允许更好地支持 MULTIRANGE 类型的互操作性。
    引用:#9736
  • [postgresql] [usecase]
    当从 RangeMultiRange 实例推断数据库类型时,区分 INT4 和 INT8 范围以及多范围类型,如果值适合 INT4,则优先选择 INT4。
  • [postgresql] [bug] [regression]
    修复了在 2.0.24 版本中由 #10717 引起的 asyncpg 方言中的回归,该版本中现在尝试在终止之前优雅地关闭 asyncpg 连接的更改将不会对其他可能的与连接相关的异常(除了超时错误之外)回退到 terminate() ,没有考虑到优雅的 .close() 尝试因其他原因失败,如连接错误。
    引用:#10863
  • [postgresql] [bug]
    修复了在使用 PostgreSQL 方言时,Uuid 数据类型与 Uuid.as_uuid 参数设置为 False 时的问题。ORM 优化的 INSERT 语句(例如,“insertmanyvalues”功能)将不会正确地对齐主键 UUID 值以进行批量 INSERT 语句,导致错误。类似的问题也针对 pymssql 驱动程序进行了修复。

mysql

  • [mysql] [bug]
    修复了一个问题,即当一个 MySQL 列同时指定了 VIRTUAL 或 STORED 指令时,NULL/NOT NULL 无法正确反映出来的问题。拉取请求由 Georg Wicke-Arndt 提供。
    参考:#10850
  • [mysql] [bug]
    修复了 asyncio 方言 asyncmy 和 aiomysql 中的问题,其中它们的 .close() 方法显然不是优雅关闭的。用非标准的 .ensure_closed() 方法替换,该方法是可等待的,并将 .close() 移动到所谓的“终止”情况。
    参考:#10893

mssql

  • [mssql] [bug]
    修复了在使用 pymssql 方言时,Uuid 数据类型与 Uuid.as_uuid 参数设置为 False 时的问题。ORM 优化的 INSERT 语句(例如,“insertmanyvalues”功能)将不会正确地对齐主键 UUID 值以进行批量 INSERT 语句,导致错误。类似的问题也针对 PostgreSQL 驱动程序进行了修复。

Oracle

  • [oracle] [performance] [bug]
    更改了  Oracle 方言的默认数组大小,以便使用驱动程序设置的值,即写入时的 cx_oracle 和 oracledb 的值为 100。以前默认设置为  50 的值可能会导致在较慢的网络上使用 cx_oracle/oracledb 单独提取许多行时出现显着的性能回归。
    参考:#10877

2.0.25

发布日期:2024 年 1 月 2 日

orm

  • [orm] [usecase]
    添加了对 Python 3.12 pep-695 类型别名结构的初步支持,用于解析 ORM Annotated Declarative 映射的自定义类型映射时。
    参考:#10807
  • [orm] [bug]
    修复了一种情况,即在同时使用 relationship.post_update 功能和使用 mapper version_id_col 时,后者 UPDATE 语句可能会未能正确使用正确的版本标识符,假定在该刷新中已经发出了一个已经增加了版本计数器的 UPDATE。
    参考文献:#10800
  • [orm] [错误]
    修复了 ORM 注解式声明中的问题,如果左侧类型被指定为类而不是字符串,并且没有使用 future 风格的注释,当左侧没有指定任何集合为 uselist=True 时,会误解关系的左侧。
    参考文献:#10815

sql

  • [sql] [错误]
    改进了在布尔比较的否定上下文中编译 any_() / all_() 的方式,现在将呈现 NOT (expr) 而不是将等式操作符反转为不等于,允许对这些非典型运算符进行更精细的否定控制。
    参考文献:#10817

类型提示

  • [类型提示] [错误]修复了在版本 2.0.24 中添加到 sqlalchemy.sql.functions 模块的类型提示引起的回归,作为 #6810 的一部分:
  • 进一步增强了 pep-484 类型提示,以允许从 sqlalchemy.sql.expression.func 派生的元素更有效地与 ORM 映射的属性一起使用 (#10801)
  • 修复了传递给函数的参数类型,以便像字符串和整数这样的字面表达式再次被正确解释 (#10818)

asyncio

  • [asyncio] [错误]
    修复了 asyncio 版本连接池中的关键问题,调用 AsyncEngine.dispose() 会产生一个新的连接池,该连接池没有完全重新建立对 asyncio 兼容互斥锁的使用,导致在使用类似于 asyncio.gather() 的并发特性时,在 asyncio 上下文中产生死锁,因为它使用了普通的 threading.Lock()
    这个改变也回溯到了:1.4.51
    参考文献:#10813

oracle

  • [oracle] [asyncio]
    在 asyncio 模式下添加了对 python-oracledb 的支持,使用了新发布的支持 asyncio 的 oracledb DBAPI 版本。 对于 2.0 系列,这是一个预览版本,当前实现尚未包括对 AsyncConnection.stream() 的支持。 SQLAlchemy 计划改进支持以适用于 2.1 版本。
    参考文献:#10679

2.0.24

发布日期:2023 年 12 月 28 日

orm

  • [orm] [bug]
    对在版本 0.9.8 中发布的#3208首次实施的修复进行了改进,其中声明性内部使用的类注册表可能会受到竞争条件的影响,这种情况下在同时清理个别映射类并构造新映射类时可能会发生,如一些测试套件配置或动态类创建环境中可能发生的情况。除了已经添加的弱引用检查外,还首先复制正在迭代的项目列表,以避免“在迭代时更改列表”的错误。感谢  Yilei Yang 提供的拉取请求。
    此更改也被回溯到:1.4.51
    参考:#10782
  • [orm] [bug]
    修复了在未对非初始化的mapped_column()构造上使用foreign()注释会产生没有类型的表达式的问题,这样在实际列初始化时不会更新,导致关系无法适当地确定use_get的问题。
    参考:#10597
  • [orm] [bug]
    改进了工作单元进程将主键列的值设置为 NULL 的错误消息,因为具有对该列的依赖规则的相关对象被删除,包括不仅目标对象和列名,还包括来源列。感谢 Jan Vollmer 提供的拉取请求。
    参考:#10668
  • [orm] [bug]
    修改了MappedAsDataclassDeclarativeBaseDeclarativeBaseNoMeta使用的__init_subclass__()方法,使其接受任意的**kw并将其传播到super()调用,从而允许更灵活地安排使用__init_subclass__()关键字参数的自定义超类和混入。感谢 Michael Oliver 提供的拉取请求。
    参考:#10732
  • [orm] [bug]
    确保了在 ORM 启用的 INSERT、UPDATE 和 DELETE 语句的 returning() 部分中使用 Bundle 对象的用例已经得到测试并且完全可用。这在以前从未被明确实现或测试过,并且在 1.4 系列中没有正常工作;在 2.0 系列中,ORM UPDATE/DELETE 缺少了一个实现方法,导致 Bundle 对象无法正常工作。
    参考:#10776
  • [orm] [bug]
    修复了 2.0 版本中 MutableList 中的一个回归问题,该问题导致检测序列的例程无法正确地过滤掉字符串或字节实例,从而无法将字符串值分配给特定索引(而非序列值则可以正常工作)。
    参考:#10784

engine

  • [engine] [bug]
    修复了将 URL 对象的用户名和密码部分进行 URL 编码时的问题,在使用 URL.render_as_string() 方法将其转换为字符串时,采用了 Python 标准库 urllib.parse.quote,同时允许加号和空格保持不变,以便与 SQLAlchemy 的非标准 URL 解析兼容,而不是多年前的遗留自行编写的例程。感谢 Xavier NUNN 提交的拉取请求。
    参考:#10662

sql

  • [sql] [bug]
    修复了 SQL 元素的字符串化问题,在未传递特定方言的情况下,遇到诸如 PostgreSQL 的“on conflict do update”构造之类的方言特定元素,然后无法提供具有适当状态以呈现构造的字符串化方言,导致内部错误。
    参考:#10753
  • [sql] [bug]
    修复了针对 DML 构造(如 insert() 构造)的 CTE 进行字符串化或编译时失败的问题,由于错误地检测到了语句整体是一个 INSERT,导致内部错误。

schema

  • [schema] [bug]
    修复了创建 Table 等对象时出现意外模式项的错误报告问题,该问题会错误地处理作为元组传递的参数,导致格式错误。错误消息已经使用 f-strings 进行了现代化处理。
    参考:#10654

typing

  • [typing] [bug]
    sqlalchemy.sql.functions 模块完成了 pep-484 类型化。对于针对 func 元素进行的 select() 构造现在应该填充返回类型。
    参考:#6810

asyncio

  • [asyncio] [change]
    async_fallback 方言参数现已弃用,并将在 SQLAlchemy 2.1 中删除。这个标志在一段时间内没有被用于 SQLAlchemy 的测试套件。通过使用 greenlet_spawn() 在 greenlet 中运行代码,asyncio 方言仍然可以以同步方式运行。

postgresql

  • [postgresql] [bug]
    调整了 asyncpg 方言,以便当使用 terminate() 方法丢弃无效的连接时,方言首先会尝试使用带有超时的 .close() 优雅地关闭连接,如果操作仅在异步事件循环上下文中进行。这允许 asyncpg 驱动程序处理最终化 TimeoutError,包括能够在程序退出后继续运行的情况下关闭长时间运行的查询服务器端。
    参考:#10717

mysql

  • [mysql] [bug]
    修复了使用旧于 1.0 版本的 PyMySQL 的 pool pre-ping 时,在票证 #10492 中的修复引入的回归。
    此更改也被回溯至:1.4.51
    参考:#10650

测试

  • [tests] [bug]
    对测试套件进行了改进,进一步加强了在未安装 Python greenlet 时运行的能力。现在有一个 tox 目标,其中包含标记“nogreenlet”,该目标将在未安装 greenlet 的情况下运行套件(请注意,它仍然作为 tox 配置的一部分临时安装 greenlet)。
    参考:#10747

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 值](…/orm/queryguide/dml.html#orm-queryguide-insert-null-params)
    参考:#10575
  • [orm] [bug]
    修复了__allow_unmapped__指令无法允许具有注释(如Any或具有特定类型但没有Mapped[]作为其类型的)的遗留Column / deferred()映射,而无需与定位属性名称相关的错误。
    参考:#10516
  • [orm] [bug]
    修复了缓存错误,当与加载器选项selectinload()lazyload()一起使用with_expression()构造时,在后续缓存运行中无法正确替换绑定参数值的问题。
    参考:#10570
  • [orm] [bug]
    修复了 ORM 注释声明中的错误,其中使用ClassVar,但仍然以某种方式引用 ORM 映射类名会导致无法解释为未映射的ClassVar
    参考:#10472

sql

  • [sql] [usecase]
    为 PostgreSQL 和 Oracle 方言的Interval数据类型实现了“字面值处理”,允许对间隔值进行字面渲染。感谢 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()的 bug,该方法之前未能正确工作。还添加了函数close_all_sessions(),它是close_all_sessions()的等效函数。拉取请求由 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]
    调整了 MySQL / MariaDB 方言,当使用 MariaDB 时,将生成的列默认为 NULL,如果未使用明确的TrueFalse值指定Column.nullable,因为 MariaDB 不支持生成列的“NOT NULL”短语。拉取请求由 Indivar 提供。
    参考:#10056
  • [mariadb] [bug] [regression]
    为  MySQL/MariaDB 驱动程序之间似乎存在的一个固有问题建立了一个解决方法,即使用 SQLAlchemy 的“空 IN”条件删除 DML  的 RETURNING 结果返回没有行时,不提供 cursor.description,然后产生返回没有行的结果,导致 ORM 中的回归,在  2.0 系列中使用 RETURNING 用于“同步会话”功能的批量删除语句。为了解决这个问题,当检测到“给出 RETURNING  时没有描述”的特定情况时,将生成一个带有正确游标描述的“空结果”,并用于替代不起作用的游标。
    参考:#10505

mssql

  • [mssql] [用例]
    增加了对为 SQL Server 实现的aioodbc驱动程序的支持,该驱动程序建立在 pyodbc 和通用 aio* 方言架构之上。
    另请参阅
    aioodbc - 在 SQL Server 方言文档中。
    参考:#6521
  • [mssql] [bug] [反射]
    修复了身份列反射失败的问题,对于具有大于 18 位数的大整数起始值的 bigint 列。
    此更改也回溯到:1.4.50
    参考:#10504

oracle

  • [oracle] [bug]
    修复了Interval数据类型中的问题,在 Oracle 实现未用于 DDL 生成,导致day_precisionsecond_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] [用例]
    添加了Session.get_one()方法,其行为类似于Session.get(),但如果未找到具有提供的主键的实例,则引发异常。感谢 Carlos Sousa 的拉取请求。
    参考:#10202
  • [orm] [用例]
    添加了一个选项来永久关闭会话。将新参数Session.close_resets_only设置为False将阻止Session在调用Session.close()后执行任何其他操作。
    添加了新方法Session.reset(),将会将Session重置为其初始状态。这是Session.close()的别名,除非Session.close_resets_only设置为False
    参考:#7787
  • [orm] [bug]
    修复了一系列mapped_column()参数,在使用 pep-593 Annotated对象内的mapped_column()对象时未被传递,包括mapped_column.sort_ordermapped_column.deferredmapped_column.autoincrementmapped_column.systemmapped_column.info等。
    此外,在Annotated中接收的mapped_column()中仍不支持有数据类参数,例如mapped_column.kw_onlymapped_column.default_factory等。当以这种方式在Annotated中使用这些参数时,现在会发出警告(并且它们继续被忽略)。
    参考:#10046#10369
  • [orm] [bug]
    修复了在 ORM 中使用新式select()查询调用Result.unique()时出现的问题,其中一个或多个列产生的值是“未知可哈希性”,通常在使用像func.json_build_object()这样的 JSON 函数时没有提供类型时会在返回的值实际上不可哈希时内部失败。在这种情况下,修复了对接收到的对象进行哈希性测试,如果不可哈希,则提出了信息性错误消息。请注意,对于“已知不可哈希性”的值,例如直接使用JSONARRAY类型时,已经提出了信息性错误消息。
    此处的“哈希性测试”修复也适用于传统的Query,但在传统情况下,几乎所有查询都使用Result.unique(),因此此处不会发出新的警告;在这种情况下,将继续保持回退到在此情况下使用id()的传统行为,改进是现在将未知类型(结果证明是可哈希的)进行唯一化,而以前不会。
    参考:#10459
  • [orm] [bug]
    修复了最近修订的“insertmanyvalues”功能中的回归问题(可能是问题#9618),在这种情况下,ORM 会误将非 RETURNING 结果解释为具有 RETURNING 结果,如果应用了implicit_returning=False参数到映射的Table,则表示“insertmanyvalues”不能在未提供主键值的情况下使用。
    参考:#10453
  • [orm] [bug]
    修复了 ORM with_loader_criteria()不适用于将 ON 子句给定为普通 SQL 比较而不是关系目标或类似的Select.join()的 bug。
    参考:#10365
  • [orm] [bug]
    修复了Mapped等符号在作为子模块元素引用时无法正确解析的问题,假设是基于字符串或“未来注释”样式注释。
    参考:#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 版本中的回归问题,DDL构造不再__repr__(),因为已删除的on属性未被容纳。感谢 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,即在 SQL Server 中阻止 ORDER BY 在子查询中发出的规则没有在使用 select.fetch() 方法限制行数与 WITH TIES 或 PERCENT 结合时被禁用,导致无法使用带有 TOP / ORDER BY 的有效子查询。
    参考:#10458

2.0.21

发布日期:2023 年 9 月 18 日

orm

  • [orm] [bug]
    调整了 ORM 对“target”实体在 UpdateDelete 中的解释,以不干扰传递给语句的目标“from”对象,例如在传递 ORM 映射的 aliased 构造时应在“UPDATE FROM”等短语中保留。像使用“SELECT”语句进行 ORM 会话同步的情况,如与 MySQL/MariaDB  一起使用 UPDATE/DELETE 这种形式仍然会有问题,因此最好在使用此类 DML 语句时禁用 synchonize_session。
    参考:#10279
  • [orm] [bug]
    selectin_polymorphic() 加入了新的功能,允许其他加载器选项被捆绑为同级,并且引用其子类中的一个,位于父加载器选项的子选项中。以前,只有当 selectin_polymorphic() 处于查询选项的顶层时才支持此模式。请参阅新文档部分以获取示例。
    作为这个改变的一部分,改进了Load.selectin_polymorphic() 方法/加载策略的行为,因此子类加载不会加载来自父表的大多数已加载列,当选项用于已经进行关系加载的类时。以前,只有在顶级类加载时才有效的加载子类列的逻辑。
    也请参阅
    selectin_polymorphic 本身是子选项时应用加载器选项
    参考:#10348

引擎

  • [引擎] [错误]
    修复了一系列反射问题,影响到 PostgreSQL、MySQL/MariaDB 和 SQLite 方言,在反射外键约束时,目标列包含一个或两个表名或列名中的括号时。
    参考:#10275

sql

  • [sql] [用例]
    调整了 Enum 数据类型,接受 None 参数作为 Enum.length 参数,导致在结果 DDL 中生成没有长度的 VARCHAR 或其他文本类型。这允许在模式中存在后,为该类型添加任何长度的新元素。感谢 Eugene Toder 提交的拉取请求。
    参考:#10269
  • [sql] [用例]
    添加了新的通用 SQL 函数aggregate_strings,它接受一个 SQL 表达式和一个分隔符,将多行字符串连接成单个聚合值。该函数根据后端编译成函数,例如group_concat()string_agg()LISTAGG()。感谢 Joshua Morris 提交的拉取请求。
    参考:#9873
  • [sql] [错误]
    调整了字符串连接运算符的运算优先级,使其与字符串匹配运算符(如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 子句关联的column创建代理(即副本)。这使得像values_obj.c.colname这样的表达式将在colname作为已与先前的Values或其他表构造一起使用的column的情况下生成正确的 FROM 子句。最初认为这可能是一个错误条件的候选项,但很可能这种模式已经被广泛使用,所以现在添加以支持。
    参考:#10280

模式

  • [schema] [bug]
    修改了仅适用于 Oracle 后端的 Identity.order 参数的呈现方式,该参数是 SequenceIdentity 的一部分,并且不适用于其他后端,例如 PostgreSQL 的后端。未来版本将重命名 Identity.orderSequence.orderIdentity.on_null 参数为 Oracle 特定名称,并弃用旧名称,这些参数仅适用于 Oracle。
    此更改也被回溯到:1.4.50
    参考:#10207

输入

  • [输入] [用例]
    使 Mapped 的包含类型协变;这是为了允许更大的灵活性,以适应端用户类型化场景,例如使用协议表示传递给其他函数的特定映射类结构。作为这个改变的一部分,还使依赖和相关类型(如 SQLORMOperationsWriteOnlyMappedSQLColumnExpression)的包含类型也是协变的。感谢 Roméo Després 提交的拉取请求。
    参考:#10288
  • [输入] [错误]
    修复了在 2.0.20 中引入的回归问题,通过 #9600 修复,尝试为 MetaData.naming_convention 添加更正式的类型。这个改变阻止了基本命名约定字典通过类型检查,并且已经进行了调整,以便再次接受字符串键的普通字典以及使用约束类型作为键或两者混合使用的字典。
    作为这个改变的一部分,还对命名约定字典的较少使用的形式进行了类型化,包括它目前允许 Constraint 类型对象作为键。
    参考:#10264#9284
  • [输入] [错误]
    修复了应用于表达式构造的基础Visitable类的__class_getitem__()方法的类型注释,以接受Any作为键,而不是str,这有助于一些 IDE(例如 PyCharm)在尝试为包含通用选择器的 SQL 构造编写类型注释时。感谢 Jordan Macdonald 的拉取请求。
    参考:#9878
  • [typing] [bug]
    修复了核心“SQL 元素”类SQLCoreOperations的类型问题,以支持从类型的角度来看__hash__()方法,因为对象(如Column和 ORM InstrumentedAttribute)是可散列的,并且在UpdateInsert构造的公共 API 中用作字典键。先前,类型检查器不知道根 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“transaction”模式的使用,因为  asnycpg 发出的多个 PostgreSQL  命令可能会被分解到多个连接中导致错误,由于这个新修订的“ping”周围没有任何事务。现在在事务内调用 ping,与所有其他基于 pep-249  DBAPI 的其他后端隐式使用的方式相同;这确保了为此命令发送的一系列 PG  命令在同一个后端连接上调用,而不会在命令中途跳转到不同的连接。如果使用 asyncpg  方言处于“AUTOCOMMIT”模式,则不使用事务,这仍然与 pgbouncer 事务模式不兼容。
    参考:#10226

杂项

  • [bug] [setup]
    修复了一个很久以前的问题,在 pytest 运行之外无法导入 SQLAlchemy 模块的全部内容,包括sqlalchemy.testing.fixtures。这适用于诸如 pkgutil 等尝试导入所有包中所有安装的模块的检查工具。
    参考:#10321

2.0.20

发布日期:2023 年 8 月 15 日

orm

  • [orm] [usecase]
    实现了对启用 ORM 的 DML 语句的“RETURNING ‘*’”用例。这将尽可能地呈现,并返回未经过滤的结果集,但不支持具有特定列渲染要求的多参数“ORM 批量 INSERT”语句。
    参考:#10192
  • [orm] [bug]
    修复了一个基本问题,阻止了某些形式的 ORM “注释” 对使用 Select.join() 进行关系目标的连接的子查询进行。在诸如 PropComparator.and_() 和其他 ORM 特定情况下使用这些注释。
    此更改也被回溯到:1.4.50
    参考:#10223
  • [orm] [bug]
    修复了一个问题,即 ORM 在具有相同名称列的超类和子类的连接继承模型中生成 SELECT 时,某种方式未能将正确的列名列表发送到 CTE 构造函数,当生成 RECURSIVE 列表时。
    参考:#10169
  • [orm] [bug]
    修复了一个相当重要的问题,即传递给 Session.execute() 的执行选项以及本地于 ORM 执行的语句本身的执行选项不会传播到 eager loaders,如 selectinload()immediateload()sqlalchemy.orm.subqueryload(),使得不可能禁用单个语句的缓存或使用 schema_translate_map 用于单个语句,以及使用用户自定义执行选项。已做出更改,使得所有针对 Session.execute() 的面向用户的执行选项都将传播到其他加载器。
    作为此更改的一部分,可以通过将 execution_options={"compiled_cache": None} 发送到Session.execute() 来在每个语句范围内为“过度深入”的急加载器警告消除缓存被禁用,这将禁用该范围内所有语句的缓存。
    参考:#10231
  • [orm] [bug]
    修复了 ORM 在像 Comparator.any() 这样的表达式中使用的内部克隆,以生成相关 EXISTS 构造会干扰 SQL 编译器的“笛卡尔积警告”功能,导致 SQL 编译器在所有语句元素都正确连接时发出警告。
    参考:#10124
  • [orm] [bug]
    修复了 lazy="immediateload" 加载策略在某些情况下会将内部加载令牌放置到 ORM 映射属性中的问题,例如在递归自引用加载中不应发生加载的情况。作为此更改的一部分,lazy="immediateload" 策略现在以与其他急加载器相同的方式尊重 relationship.join_depth 参数进行自引用急加载,其中将其设置为未设置或设置为零将导致自引用的即时加载不会发生,将其设置为一个或更大的值将即时加载直到给定深度。
    参考:#10139
  • [orm] [bug]
    修复了诸如attribute_keyed_dict()之类的基于字典的集合在完全正确地 pickle/unpickle 时未能完全 pickle/unpickle 的问题,导致在 unpickling 后尝试变异此类集合时出现问题。
    参考:#10175
  • [orm] [bug]
    修复了从另一个急加载器使用 aliased() 对加入的继承子类进行列局部操作时,链式调用 load_only() 或其他通配符使用 defer() 会失败的问题。
    参考:#10125
  • [orm] [bug]
    修复了一个问题,即启用 ORM 的select() 构造不会渲染任何仅通过Select.add_cte() 方法添加的 CTE,这些 CTE 在语句中没有被引用。
    参考资料:#10167

例子

  • [examples] [bug]
    dogpile_caching 例子已更新为 2.0 风格的查询。在“缓存查询”逻辑中,添加了一个条件来区分 Queryselect() 在执行无效操作时的情况。

引擎

  • [engine] [bug]
    修复了一个关键问题,即将 create_engine.isolation_level 设置为 AUTOCOMMIT(而不是使用 Engine.execution_options() 方法),如果临时选择了替代隔离级别,那么会在使用 Connection.execution_options.isolation_level 时,无法将“自动提交”恢复到池连接中。
    参考资料:#10147

sql

  • [sql] [bug]
    修复了反序列化 Column 或其他 ColumnElement 时无法恢复正确“比较器”对象的问题,该对象用于生成特定于类型对象的 SQL 表达式。
    这个更改也被 回溯 到了:1.4.50
    参考资料:#10213

类型

  • [typing] [usecase]
    添加了新的类型仅实用函数 Nullable()NotNullable() 以分别将列或 ORM 类型定义为可为空或不可为空。这些函数在运行时无操作,返回未更改的输入。
    参考资料:#10173
  • [typing] [bug]类型改进:
  • 对一些没有返回的 DML 使用 Session.execute() 时,返回 CursorResult
  • 修复了 Query.with_for_update.of 参数在 Query.with_for_update() 中的类型错误
  • 对一些 DML 方法使用的 _DMLColumnArgument 类型进行改进,以传递列表达式
  • 添加了对literal()的重载,因此推断返回类型为BindParameter[NullType],其中literal.type_参数为 None
  • ColumnElement.op()添加重载,以便在未提供ColumnElement.op.return_type时推断类型为Callable[[Any], BinaryExpression[Any]]
  • 添加了对ColumnElement.__add__()的丢失重载
  • 拉取请求由 Mehdi Gmira 提供。
    参考:#9185
  • [typing] [错误]
    修复了SessionAsyncSession等方法中的问题,例如Session.connection()Session.connection.execution_options参数硬编码为不面向用户的内部类型的情况。
    参考:#10182

asyncio

  • [asyncio] [用例]
    添加了新方法AsyncConnection.aclose()作为AsyncConnection.close()的同义词和AsyncSession.aclose()作为AsyncSession.close()的同义词,以提供与 Python 标准库@contextlib.aclosing构造的兼容性。拉取请求由 Grigoriev Semyon 提供。
    参考:#9698

mysql

  • [mysql] [用例]
    更新了 aiomysql 方言,因为该方言似乎再次得到维护。重新添加到使用版本 0.2.0 进行的 ci 测试。
    这个变更也被回溯到:1.4.50

2.0.19

发布日期:2023 年 7 月 15 日

orm

  • [orm] [错误]
    修复了直接设置关系集合的问题,其中新集合中的对象已经存在时,不会触发该对象的级联事件,导致如果该对象不存在,则不会被添加到Session中。这与#6471类似,并且由于在 2.0 系列中删除了cascade_backrefs,这个问题更加明显。作为#6471的一部分添加的AttributeEvents.append_wo_mutation()事件现在也会对同一集合的现有成员发出信号,这些成员在该集合的批量设置中存在。
    参考:#10089
  • [orm] [bug]
    修复了通过 backref 与未加载集合关联的对象,但由于在 2.0 系列中删除了cascade_backrefs而未合并到Session中的问题,将不会发出警告,表明这些对象未包含在刷新中,即使它们是集合的待处理成员;在其他情况下,当要刷新的集合包含将被基本丢弃的非附加对象时,会发出警告。对于  backref 待处理集合成员的警告的添加建立了与可能根据不同的关系加载策略在不同时间基于不同时间刷新或不刷新的集合的更大一致性。
    参考:#10090
  • [orm] [bug] [regression]
    修复了由#9805引起的额外回归,其中对语句上“ORM”标志的更积极传播可能导致在 ORM Query构造中嵌入一个不包含 ORM 实体的 Core SQL 语句时出现内部属性错误, 在这种情况下,ORM 启用的 UPDATE 和 DELETE 语句。
    参考:#10098

engine

  • [engine] [bug]
    Row.tRow.tuple() 重命名为 Row._tRow._tuple();这是为了符合所有方法和预定义属性都应采用 Python 标准库 namedtuple 风格的策略,其中所有固定名称都有一个前导下划线,以避免与现有列名称冲突。先前的方法/属性现已被弃用,并将发出弃用警告。
    参考:#10093
  • [engine] [bug]
    make_url() 函数添加了对非字符串、非 URL 对象的检测,允许立即抛出 ArgumentError,而不是稍后引发故障。特殊逻辑确保允许通过模拟 URL 的形式。拉取请求由 Grigoriev Semyon 提供。
    参考:#10079

postgresql

  • [postgresql] [bug]
    修复了 PostgreSQL URL 解析改进引起的回归问题 #10004,其中带有冒号的“host”查询字符串参数,以支持各种第三方代理服务器和/或方言,将无法正确解析,因为这些被解析为 host:port 组合。解析已更新,只有当主机名仅包含字母数字字符,并且只包含点或短划线时(例如,没有斜杠),才将冒号视为表示 host:port 值的标记,后跟一个零个或多个整数的整数标记。在所有其他情况下,将整个字符串视为主机。
    参考:#10069
  • [postgresql] [bug]
    修复了对 CITEXT 数据类型进行比较时将右侧强制转换为 VARCHAR 的问题,导致右侧未被解释为 CITEXT 数据类型,对于 asyncpg、psycopg3 和 pg80000 方言。这导致 CITEXT 类型在实际使用中基本上无法使用;现已修复此问题,并已更正测试套件以正确断言表达式是否被正确渲染。
    参考:#10096

2.0.18

发布日期:2023 年 7 月 5 日

引擎

  • [engine] [bug]
    调整了create_engine.schema_translate_map功能,以便所有语句中的模式名称都现在被标记化,无论指定的名称是否在给定的立即模式翻译映射中,并在执行时回退到原始名称的替换。这两个更改允许在每次运行时使用包含或不包含各种键的模式翻译映射来重复使用已编译的对象,从而允许在每次使用具有不同键集的模式翻译映射时继续运行时缓存  SQL 构造。另外,增加了检测在同一语句的多次调用中获得或失去None键的 schema_translate_map 字典,这会影响语句的编译,并且与缓存不兼容;针对这些情况引发异常。
    References: #10025

sql

  • [sql] [bug]
    修复了使用“flags”时ColumnOperators.regexp_match()不会生成“稳定”缓存键的问题,也就是说,缓存键每次都会改变,导致缓存污染。对于ColumnOperators.regexp_replace()也存在同样的问题,包括标志和实际替换表达式。现在,标志被表示为固定的修饰符字符串,呈现为安全字符串,而不是绑定参数,并且替换表达式在“binary”元素的主要部分中建立,以便生成适当的缓存键。
    请注意,作为此更改的一部分,ColumnOperators.regexp_match.flagsColumnOperators.regexp_replace.flags 已修改为仅呈现为文字字符串,而以前它们是呈现为完整的 SQL 表达式,通常是绑定参数。这些参数应始终作为普通的 Python 字符串传递,而不是作为 SQL 表达式构造;不希望在实践中使用 SQL 表达式构造该参数,因此这是一个不向后兼容的更改。
    该更改还修改了生成的表达式的内部结构,对于带有或不带有标志的 ColumnOperators.regexp_replace(),以及对于带有标志的 ColumnOperators.regexp_match()。可能已经实现了自己的 regexp 实现的第三方方言(在搜索中找不到此类方言,因此影响预计很低)需要调整结构的遍历以适应。
    此更改也 被回溯 至:1.4.49
    参考:#10042
  • [sql] [错误]
    修复了主要内部 CacheKey 构造中 __ne__() 运算符未正确实现的问题,导致比较 CacheKey 实例时结果荒谬。
    此更改也 被回溯 至:1.4.49

扩展

  • [扩展] [用例]
    association_proxy() association_proxy.create_on_none_assignment 添加了新选项;当一个关联代理引用标量关系被赋值为 None 且引用的对象不存在时,通过创建者创建一个新对象。这显然是 1.2 系列中的一个未定义行为,被悄悄移除了。
    参考:#10013

键入

  • [键入] [用例]
    在使用来自 sqlalchemy.sql.operators 的独立运算符函数(如 sqlalchemy.sql.operators.eq)时,改进了类型。
    参考:#10054
  • [键入] [错误]
    修复了在 aliased() 构造中的一些类型问题,以正确接受已用 Table.alias() 别名的 Table 对象,以及对 FromClause 对象作为“selectable”参数的一般支持,因为这是完全支持的。
    参考:#10061

postgresql

  • [postgresql] [usecase]
    为 asyncpg 方言添加了多主机支持。 还对“多主机”用例的 PostgreSQL URL 例程进行了一般改进和错误检查。 感谢 Ilia Dmitriev 提供的拉取请求。
    另见
    多主机连接
    参考:#10004
  • [postgresql] [bug]
    为所有 PostgreSQL 方言添加了新参数 native_inet_types=False,表示 DBAPI 使用的转换器将禁用 PostgreSQL INETCIDR 列的行转换为 Python ipaddress 数据类型,而返回字符串。 这允许编写代码以使用这些数据类型的字符串进行迁移,而无需进行代码更改,只需将此参数添加到 create_engine()create_async_engine() 函数调用中。
    另见
    网络数据类型
    参考:#9945

mariadb

  • [mariadb] [usecase] [reflection]
    允许从 MariaDB 反射 UUID 列。 这使得 Alembic 能够正确检测现有 MariaDB 数据库中此类列的类型。
    参考:#10028

mssql

  • [mssql] [usecase]
    添加了对 MSSQL 方言中 COLUMNSTORE 索引的创建和反射的支持。 可以在指定 mssql_columnstore=True 的索引上指定。
    参考:#7340
  • [mssql] [bug] [sql]
    修复了将 Cast 执行到具有显式排序规则的字符串类型时,将在 CAST 函数内部渲染 COLLATE 子句的问题,从而导致语法错误。
    参考:#9932


SqlAlchemy 2.0 中文文档(五十八)(2)https://developer.aliyun.com/article/1563134

相关文章
|
4月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(五十八)(2)
SqlAlchemy 2.0 中文文档(五十八)
84 0
|
4月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(3)
SqlAlchemy 2.0 中文文档(五十八)
22 0
|
4月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(6)
SqlAlchemy 2.0 中文文档(五十八)
47 0
|
4月前
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(7)
SqlAlchemy 2.0 中文文档(五十八)
58 0
|
4月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(4)
SqlAlchemy 2.0 中文文档(五十八)
30 0
|
4月前
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(5)
SqlAlchemy 2.0 中文文档(五十八)
37 0
|
4月前
|
SQL 关系型数据库 PostgreSQL
SqlAlchemy 2.0 中文文档(五十九)(5)
SqlAlchemy 2.0 中文文档(五十九)
31 0
|
4月前
|
SQL 缓存 Oracle
SqlAlchemy 2.0 中文文档(五十九)(1)
SqlAlchemy 2.0 中文文档(五十九)
160 0
|
4月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(五十九)(4)
SqlAlchemy 2.0 中文文档(五十九)
28 0
|
4月前
|
SQL 关系型数据库 PostgreSQL
SqlAlchemy 2.0 中文文档(五十九)(7)
SqlAlchemy 2.0 中文文档(五十九)
24 0