SqlAlchemy 2.0 中文文档(五十九)(2)

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

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_columnsTable.resolve_fks参数的错误;这些很少使用的参数显然无法为引用外键约束的列工作。
    在第一种情况下,引用外键的未包含列仍然会尝试创建一个ForeignKey对象,在尝试解析外键约束的列时会产生错误;引用被跳过的列的外键约束现在与具有相同条件的IndexUniqueConstraint对象一样在表反射过程中被省略了。但是不会产生警告,因为我们可能希望在 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参数绑定到引擎和/或连接的SessionSession.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] [错误修复]
    为 PostgreSQL UUID 类型对象实现了 UUID.python_type 属性。该属性将根据 UUID.as_uuid 参数设置返回 struuid.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

  • [orm] [bug] [regression]
    修复了由#7861引起的回归问题,即通过Session.execute()直接调用包含 ORM 实体的Insert构造会失败的问题。
    参考:#7878

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_nameswith_polymorphic()函数,允许针对将仅根据列名适应到原始映射可选择项的替代可选择项进行多态加载(通常使用具体映射)。
    参考:#7805
  • [orm] [usecase]
    添加了新属性UpdateBase.returning_column_descriptionsUpdateBase.entity_description,允许检查作为InsertUpdateDelete构造的 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 组件的日志记录,包括EngineConnection以建立适当的堆栈级别参数,这样当在自定义日志格式化程序中使用 Python 日志标记funcNamelineno时,将报告正确的信息,这在过滤日志输出时可能很有用;在 Python 3.8 及以上版本上支持。感谢 Markus Gerstel 的贡献的拉取请求。
    参考:#7612

SQL

  • [SQL] [错误]
    修复了由于字符串格式错误而导致值为元组的错误消息失败的问题,包括对不支持的文字值和无效的布尔值的编译。
    参考:#7721
  • [SQL] [错误] [MySQL]
    修复了 MySQL SET 数据类型以及通用 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]
    添加了对 PostgreSQL NOT VALID 短语的编译器支持,用于渲染 CheckConstraintForeignKeyConstraintForeignKey 架构构造的 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 as DPI-1080 and DPI-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 in Session.bulk_save_objects() where the sorting that takes place when the preserve_order parameter is set to False would sort partially on Mapper 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 for FILESTREAM when using VARBINARY(max) in MSSQL.
    See also
    VARBINARY.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 upon registry.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 the mapper() function which does report an informative message already.
    References: #7579
  • [orm] [bug] [asyncio]
    Added missing method AsyncSession.invalidate() to the AsyncSession 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 the polymorphic_load="selectin" option as well as relationship lazy loading, leading to a TypeError.
    References: #7557
  • [orm] [bug] [regression]
    Fixed ORM regression where calling the aliased() function against an existing aliased() construct would fail to produce correct SQL if the existing construct  were against a fixed table. The fix allows that the original aliased() construct is disregarded if it were only against a table that’s now  being replaced. It also allows for correct behavior when constructing a aliased() without a selectable argument against a aliased() that’s against a subuquery, to create an alias of that subquery (i.e. to change its name).
    The nesting behavior of aliased() remains in place for the case where the outer aliased() object is against a subquery which in turn refers to the inner aliased() object. This is a relatively new 1.4 feature that helps to suit use cases that were previously served by the deprecated Query.from_self() method.
    References: #7576
  • [orm] [bug]
    Fixed issue where Select.correlate_except() method, when passed either the None 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 of Query.from_statement() or Select.from_statement().  As subqueryload requires modifying the original statement, it’s not  compatible with the “from_statement” use case, especially for statements  made against the text() 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 determines TypeEngine 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 the timezone=True parameter on the returned DateTime object, as well as Time. 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 mypy Var instance.
    References: #7321

asyncio

  • [asyncio] [usecase]
    Added new method AdaptedConnection.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 the await keyword can’t be used, such as within SQLAlchemy event handler functions. The method is analogous to the AsyncConnection.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 the UUID 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 report include_columns as part of the dialect_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 the include_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]
    Replace SHOW VARIABLES LIKE statement with equivalent SELECT @@variable in MySQL and MariaDB dialect initialization. This should avoid mutex contention caused by SHOW 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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
存储 Java 测试技术
SqlAlchemy 2.0 中文文档(七十三)(3)
SqlAlchemy 2.0 中文文档(七十三)
34 8
|
4月前
|
SQL 关系型数据库 测试技术
SqlAlchemy 2.0 中文文档(七十三)(2)
SqlAlchemy 2.0 中文文档(七十三)
44 4
|
4月前
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(五十四)(3)
SqlAlchemy 2.0 中文文档(五十四)
29 1
|
4月前
|
SQL 关系型数据库 API
SqlAlchemy 2.0 中文文档(五十四)(5)
SqlAlchemy 2.0 中文文档(五十四)
42 1
|
4月前
|
SQL 关系型数据库 测试技术
SqlAlchemy 2.0 中文文档(五十四)(4)
SqlAlchemy 2.0 中文文档(五十四)
35 1
|
4月前
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(五十四)(2)
SqlAlchemy 2.0 中文文档(五十四)
92 1
|
4月前
|
SQL 关系型数据库 数据库
SqlAlchemy 2.0 中文文档(七十三)(4)
SqlAlchemy 2.0 中文文档(七十三)
36 2
|
4月前
|
SQL JSON 关系型数据库
SqlAlchemy 2.0 中文文档(七十三)(5)
SqlAlchemy 2.0 中文文档(七十三)
43 1
|
4月前
|
SQL 关系型数据库 测试技术
SqlAlchemy 2.0 中文文档(七十三)(1)
SqlAlchemy 2.0 中文文档(七十三)
40 1
|
4月前
|
SQL 关系型数据库 PostgreSQL
SqlAlchemy 2.0 中文文档(五十九)(7)
SqlAlchemy 2.0 中文文档(五十九)
22 0