SqlAlchemy 2.0 中文文档(五十九)(1)https://developer.aliyun.com/article/1563147
1.4.38
发布日期:2022 年 6 月 23 日
orm
- [orm] [bug] [regression]
修复了由#8064引起的回归,其中对列对应性的特定检查过于宽松,导致一些 ORM 子查询的渲染不正确,例如那些使用PropComparator.has()
或PropComparator.any()
与使用传统别名功能的联接继承查询。
参考:#8162 - [orm] [bug] [sql]
修复了在使用 ORM 执行语句时,GenerativeSelect.fetch()
未被应用的问题。
参考:#8091 - [orm] [bug]
修复了一个问题,即with_loader_criteria()
选项无法被 pickle,这在与缓存方案一起传播到懒加载器时是必要的。目前,唯一支持的可 pickle 形式是将“where criteria”作为一个固定的模块级可调用函数传递,该函数生成一个 SQL 表达式。一个临时的“lambda”无法被 pickle,而一个 SQL 表达式对象通常不能直接完全 pickle。
参考:#8109
engine
- [engine] [bug]
修复了一个阻止诸如Connection
等关键对象具有正确__weakref__
属性的弃用警告类装饰器,导致像 Python 标准库inspect.getmembers()
之类的操作失败。
参考:#8115
sql
- [sql] [bug]
修复了与lambda_stmt()
相关的多个观察到的竞争条件,包括在多个同时线程中首次分析新的 Python 代码对象时出现的初始“dogpile”问题,这导致了性能问题以及一些内部状态的损坏。此外,修复了观察到的竞争条件,当在不同线程中编译或访问正在被克隆的表达式构造时可能发生,因为 Python 版本在 3.10 之前的版本中,由于记忆化属性在迭代时改变__dict__
,特别是 lambda SQL 构造对此很敏感,因为它持久地保留一个单一的语句对象。迭代已经被改进为使用dict.copy()
,无论是否有额外的迭代。
参考:#8098 - [sql] [bug]
加强了Cast
和其他“包装”列构造的机制,以更完全地保留被包装的Label
构造,包括标签名称将在Subquery
的.c
集合中被保留。该标签已经能够在它被包装在内部的构造外正确地呈现 SQL。
参考:#8084 - [sql] [错误]
调整了对#8056所做的修复,该修复调整了具有特殊字符的绑定参数名称的转义方式,以便在 SQL 编译步骤之后翻译转义名称,这破坏了 FAQ 中一个已发布的示例,该示例说明了如何将参数名称合并到编译后的 SQL 字符串的输出中。该更改恢复了来自compiled.params
的转义名称,并向SQLCompiler.construct_params()
添加了一个条件参数,命名为escape_names
,默认为True
,以默认情况下恢复旧行为。
参考资料:#8113
模式
- [模式] [错误]
修复了涉及Table.include_columns
和Table.resolve_fks
参数的错误;这些很少使用的参数显然无法为引用外键约束的列工作。
在第一种情况下,引用外键的未包含列仍然会尝试创建一个ForeignKey
对象,在尝试解析外键约束的列时会产生错误;引用被跳过的列的外键约束现在与具有相同条件的Index
和UniqueConstraint
对象一样在表反射过程中被省略了。但是不会产生警告,因为我们可能希望在 2.0 中删除所有约束的 include_columns 警告。
在后一种情况下,如果找不到与 FK 相关的表,则会在resolve_fks=False
的情况下无法生成表别名或子查询;逻辑已被修复,因此如果未找到相关表,则ForeignKey
对象仍会被代理到别名表或子查询(这些ForeignKey
对象通常用于生成连接条件),但会发送一个标志,表明它是不可解析的。然后,别名表/子查询将正常工作,唯一的例外是它无法自动生成连接条件,因为缺少外键信息。这已经是这种外键约束的行为,该约束是使用非反射方法产生的,例如从不同的MetaData
集合中连接Table
对象。
参考:#8100, #8101 - [模式] [错误] [mssql]
修复了一个问题,当Table
对象使用带有Numeric
数据类型的 IDENTITY 列时,尝试调解“autoincrement”列时会产生错误,阻止了使用Column.autoincrement
参数来构造Column
的构造,并在尝试调用Insert
构造时发出错误。
参考:#8111
扩展
- [扩展] [错误]
修复了在Mutable
中的错误,在其中对包含多个Mutable
启用属性的映射实例进行 pickling 和 unpickling 时,将不会正确恢复状态。
参考:#8133
1.4.37
发布日期:2022 年 5 月 31 日
orm
- [orm] [错误]
修复了使用column_property()
构造包含子查询的问题,该子查询针对已映射的列属性将不正确应用 ORM 编译行为,包括针对单表继承表达式添加的“IN”表达式将无法包含的问题。
参考:#8064 - [orm] [bug]
修复了一个问题,在 ORM 结果中,在选择的列集更改时,例如使用Select.with_only_columns()
时,会向返回的Row
对象应用不正确的键名。
参考:#8001 - [orm] [bug] [oracle] [postgresql]
修复了一个 bug,很可能是从 1.3 版本开始的回归,当使用需要绑定参数转义的列名时(更具体地说,当在使用 Oracle 时列名需要引用时,例如以下划线开头的列名,或在某些情况下使用某些 PostgreSQL 驱动程序时,当使用包含百分号的列名时),如果版本控制列本身具有此类名称,则 ORM 版本控制功能将无法正常工作,因为 ORM 假定存在某些绑定参数命名约定,这些约定通过引号受到干扰。此问题与 #8053 相关,并且基本上修改了修复此问题的方法,修改了最初为广义绑定参数名称引用创建初始实现的原始问题 #5653。
参考:#8056
引擎
- [engine] [bug] [tests]
修复了在支持记录“stacklevel”日志时实施的问题,在 #7612 中,需要调整以使其与最近发布的 Python 3.11.0b1 版本一起使用,还修复了测试此功能的单元测试。
参考:#8019
SQL
- [sql] [bug] [postgresql] [sqlite]
修复了一个 bug,在 PostgreSQL 的Insert.on_conflict_do_update()
方法和 SQLite 的Insert.on_conflict_do_update()
方法中,当使用字典传递给Insert.on_conflict_do_update.set_
时,如果通过其键名指定列时失败,以及如果直接使用Insert.excluded
集合作为字典时也会失败,尤其是当列有单独的“.key”时。
参考:#8014 - [sql] [bug]
当Insert.from_select()
传递一个“复合选择”对象,如 UNION,但 INSERT 语句需要附加额外的列以支持来自表元数据的 Python 端或显式 SQL 默认值时,将引发一个信息性错误。在这种情况下,应传递复合对象的子查询。
引用:#8073 - [sql] [bug]
修复了使用bindparam()
没有明确给出数据或类型时,可能会在表达式中被强制转换为不正确类型的问题,例如当使用Comparator.any()
和Comparator.all()
时。
引用:#7979 - [sql] [bug]
如果两个单独的BindParameter
对象共享相同的名称,但一个在“扩展”上下文中使用(通常是 IN 表达式),另一个则不是,则会引发一个信息性错误;在这两种不同风格的用法中混合使用相同的名称不受支持,通常应在要在 IN 表达式之外接收列表值的参数上设置expanding=True
参数(默认情况下设置expanding
)。
引用:#8018
mysql
- [mysql] [bug]
进一步调整 MySQL PyODBC 方言,以允许完全的连接性,尽管在#7871中已经修复,但之前仍然无法正常工作。
引用:#7966 - [mysql] [bug]
为 MySQL 错误 4031 添加了断开连接代码,该错误在 MySQL >= 8.0.24 中引入,表示连接空闲超时已超过。特别是,这修复了一个问题,即预先 ping 不能在超时连接上重新连接的问题。拉取请求由 valievkarim 提供。
引用:#8036
mssql
- [mssql] [bug]
修复了以“{”开头的密码导致登录失败的问题。
引用:#8062 - [mssql] [bug] [reflection]
在使用 MSSQL 反射表列时明确指定排序规则,以防止“排序规则冲突”错误。
引用:#8035
oracle
- [oracle] [usecase]
为 Oracle 断开处理添加了两个新的错误代码,以支持 Oracle 发布的新“python-oracledb”驱动程序的早期测试。
引用:#8066 - [oracle] [bug]
修复了 SQL 编译器问题,即如果绑定参数的名称被“转义”,则绑定参数的“绑定处理”函数不会正确应用于绑定值。具体来说,这适用于 Oracle 等情况,当Column
的名称本身需要引号引用时,因此在 DML 语句中生成的绑定参数使用需要绑定处理的数据类型时,引号引用的名称将用于绑定参数。
参考:#8053
1.4.36
发布日期:2022 年 4 月 26 日
orm
- [orm] [bug] [regression]
修复了回归问题,即在版本 1.4.33 中发布的为#7861所做的更改,使Insert
构造部分被识别为 ORM 启用的语句,未正确传递正确的映射器/映射表状态给Session
,导致绑定到使用Session.binds
参数绑定到引擎和/或连接的Session
的Session.get_bind()
方法失败。
参考:#7936
orm 声明式
- [orm] [declarative] [bug]
修改了DeclarativeMeta
元类,将cls.__dict__
传递到声明扫描过程中以查找属性,而不是传递给类型的__init__()
方法的单独字典。这允许用户定义的基类在__init_subclass__()
中添加属性时按预期工作,因为__init_subclass__()
只能影响cls.__dict__
本身,而不能影响其他字典。从技术上讲,这是从 1.3 版本中使用__dict__
的退化。
参考:#7900
引擎
- [engine] [bug]
修复了 C 扩展中的内存泄漏问题,当在 Python 3 中调用Row
的命名成员时,如果成员不存在,可能会发生内存泄漏;特别是在 NumPy 转换期间尝试调用.__array__
等成员时,但问题围绕着Row
对象抛出的任何AttributeError
。这个问题不适用于已经过渡到 Cython 的 2.0 版本。非常感谢 Sebastian Berg 发现了这个问题。
参考:#7875 - [引擎] [错误]
添加了一个关于Result.columns()
方法中存在的 bug 的警告,当在与将返回单个 ORM 实体的Result
一起传递 0 时,这表明Result.columns()
方法的当前行为在这种情况下是错误的,因为Result
对象将产生标量值而不是Row
对象。这个问题将在 2.0 中修复,这将是一个向后不兼容的更改,对于依赖于当前错误行为的代码来说,这是一个向后不兼容的更改。想要接收标量值集合的代码应该使用Result.scalars()
方法,它将返回一个新的ScalarResult
对象,该对象产生非行标量对象。
参考:#7953
模式
- [模式] [错误]
修复了一个 bug,当使用referred_column_0
命名约定键设置外键约束时,如果外键约束是作为一个ForeignKey
对象而不是一个明确的ForeignKeyConstraint
对象来设置时,命名约定将无效。由于此更改使用了一些从版本 2.0 中回退的修复的特性,还修复了一个很可能已经存在多年的、不为人所知的特性,即一个ForeignKey
对象可以仅通过表的名称而不使用列名来引用被引用的表,如果被引用列的名称与被引用列的名称相同的话。
先前未对ForeignKey
对象进行测试的referred_column_0
命名约定键,仅对ForeignKeyConstraint
进行了测试,此 bug 揭示了除非对所有 FK 约束使用ForeignKeyConstraint
,否则该功能从未正确工作。此 bug 可追溯到为 #3989 引入该功能。
参考:#7958
asyncio
- [asyncio] [错误修复]
修复了异步适配事件处理程序中contextvar.ContextVar
对象的处理。先前,在非可等待代码中调用可等待项时,不会传播应用于ContextVar
的值。
参考:#7937
postgresql
- [postgresql] [错误修复]
修复了在 PostgreSQL 上使用ARRAY
数据类型与Enum
结合时的 bug,其中使用.any()
或.all()
方法以 Python 枚举成员作为参数来渲染 SQL 的 ANY() 或 ALL(),会导致所有驱动程序的类型适配失败。
参考:#6515 - [postgresql] [错误修复]
为 PostgreSQLUUID
类型对象实现了UUID.python_type
属性。该属性将根据UUID.as_uuid
参数设置返回str
或uuid.UUID
。此前,该属性未实现。感谢 Alex Grönholm 的拉取请求。
参考:#7943 - [postgresql] [错误修复]
修复了在使用create_engine.pool_pre_ping
参数时,psycopg2 方言中的问题,该问题会导致用户配置的AUTOCOMMIT
隔离级别被“ping”处理程序意外重置。
参考:#7930
mysql
- [mysql] [错误修复] [回归]
修复了未经测试的 MySQL PyODBC 方言中的一个回归,该回归是由于版本 1.4.32 中对 #7518 的修复引起的,导致在首次连接时错误地传播了一个参数,从而导致TypeError
。
参考:#7871
测试
- [测试] [错误修复]
对于第三方方言,修复了对SimpleUpdateDeleteTest
套件测试的一个缺失要求,该套件测试未检查目标方言上的“rowcount”函数是否有效。
参考:#7919
1.4.35
发布日期:2022 年 4 月 6 日
sql
- [sql] [bug]修复了新实现的
FunctionElement.table_valued.joins_implicitly
功能中的错误,即参数不会自动从原始TableValuedAlias
对象传播到调用TableValuedAlias.render_derived()
或TableValuedAlias.alias()
时生成的次要对象。另外还修复了TableValuedAlias
中的这些问题:
- 修复了可能发生的内存问题,即在连续对同一对象的副本调用
TableValuedAlias.render_derived()
时可能发生的问题(对于.alias(),我们目前仍然必须继续从前一个元素链接。不确定是否可以改进,但这是.alias()在其他地方的标准行为) - 修复了调用
TableValuedAlias.render_derived()
或TableValuedAlias.alias()
时个别元素类型丢失的问题。
- 参考:#7890
- [sql] [bug] [regression]
修复了由#7823引起的回归问题,影响了缓存系统,使得在 ORM 操作中“克隆”绑定参数的情况下,例如多态加载,在某些情况下可能不会获得正确的执行时值,导致渲染不正确的绑定值。
参考:#7903
1.4.34
发布日期:2022 年 3 月 31 日
orm
postgresql
- [postgresql] [bug]
为了修复#6581中的问题,缩减了对 psycopg2 的“executemany values”模式的禁用,不再适用于所有“ON CONFLICT”风格的 INSERT,以避免应用于“ON CONFLICT DO NOTHING”子句,该子句不包含任何参数,对于“executemany values”模式是安全的。“ON CONFLICT DO UPDATE”仍然被阻止使用“executemany values”,因为在 DO UPDATE 子句中可能有无法批量处理的额外参数(这是#6581修复的原始问题)。
参考:#7880
1.4.33
发布日期:2022 年 3 月 31 日
orm
- [orm] [usecase]
添加了with_polymorphic.adapt_on_names
到with_polymorphic()
函数,允许针对将仅根据列名适应到原始映射可选择项的替代可选择项进行多态加载(通常使用具体映射)。
参考:#7805 - [orm] [usecase]
添加了新属性UpdateBase.returning_column_descriptions
和UpdateBase.entity_description
,允许检查作为Insert
、Update
或Delete
构造的 ORM 属性和实体。对于仅限于 Core 的可选择项,现在还实现了Select.column_descriptions
访问器。
参考:#7861 - [orm] [performance] [bug]
ORM 在内存使用方面有所改进,删除了一组重要的中间表达式对象,这些对象通常在创建表达式对象的副本时存储。这些克隆对象已大大减少,将 ORM 映射中存储的总表达式对象数量减少约 30%。
参考:#7823 - [orm] [bug] [regression]
修复了“动态”加载策略中的回归,其中Query.filter_by()
方法在查询的关系中存在“次要”表且映射针对复杂内容(如“with polymorphic”)时,不会给出适当的实体进行过滤。
参考:#7868 - [orm] [错误]
修复了composite()
属性与连接表继承的selectin_polymorphic()
加载策略不兼容的错误。
参考:#7801 - [orm] [错误]
修复了selectin_polymorphic()
加载选项在没有固定“polymorphic_on”列的连接继承映射器上无法工作的问题。此外,还增加了对此结构的更广泛用法模式的测试支持。
参考:#7799 - [orm] [错误]
修复了with_loader_criteria()
函数中的错误,其中加载条件不会应用于在父对象的刷新操作范围内调用的连接急加载。
参考:#7862 - [orm] [错误]
修复了Mapper
在映射到UNION
时过于激进地减少用户定义的Mapper.primary_key
参数的错误,其中对于某些 SELECT 条目,两列本质上是等效的,但在另一个条目中,它们不是,例如在递归 CTE 中。这里的逻辑已更改为接受给定的用户定义 PK,其中列将与映射的可选择相关联,但不再“减少”,因为这种启发式无法适应所有情况。
参考:#7842
引擎
- [引擎] [用例]
添加了新参数Engine.dispose.close
,默认为 True。当为 False 时,引擎处理不会触及旧池中的连接,只是丢弃池并替换它。这种用例是为了当原始池从父进程传输时,父进程可以继续使用这些连接。
另请参阅
使用连接池与多进程或 os.fork() - 修订文档
参考:#7815, #7877 - [引擎] [错误]
进一步澄清连接级别的日志记录,以指示当使用 AUTOCOMMIT 隔离级别时,BEGIN、ROLLBACK 和 COMMIT 日志消息实际上并不表示真实的事务;消息已扩展以包括 BEGIN 消息本身,并且消息还已被修复以适应直接使用Engine
级别的create_engine.isolation_level
参数时的情况。
参考:#7853
sql
- [sql] [用例]
添加了新参数FunctionElement.table_valued.joins_implicitly
, 用于FunctionElement.table_valued()
结构。此参数指示提供的表值函数将自动与引用的表执行隐式连接。这实际上禁用了“from linting”功能,例如由于存在此参数而触发的“笛卡尔积”警告。可用于函数,如func.json_each()
。
参考:#7845 - [sql] [错误]
bindparam.literal_execute
参数现在参与了bindparam()
的缓存生成,因为它更改了编译器生成的 sql 字符串。以前使用了正确的绑定值,但是在相同查询的后续执行中会忽略literal_execute
。
参考:#7876 - [sql] [错误] [回归]
修复了由 #7760 引起的回归,其中TextualSelect
的新功能未在编译器中完全实现,导致与 CTE 和文本语句结合时出现“INSERT FROM SELECT”和“INSERT…ON CONFLICT”等复合 INSERT 结构的问题。
参考:#7798
模式
- [模式] [用例]
添加了支持,使得传递给Table.to_metadata()
的Table.to_metadata.referred_schema_fn
可调用对象可以返回值BLANK_SCHEMA
以指示参考外键应重置为 None。该函数还可以返回RETAIN_SCHEMA
符号以指示“无更改”,这将与当前行为相同,当前行为也表示无更改。
参考资料:#7860
sqlite
- [sqlite] [bug] [reflection]
修复了在 SQLite 下 CHECK 约束的名称不会反映的错误,如果使用引号创建名称,则会出现这种情况,这种情况下名称使用混合大小写或特殊字符。
参考资料:#5463
mssql
- [mssql] [bug] [regression]
修复了由#7160引起的回归,当 FK 反射与低兼容性级别设置(兼容性级别 80:SQL Server 2000)一起导致“模糊列名”错误。修补程序由@Lin-Your 提供。
参考资料:#7812
杂项
- [bug] [ext]
改进了association_proxy()
构造尝试在类级别访问目标属性且此访问失败时引发的错误消息。这里的特定用例是当代理到不包括工作类级实现的混合属性时。
参考资料:#7827
1.4.32
发布日期:2022 年 3 月 6 日
orm
- [orm] [bug] [regression]
修复了 ORM 异常的回归,当 INSERT 默默失败未真正插入行(例如来自触发器)时,由于运行时提前引发的异常由于缺少主键值而不会到达,因此引发了一个不具信息的异常而不是正确的异常。对于 1.4 及以上版本,在此情况下添加了一个新的FlushError
,它比 1.3 的以前的“空标识”异常更早地被引发,因为实际 INSERT 的行数不符合预期的情况在 1.4 中是一个更关键的情况,因为它阻止了多个对象的批处理正确工作。这与新提取的主键值被提取为 NULL 的情况不同,后者继续引发现有的“空标识”异常。
参考:#7594 - [ORM] [错误]
修复了在relationship()
中使用完全合格路径的类名的问题,尽管其中包含了不正确的路径标记名称,但不是第一个标记,但是失败不会引发具有信息的错误,而是在稍后的步骤中随机失败。
参考:#7697
引擎
- [引擎] [错误]
调整了关键的 SQLAlchemy 组件的日志记录,包括Engine
,Connection
以建立适当的堆栈级别参数,这样当在自定义日志格式化程序中使用 Python 日志标记funcName
和lineno
时,将报告正确的信息,这在过滤日志输出时可能很有用;在 Python 3.8 及以上版本上支持。感谢 Markus Gerstel 的贡献的拉取请求。
参考:#7612
SQL
- [SQL] [错误]
修复了由于字符串格式错误而导致值为元组的错误消息失败的问题,包括对不支持的文字值和无效的布尔值的编译。
参考:#7721 - [SQL] [错误] [MySQL]
修复了 MySQLSET
数据类型以及通用Enum
数据类型中的问题,在这些类型的__repr__()
方法不会在字符串输出中呈现所有可选参数,影响这些类型在 Alembic 自动生成中的使用。MySQL 的拉取请求由 Yuki Nishimine 提供。
参考:#7598, #7720, #7789 - [SQL] [错误]
现在,如果指定了Enum.length
参数而没有同时指定Enum.native_enum
为 False,Enum
数据类型会发出警告,因为在这种情况下参数将被静默忽略,尽管Enum
数据类型仍会在没有原生 ENUM 数据类型的后端(如 SQLite)上渲染 VARCHAR DDL。这种行为在未来的发布中可能会更改,以便无论“native_enum”设置如何,“length”都会适用于所有非本机“enum”类型。 - [sql] [bug]
修复了当在TextualSelect
实例上调用HasCTE.add_cte()
方法时,SQL 编译器未进行适配的问题。此修复还将更多“SELECT”类似的编译器行为添加到TextualSelect
中,包括可容纳 DML CTEs(如 UPDATE 和 INSERT)。
参考:#7760
asyncio
- [asyncio] [bug]
修复了在某些事件监听类别中未为异步引擎引发描述性错误消息的问题,应该是同步引擎实例。 - [asyncio] [bug]
修复了当使用不兼容同步风格Result
对象的流式结果执行选项Connection.execution_options.stream_results
时,AsyncSession.execute()
方法未引发信息丰富的异常的问题。在这种情况下,现在会引发异常,就像在与AsyncConnection.execute()
方法一起使用Connection.execution_options.stream_results
选项时已引发异常一样。
此外,为了提高与状态敏感的数据库驱动程序(如 asyncmy)的稳定性,当出现此错误条件时,游标现在会被关闭;以前在 asyncmy 方言中,连接会进入无效状态,服务器端结果仍未消耗。
参考:#7667
postgresql
- [postgresql] [usecase]
添加了对 PostgreSQLNOT VALID
短语的编译器支持,用于渲染CheckConstraint
、ForeignKeyConstraint
和ForeignKey
架构构造的 DDL。感谢 Gilbert Gilb 的拉取请求。
另请参阅
PostgreSQL 约束选项
参考:#7600
mysql
- [mysql] [bug] [regression]
由 #7518 引起的回归问题,其中将语法“SHOW VARIABLES”更改为“SELECT @@”破坏了与早于 5.6 版本的 MySQL 版本(包括早期 5.0 发行版)的兼容性。虽然这些是非常旧的 MySQL 版本,但并未计划更改兼容性,因此已恢复了特定于版本的逻辑,以便在 MySQL 服务器版本 < 5.6 时回退到“SHOW VARIABLES”。
参考:#7518
mariadb
- [mariadb] [bug] [regression]
修复了 mariadbconnector 方言中的回归问题,截至 mariadb 连接器 1.0.10,DBAPI 不再预缓冲 cursor.lastrowid,导致在使用 ORM 插入对象时出错,同时导致CursorResult.inserted_primary_key
属性不可用。该方言现在主动获取此值,以适用的情况。
参考:#7738
sqlite
- [sqlite] [usecase]
添加了对反映 SQLite 内联唯一约束的支持,其中列名使用 SQLite 的“转义引号”[]
或 ```py, which are discarded by the database when producing the column name.
References: #7736 - [sqlite] [bug]
Fixed issue where SQLite unique constraint reflection would fail to detect a column-inline UNIQUE constraint where the column name had an underscore in its name.
References: #7736
oracle
- [oracle] [bug]
Fixed issue in Oracle dialect where using a column name that requires quoting when written as a bound parameter, such as"_id"
, would not correctly track a Python generated default value due to the bound-parameter rewriting missing this value, causing an Oracle error to be raised.
References: #7676 - [oracle] [bug] [regression]
Added support to parse “DPI” error codes from cx_Oracle exception objects such asDPI-1080
andDPI-1010
, both of which now indicate a disconnect scenario as of cx_Oracle 8.3.
References: #7748
tests
- [tests] [bug]
Improvements to the test suite’s integration with pytest such that the “warnings” plugin, if manually enabled, will not interfere with the test suite, such that third parties can enable the warnings plugin or make use of the-W
parameter and SQLAlchemy’s test suite will continue to pass. Additionally, modernized the detection of the “pytest-xdist” plugin so that plugins can be globally disabled using PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 without breaking the test suite if xdist were still installed. Warning filters that promote deprecation warnings to errors are now localized to SQLAlchemy-specific warnings, or within SQLAlchemy-specific sources for general Python deprecation warnings, so that non-SQLAlchemy deprecation warnings emitted from pytest plugins should also not impact the test suite.
References: #7599 - [tests] [bug]
Made corrections to the default pytest configuration regarding how test discovery is configured, to fix issue where the test suite would not configure warnings correctly and also attempt to load example suites as tests, in the specific case where the SQLAlchemy checkout were located in an absolute path that had a super-directory named “test”.
References: #7045
1.4.31
Released: January 20, 2022
orm
- [orm] [bug]
Fixed issue inSession.bulk_save_objects()
where the sorting that takes place when thepreserve_order
parameter is set to False would sort partially onMapper
objects, which is rejected in Python 3.11.
References: #7591
postgresql
- [postgresql] [bug] [regression]
Fixed regression where the change in #7148 to repair ENUM handling in PostgreSQL broke the use case of an empty ARRAY of ENUM, preventing rows that contained an empty array from being handled correctly when fetching results.
References: #7590
mysql
- [mysql] [bug] [regression]
Fixed regression in asyncmy dialect caused by #7567 where removal of the PyMySQL dependency broke binary columns, due to the asyncmy dialect not being properly included within CI tests.
References: #7593
mssql
- [mssql]
Added support forFILESTREAM
when usingVARBINARY(max)
in MSSQL.
See alsoVARBINARY.filestream
References: #7243
1.4.30
Released: January 19, 2022
orm
- [orm] [bug]
Fixed issue in joined-inheritance load of additional attributes functionality in deep multi-level inheritance where an intermediary table that contained no columns would not be included in the tables joined, instead linking those tables to their primary key identifiers. While this works fine, it nonetheless in 1.4 began producing the cartesian product compiler warning. The logic has been changed so that these intermediary tables are included regardless. While this does include additional tables in the query that are not technically necessary, this only occurs for the highly unusual case of deep 3+ level inheritance with intermediary tables that have no non primary key columns, potential performance impact is therefore expected to be negligible.
References: #7507 - [orm] [bug]
Fixed issue where calling uponregistry.map_imperatively()
more than once for the same class would produce an unexpected error, rather than an informative error that the target class is already mapped. This behavior differed from that of themapper()
function which does report an informative message already.
References: #7579 - [orm] [bug] [asyncio]
Added missing methodAsyncSession.invalidate()
to theAsyncSession
class.
References: #7524 - [orm] [bug] [regression]
Fixed regression which appeared in 1.4.23 which could cause loader options to be mis-handled in some cases, in particular when using joined table inheritance in combination with thepolymorphic_load="selectin"
option as well as relationship lazy loading, leading to aTypeError
.
References: #7557 - [orm] [bug] [regression]
Fixed ORM regression where calling thealiased()
function against an existingaliased()
construct would fail to produce correct SQL if the existing construct were against a fixed table. The fix allows that the originalaliased()
construct is disregarded if it were only against a table that’s now being replaced. It also allows for correct behavior when constructing aaliased()
without a selectable argument against aaliased()
that’s against a subuquery, to create an alias of that subquery (i.e. to change its name).
The nesting behavior ofaliased()
remains in place for the case where the outeraliased()
object is against a subquery which in turn refers to the inneraliased()
object. This is a relatively new 1.4 feature that helps to suit use cases that were previously served by the deprecatedQuery.from_self()
method.
References: #7576 - [orm] [bug]
Fixed issue whereSelect.correlate_except()
method, when passed either theNone
value or no arguments, would not correlate any elements when used in an ORM context (that is, passing ORM entities as FROM clauses), rather than causing all FROM elements to be considered as “correlated” in the same way which occurs when using Core-only constructs.
References: #7514 - [orm] [bug] [regression]
Fixed regression from 1.3 where the “subqueryload” loader strategy would fail with a stack trace if used against a query that made use ofQuery.from_statement()
orSelect.from_statement()
. As subqueryload requires modifying the original statement, it’s not compatible with the “from_statement” use case, especially for statements made against thetext()
construct. The behavior now is equivalent to that of 1.3 and previously, which is that the loader strategy silently degrades to not be used for such statements, typically falling back to using the lazyload strategy.
References: #7505
sql
- [sql] [bug] [postgresql]
Added additional rule to the system that determinesTypeEngine
implementations from Python literals to apply a second level of adjustment to the type, so that a Python datetime with or without tzinfo can set thetimezone=True
parameter on the returnedDateTime
object, as well asTime
. This helps with some round-trip scenarios on type-sensitive PostgreSQL dialects such as asyncpg, psycopg3 (2.0 only).
References: #7537 - [sql] [bug]
Added an informative error message when a method object is passed to a SQL construct. Previously, when such a callable were passed, as is a common typographical error when dealing with method-chained SQL constructs, they were interpreted as “lambda SQL” targets to be invoked at compilation time, which would lead to silent failures. As this feature was not intended to be used with methods, method objects are now rejected.
References: #7032
mypy
- [mypy] [bug]
Fixed Mypy crash when running id daemon mode caused by a missing attribute on an internal mypyVar
instance.
References: #7321
asyncio
- [asyncio] [usecase]
Added new methodAdaptedConnection.run_async()
to the DBAPI connection interface used by asyncio drivers, which allows methods to be called against the underlying “driver” connection directly within a sync-style function where theawait
keyword can’t be used, such as within SQLAlchemy event handler functions. The method is analogous to theAsyncConnection.run_sync()
method which translates async-style calls to sync-style. The method is useful for things like connection-pool on-connect handlers that need to invoke awaitable methods on the driver connection when it’s first created.
See also
Using awaitable-only driver methods in connection pool and other events
References: #7580
postgresql
- [postgresql] [usecase]
Added string rendering to theUUID
datatype, so that stringifying a statement with “literal_binds” that uses this type will render an appropriate string value for the PostgreSQL backend. Pull request courtesy José Duarte.
References: #7561 - [postgresql] [bug] [asyncpg]
Improved support for asyncpg handling of TIME WITH TIMEZONE, which was not fully implemented.
References: #7537 - [postgresql] [bug] [mssql] [reflection]
Fixed reflection of covering indexes to reportinclude_columns
as part of thedialect_options
entry in the reflected index dictionary, thereby enabling round trips from reflection->create to be complete. Included columns continue to also be present under theinclude_columns
key for backwards compatibility.
References: #7382 - [postgresql] [bug]
Fixed handling of array of enum values which require escape characters.
References: #7418
mysql
- [mysql] [change]
ReplaceSHOW VARIABLES LIKE
statement with equivalentSELECT @@variable
in MySQL and MariaDB dialect initialization. This should avoid mutex contention caused bySHOW VARIABLES
, improving initialization performance.
References: #7518 - [mysql] [bug]
Removed unnecessary dependency on PyMySQL from the asyncmy dialect. Pull request courtesy long2ice.
References: #7567
SqlAlchemy 2.0 中文文档(五十九)(3)https://developer.aliyun.com/article/1563149