SqlAlchemy 2.0 中文文档(六十五)(3)

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: SqlAlchemy 2.0 中文文档(六十五)

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


0.8.3

发布日期:2013 年 10 月 26 日

ORM

  • [orm] [feature]
    添加了新选项relationship() distinct_target_key。这使得子查询急加载策略可以对最内部的 SELECT 子查询应用 DISTINCT,以帮助解决由最内部查询生成重复行的情况(尚无关于子查询急加载中重复行问题的通用解决方案,但是当最内部子查询之外的连接产生重复行时)。当标志设置为True时,DISTINCT 被无条件渲染,当设置为None时,如果最内部关系目标列不包括完整主键,则渲染 DISTINCT。该选项在 0.8 中默认为 False(例如,在所有情况下默认关闭),在 0.9 中为 None(例如,默认情况下自动)。感谢 Alexander Koval 对此的帮助。
    另请参阅
    子查询急加载将对某些查询的最内部 SELECT 应用 DISTINCT
    参考:#2836
  • [orm] [bug]
    修复了列表插入操作未能正确表示[0:0]的切片设置,特别是在使用insert(0, item)与关联代理时可能发生。由于 Python 集合中的一些怪癖,这个问题在 Python 3 中比在 Python 2 中更有可能发生。
    此更改也回溯到:0.7.11
    参考:#2807
  • [orm] [bug]
    修复了在使用类似remote()foreign()在与父Table关联之前的Column上可能会产生与父表在连接中未呈现相关的问题的注释时可能会产生的问题,这是由于注释执行的固有复制操作。
    参考:#2813
  • [orm] [bug]
    修复了Query.exists()在没有任何 WHERE 条件的情况下无法正常工作的错误。感谢 Vladimir Magamedov。
    参考:#2818
  • [orm] [bug]
    从 0.9 中回溯了一个更改,其中用于多态继承加载的映射器层次结构的迭代被排序,这允许为多态查询生成的 SELECT 语句具有确定性渲染,从而有助于缓存方案,该方案基于 SQL 字符串本身进行缓存。
    参考:#2779
  • [orm] [bug]
    修复了 ORM 用于迭代映射器层次结构的有序序列实现中的潜在问题;在 Jython 解释器下,这个实现没有排序,尽管 cPython 和 PyPy 保持了顺序。
    参考:#2794
  • [orm] [bug]
    修复了 ORM 级别事件注册中的 bug,其中“原始”或“传播”标志在某些“未映射基类”配置中可能被错误配置。
    参考:#2786
  • [orm] [bug]
    与加载映射实体时使用defer()选项相关的性能修复。在加载时将每个对象的延迟可调用应用于实例的函数开销明显高于仅从行加载数据的开销(请注意,defer()旨在减少 DB/网络开销,而不一定是函数调用次数);在所有情况下,函数调用开销现在小于从列加载数据的开销。每次加载从 N(结果中的总延迟值)到 1(延迟列的总数)的“延迟可调用”对象数量也减少了。
    参考:#2778
  • [orm] [bug]
    修复了一个 bug,当使用make_transient()函数将对象从“持久”移动到“挂起”时,属性历史函数会失败,用于涉及基于集合的反向引用的操作。
    参考:#2773

orm 声明式

  • [orm] [声明式] [功能]
    添加了一个方便的类装饰器as_declarative(),是declarative_base()的包装器,允许使用一种巧妙的类装饰器方法应用现有的基类。

例子

  • [例子] [功能]
    改进了examples/generic_associations中的例子,包括discriminator_on_association.py利用单表继承来处理“鉴别器”的工作。还添加了一个真正的“通用外键”示例,它与其他流行框架类似,使用开放式整数指向任何其他表,放弃了传统的引用完整性。虽然我们不推荐这种模式,但信息想要自由。
  • [例子] [bug]
    在版本示例中创建的历史表中添加了“autoincrement=False”,因为这个表在任何情况下都不应该有自增,感谢 Patrick Schmid。

引擎

  • [引擎] [功能]
    对于EngineURLrepr()现在将使用星号隐藏密码。感谢 Gunnlaugur Þór Briem。
    参考:#2821
  • [engine] [bug]
    make_url()函数使用的正则表达式现在解析 ipv6 地址,例如用方括号括起来。
    此更改也被回溯到:0.7.11
    参考:#2851
  • [engine] [bug] [oracle]
    如果重新创建Engine,则不会第二次调用 Dialect.initialize(),因为出现了断开连接错误。这修复了 Oracle 8 方言中的一个特定问题,但通常情况下,dialect.initialize()阶段应该只执行一次。
    参考:#2776
  • [engine] [bug] [pool]
    修复了QueuePool在现有池化连接在无效或重新生成事件后未能重新连接时会丢失正确的已检出计数的 bug。
    参考:#2772

sql

  • [sql] [feature]
    insert()构造中添加了新方法Insert.from_select()。给定列的列表和可选择的内容,渲染INSERT INTO (table) (columns) SELECT ..
    参考:#722
  • [sql] [feature]
    update()insert()delete()构造现在将解释 ORM 实体作为要操作的目标表,例如:
from sqlalchemy import insert, update, delete
ins = insert(SomeMappedClass).values(x=5)
del_ = delete(SomeMappedClass).where(SomeMappedClass.id == 5)
upd = update(SomeMappedClass).where(SomeMappedClass.id == 5).values(name="ed")
  • [sql] [bug]
    修复了自 0.7.9 以来的回归,即如果在多个 FROM 子句中引用 CTE,则可能无法正确引用 CTE 的名称。
    此更改也被回溯到:0.7.11
    参考:#2801
  • [sql] [bug] [cte]
    修复了通用表达式系统中的一个 bug,如果 CTE 仅用作alias()构造,则不会使用 WITH 关键字进行渲染。
    此更改也被回溯到:0.7.11
    参考:#2783
  • [sql] [bug]
    修复了CheckConstraint DDL 中的一个 bug,其中来自Column对象的“quote”标志不会被传播。
    这个更改也被回溯到:0.7.11
    参考:#2784
  • [sql] [bug]
    修复了type_coerce()无法正确解释具有__clause_element__()方法的 ORM 元素的 bug。
    参考:#2849
  • [sql] [bug]
    当生成“非本地”类型的 CHECK 约束时,EnumBoolean类型现在会绕过任何自定义(例如 TypeDecorator)类型的使用。这样,自定义类型不会参与 CHECK 中的表达式,因为这个表达式是针对“impl”值而不是“decorated”值的。
    参考:#2842
  • [sql] [bug]
    Index上的.unique标志可能会产生None,如果它是从未指定unique(默认为None)的Column生成的。该标志现在将始终是TrueFalse
    参考:#2825
  • [sql] [bug]
    修复了默认编译器以及 postgresql、mysql 和 mssql 的 bug,以确保任何字面 SQL 表达式值在 CREATE INDEX 语句中直接呈现为字面值,而不是作为绑定参数。这也改变了其他 DDL 的呈现方案,如约束。
    参考:#2742
  • [sql] [bug]
    select()在其 FROM 子句中引用自身时,通常通过就地突变,将引发一个信息性错误消息,而不是导致递归溢出。
    参考:#2815
  • [sql] [bug]
    不起作用的“schema”参数在ForeignKey上已被弃用;会发出警告。在 0.9 中移除。
    参考:#2831
  • [sql] [bug]
    修复了使用column_reflect事件来更改传入Column.key会阻止正确反映主键约束、索引和外键约束的 bug。
    参考:#2811
  • [sql] [bug]
    ColumnOperators.notin_() 运算符在 0.8 版本中添加,现在正确地生成了针对空集合使用时“IN”表达式的否定结果。
  • [sql] [bug] [postgresql]
    修复了表达式系统依赖于select()构造中的.c集合上的一些表达式的str()形式的错误,但由于元素依赖于特定于方言的编译构造,特别是与 PostgreSQL ARRAY 元素一起使用的 __getitem__() 运算符,因此str()形式不可用。 修复还添加了一个新的异常类UnsupportedCompilationError,在编译器被要求编译它不知道如何处理的内容时引发该异常。
    参考:#2780

postgresql

  • [postgresql] [bug]
    移除了对列的服务器默认值反射的 128 字符截断;这段代码最初来自 PG 系统视图,用于截断字符串以便阅读。
    参考:#2844
  • [postgresql] [bug]
    括号将应用于在 CREATE INDEX 语句的列列表中呈现的复合 SQL 表达式。
    参考:#2742
  • [postgresql] [bug]
    修复了 PostgreSQL 版本字符串中在“PostgreSQL”或“EnterpriseDB”之前有前缀的情况无法解析的错误。感谢 Scott Schaefer。
    参考:#2819

mysql

  • [mysql] [bug]
    更新了 MySQL 5.5、5.6 版本的保留字,感谢 Hanno Schlichting。
    此更改也被回溯到:0.7.11
    参考:#2791
  • [mysql] [bug]
    #2721中的更改,即 MySQL 后端对 ForeignKeyConstraintdeferrable 关键字被静默忽略,将在 0.9 版本中被撤销;这个关键字现在将再次呈现,在 MySQL 上引发错误,因为它不被理解 - 相同的行为也将适用于 initially 关键字。 在 0.8 版本中,这些关键字将继续被忽略,但会发出警告。此外,match 关键字现在在 0.9 上引发 CompileError,在 0.8 上发出警告;这个关键字不仅被 MySQL 静默忽略,还会破坏 ON UPDATE/ON DELETE 选项。
    要使用不在 MySQL 上呈现或在 MySQL 上呈现不同的 ForeignKeyConstraint,请使用自定义编译选项。已将此用法示例添加到文档中,请参阅 MySQL / MariaDB 外键。
    参考:#2721, #2839
  • [mysql] [bug]
    MySQL-connector 方言现在允许在 create_engine 查询字符串中使用选项来覆盖在连接中设置的默认值,包括“buffered”和“raise_on_warnings”。
    参考:#2515

sqlite

  • [sqlite] [bug]
    新添加的 SQLite DATETIME 参数 storage_format 和 regexp 显然没有完全正确实现;虽然接受了参数,但实际上它们没有任何效果;这个问题已经修复。
    参考:#2781

oracle

  • [oracle] [bug]
    修复了使用同义词进行 Oracle 表反射时,如果同义词和表位于不同的远程模式中,则会失败的 bug。修复补丁由 Kyle Derr 提供。
    参考:#2853

杂项

  • [feature]
    Column添加了一个新标志system=True,将列标记为“系统”列,该列将自动由数据库(如 PostgreSQL 的 oidxmin)生成。 该列将在CREATE TABLE语句中被省略,但仍可用于查询。此外,CreateColumn构造可以应用于自定义编译规则,允许跳过列,通过生成返回None的规则。

orm

  • [orm] [feature]
    relationship()添加了新选项 distinct_target_key。这使得子查询预加载策略可以对最内部的 SELECT 子查询应用 DISTINCT,以帮助解决由该关系对应的最内部查询生成重复行的情况(目前还没有解决子查询预加载中重复行的一般解决方案,但是当最内部子查询之外的连接产生重复行时)。当标志设置为True时,DISTINCT 无条件呈现,当设置为None时,如果最内部关系目标列不包括完整主键,则呈现 DISTINCT。该选项在 0.8 版本中默认为 False(例如,在所有情况下默认关闭),在 0.9 版本中默认为 None(例如,默认情��下自动)。感谢 Alexander Koval 对此的帮助。
    另请参阅
    子查询预加载将对某些查询的最内部 SELECT 应用 DISTINCT
    参考:#2836
  • [orm] [bug]
    修复了列表插入操作insert(0, item)在使用关联代理时可能出现的[0:0]切片表示错误的 bug。由于 Python 集合中的一些怪癖,这个问题在 Python 3 中比在 Python 2 中更容易出现。
    这个改动也被回溯到了:0.7.11
    参考:#2807
  • [orm] [bug]
    修复了在使用Column之前对父级Table进行关联时,使用remote()foreign()等注释可能导致父表在连接中未渲染的 bug,这是由于注释执行的固有复制操作所致。
    参考:#2813
  • [orm] [bug]
    修复了Query.exists()在没有任何 WHERE 条件的情况下无法正常工作的 bug。感谢 Vladimir Magamedov。
    参考:#2818
  • [orm] [bug]
    从 0.9 版本中回溯了一个改动,该改动使得在多态继承加载中使用的映射器层次结构的迭代是有序的,这允许为多态查询生成的 SELECT 语句具有确定性渲染,从而有助于缓存方案在 SQL 字符串本身上进行缓存。
    参考:#2779
  • [orm] [bug]
    修复了 ORM 用于迭代映射器层次结构的有序序列实现中可能存在的问题;在 Jython 解释器下,这个实现没有保持顺序,尽管 cPython 和 PyPy 保持了顺序。
    参考:#2794
  • [orm] [bug]
    修复了 ORM 级别事件注册中“raw”或“propagate”标志在一些“未映射基类”配置中可能被错误配置的 bug。
    参考:#2786
  • [orm] [bug]
    与加载映射实体时使用defer()选项相关的性能修复。在加载时将每个对象的延迟可调用应用于实例的函数开销明显高于仅从行加载数据的开销(请注意,defer()旨在减少 DB/网络开销,而不一定是函数调用次数);在所有情况下,函数调用开销现在都小于从列加载数据的开销。每次加载从 N(结果中的总延迟值)到 1(延迟列的总数)的“延迟可调用”对象数量也减少了。
    参考:#2778
  • [orm] [错误]
    修复了一个 bug,当使用make_transient()函数将对象从“持久”移动到“挂起”时,涉及基于集合的反向引用的操作会导致属性历史函数失败。
    参考:#2773

orm 声明式

  • [orm] [声明式] [特性]
    添加了一个方便的类装饰器as_declarative(),它是declarative_base()的包装器,允许使用一种巧妙的类装饰器方法应用现有的基类。

示例

  • [示例] [特性]
    改进了examples/generic_associations中的示例,包括discriminator_on_association.py使用单表继承来处理“鉴别器”。还添加了一个真正的“通用外键”示例,它类似于其他流行框架,使用开放的整数指向任何其他表,放弃传统的引用完整性。虽然我们不推荐这种模式,但信息想要自由。
  • [示例] [错误]
    在版本控制示例中创建的历史表中添加了“autoincrement=False”,因为这个表在任何情况下都不应该具有自增属性,感谢 Patrick Schmid。

引擎

  • [引擎] [特性]
    EngineURLrepr()现在将使用星号隐藏密码。感谢 Gunnlaugur Þór Briem。
    参考:#2821
  • [引擎] [错误]
    make_url()函数现在使用的正则表达式可以解析 ipv6 地址,例如用方括号括起来。
    此更改也回溯到:0.7.11
    参考:#2851
  • [引擎] [错误] [oracle]
    如果重新创建了一个Engine,则不会再次调用 Dialect.initialize(),这是因为出现了断开连接的错误。这修复了 Oracle 8 方言中的一个特定问题,但通常情况下,dialect.initialize() 阶段应该只执行一次。
    参考:#2776
  • [engine] [bug] [pool]
    修复了如果现有的池化连接在失效或重新生成事件后无法重新连接,则QueuePool 会丢失正确的检出计数的错误。
    参考:#2772

sql

  • [sql] [feature]
    添加了一个新方法到 insert() 构造中,Insert.from_select()。给定一个列列表和一个可选择项,渲染 INSERT INTO (table) (columns) SELECT ..
    参考:#722
  • [sql] [feature]
    update()insert()delete() 构造现在会将 ORM 实体解释为要操作的目标表,例如:
from sqlalchemy import insert, update, delete
ins = insert(SomeMappedClass).values(x=5)
del_ = delete(SomeMappedClass).where(SomeMappedClass.id == 5)
upd = update(SomeMappedClass).where(SomeMappedClass.id == 5).values(name="ed")
  • [sql] [bug]
    修复了回归问题,自 0.7.9 以来,如果 CTE 在多个 FROM 子句中被引用,则可能无法正确引用其名称。
    这个改变也被反向移植到了:0.7.11
    参考:#2801
  • [sql] [bug] [cte]
    修复了通用表达式系统中的 bug,如果 CTE 仅用作 alias() 构造,则不会使用 WITH 关键字进行呈现。
    这个改变也被反向移植到了:0.7.11
    参考:#2783
  • [sql] [bug]
    修复了 CheckConstraint DDL 中的 bug,在这个 bug 中,来自 Column 对象的 “quote” 标志不会传播。
    这个改变也被反向移植到了:0.7.11
    参考:#2784
  • [sql] [bug]
    修复了 type_coerce() 无法正确解释具有 __clause_element__() 方法的 ORM 元素的 bug。
    参考:#2849
  • [sql] [bug]
    当为“非本地”类型生成 CHECK 约束时,EnumBoolean 类型现在会跳过任何自定义(例如 TypeDecorator)类型。这样,自定义类型不会参与 CHECK 中的表达式,因为此表达式针对的是“impl”值而不是“decorated”值。
    参考:#2842
  • [sql] [bug]
    如果来自未指定 uniqueColumn (其中默认为 None)生成了 Index.unique 标志可能会产生 None。现在该标志将始终为 TrueFalse
    参考:#2825
  • [sql] [bug]
    修复了在默认编译器中的 bug,以及 postgresql、mysql 和 mssql 的 bug,以确保在 CREATE INDEX 语句中直接将任何文本 SQL 表达式值呈现为文字,而不是绑定参数。这也改变了其他 DDL 的呈现方案,如约束。
    参考:#2742
  • [sql] [bug]
    在其 FROM 子句中引用自身的 select(),通常通过原地修改,现在会引发一个信息性错误消息,而不会导致递归溢出。
    参考:#2815
  • [sql] [bug]
    ForeignKey 上使用的不起作用的“schema”参数已被弃用;会引发警告。在 0.9 中已移除。
    参考:#2831
  • [sql] [bug]
    修复了使用 column_reflect 事件来更改传入 Column.key 会阻止正确反映主键约束、索引和外键约束的 bug。
    参考:#2811
  • [sql] [bug]
    ColumnOperators.notin_() 操作符在 0.8 中添加,现在正确地生成了空集合时“IN”返回的表达式的否定。
  • [sql] [bug] [postgresql]
    修复了一个 bug,表达式系统在引用select()构造中的.c集合时依赖于一些表达式的str()形式,但是由于元素依赖于特定于方言的编译构造,特别是与 PostgreSQL ARRAY元素一起使用的__getitem__()运算符,因此str()形式不可用。修复还添加了一个新的异常类UnsupportedCompilationError,在编译器被要求编译它不知道如何处理的内容时引发该异常。
    参考:#2780

postgresql

  • [postgresql] [bug]
    删除了对列的服务器默认值反射的 128 字符截断;此代码最初来自 PG 系统视图,用于为可读性截断字符串。
    参考:#2844
  • [postgresql] [bug]
    括号将被应用于在 CREATE INDEX 语句的列列表中呈现的复合 SQL 表达式。
    参考:#2742
  • [postgresql] [bug]
    修复了一个 bug,其中具有在“PostgreSQL”或“EnterpriseDB”之前的前缀的 PostgreSQL 版本字符串无法解析。感谢 Scott Schaefer。
    参考:#2819

mysql

  • [mysql] [bug]
    更新了 MySQL 保留字的版本 5.5、5.6,感谢 Hanno Schlichting。
    此更改也回溯到:0.7.11
    参考:#2791
  • [mysql] [bug]
    在 0.9 版本中,将撤销#2721中的更改,即在 MySQL 后端上ForeignKeyConstraintdeferrable关键字将被静默忽略,现在将再次呈现此关键字,在 MySQL 上引发错误,因为它不被理解 - 相同的行为也将适用于initially关键字。在 0.8 版本中,这些关键字将继续被忽略,但会发出警告。此外,在 0.9 版本中,match关键字现在会引发一个CompileError,在 0.8 版本中会发出警告;这个关键字不仅被 MySQL 静默忽略,而且会破坏 ON UPDATE/ON DELETE 选项。
    要使用一个不在 MySQL 上呈现或呈现方式不同的ForeignKeyConstraint,请使用自定义编译选项。文档中已添加了此用法示例,请参见 MySQL / MariaDB 外键。
    参考:#2721#2839
  • [mysql] [bug]
    MySQL-connector 方言现在允许在 create_engine 查询字符串中使用选项来覆盖连接中设置的默认值,包括“buffered”和“raise_on_warnings”。
    参考:#2515

sqlite

  • [sqlite] [bug]
    新增的 SQLite DATETIME 参数 storage_format 和 regexp 显然没有完全正确实现;虽然参数被接受了,但实际上它们没有任何效果;这个问题已经修复。
    参考:#2781

oracle

  • [oracle] [bug]
    修复了一个 bug,Oracle 表反射使用同义词会失败,如果同义词和表位于不同的远程模式中。修复补丁由 Kyle Derr 提供。
    参考:#2853

杂项

  • [feature]
    添加了一个新的标志 system=TrueColumn 中,将列标记为“系统”列,该列将由数据库自动添加(例如 PostgreSQL 的 oidxmin)。该列将从 CREATE TABLE 语句中省略,但在其他情况下可供查询使用。此外,CreateColumn 构造可以应用于自定义编译规则,允许跳过列,通过生成返回 None 的规则。

0.8.2

发布日期:2013 年 7 月 3 日

orm

  • [orm] [feature]
    添加了一个新的方法 Query.select_entity_from(),将在 0.9 版本中部分取代 Query.select_from() 的功能。在 0.8 版本中,这两个方法执行相同的功能,因此代码可以相应地迁移到使用 Query.select_entity_from() 方法。详细信息请参阅 0.9 迁移指南。
    参考:#2736
  • [orm] [bug]
    当尝试刷新一个继承类的对象时,如果多态鉴别器已经被分配了对于该类无效的值,则会发出警告。
    参考:#2750
  • [orm] [bug]
    修复了多态 SQL 生成中的 bug,在多个针对同一基类的连接继承实体之间连接到彼此时,如果连接字符串长度超过两个实体,则不会独立跟踪基表上的列。
    参考:#2759
  • [orm] [bug]
    修复了一个 bug,在将复合属性发送到 Query.order_by() 中时,会产生一种括号表达式,某些数据库不接受。
    参考:#2754
  • [orm] [bug]
    修复了复合属性与aliased()函数之间的交互。以前,在应用别名时,复合属性在比较操作中不会正确工作。
    参考:#2755
  • [orm] [bug] [ext]
    修复了MutableDict在调用clear()时未报告更改事件的错误。
    参考:#2730
  • [orm] [bug]
    修复了由#2682引起的回归,即由于使用IS而出现的不受支持的TrueFalse符号导致Query.update()Query.delete()调用的评估失败。
    参考:#2737
  • [orm] [bug]
    修复了由此票引起的 0.7 版本的回归,使得在自引用的急切连接中检查递归溢出的过程过于宽松,错过了一个特定情况,即子类配置了 lazy=”joined”或“subquery”,并且加载是针对基类的“with_polymorphic”。
    参考:#2481
  • [orm] [bug]
    修复了从 0.7 版本引起的回归,即Session.begin_nested()的上下文管理器功能在发生刷新错误时未能正确回滚事务,而是引发自己的异常,同时使会话仍处于待回滚状态。
    参考:#2718

orm 声明式

  • [orm] [declarative] [feature]
    现在可以通过名称引用 ORM 描述符,如混合属性,在与order_byprimaryjoin或类似的字符串参数一起在relationship()中使用,除了列绑定属性。
    参考:#2761

示例

  • [examples] [bug]
    修复了“版本控制”配方中的一个问题,即当存在反向引用时,一个多对一引用可能会为目标产生一个无意义的版本,即使它没有更改。修补程序由 Matt Chisholm 提供。
  • [examples] [bug]
    修复了狗窝示例中的一个小错误,即生成 SQL 缓存键时未像Query通常做的那样对语句应用去重标签。

engine

  • [engine] [bug]
    修复了一个 bug,即各种Pool 实现的reset_on_return参数在重新生成池时不会传播。感谢 Eevee。
  • [engine] [bug] [sybase]
    修复了一个 bug,即检测正确的 kwargs 被发送到create_engine()的例程在某些情况下会失败,比如在 Sybase 方言中。
    参考:#2732

sql

  • [sql] [feature]
    TypeDecorator提供了一个名为TypeDecorator.coerce_to_is_types的新属性,以便更容易控制使用==!=None和布尔类型进行比较时如何产生IS表达式,或者带有绑定参数的普通相等���达式。
    参考:#2734, #2744
  • [sql] [bug]Select 构造中引入的相关联行为进行了多次修复,这是从 0.8.0 版本开始的:
  • 为了满足 FROM 条目应该向外部相关联到包含另一个 SELECT 的 SELECT,然后再包含这个 SELECT 的用例,当通过Select.correlate()建立明确的相关联时,现在在多个级别上进行相关联,只要目标 SELECT 在链中的某处被包含在一个 WHERE/ORDER BY/columns 子句中,而不仅仅是嵌套的 FROM 子句。这使得Select.correlate()的行为再次更加兼容 0.7,同时仍然保持新的“智能”相关联。
  • 当未使用明确的相关联时,“隐式”相关联将其行为限制在仅仅是直接包含的 SELECT 中,以最大程度地提高与 0.7 应用程序的兼容性,并且在这种情况下还防止了跨嵌套 FROM 的相关联,保持了与 0.8.0/0.8.1 的兼容性。
  • Select.correlate_except() 方法在所有情况下都未能阻止给定的 FROM 子句进行相关联,并且还会导致 FROM 子句被错误地完全省略(更像是 0.7 版本的行为),这个问题已经修复。
  • 调用 select.correlate_except(None)将使所有 FROM 子句进入相关联,正如预期的那样。
  • 参考:#2668, #2746
  • [sql] [bug]
    修复了一个 bug,即将一个表“A”的 select() 与多个外键路径连接到表“B”,到表“B”,如果直接将表“A”连接到“B”会报告“模糊的连接条件”错误,但连接条件会包含多个条件。
    参考:#2738
  • [sql] [bug] [reflection]
    修复了一个 bug,即在远程模式下使用 MetaData.reflect() 跨越一个本地模式和一个远程模式的模式时,如果两个模式都有相同名称的表,则可能产生错误的结果。
    参考:#2728
  • [sql] [bug]
    从基础 ColumnOperators 类中移除了“未实现”的__iter__()调用,虽然这是在 0.8.0 中引入的,以防止在自定义运算符上实现__getitem__()方法并在该对象上错误调用list()时出现无限、内存增长的循环,但这会导致列元素报告它们实际上是可迭代类型,然后在尝试迭代时抛出错误。在这里没有真正的办法同时拥有两边,所以我们坚持使用 Python 的最佳实践。在自定义运算符上实现__getitem__()时要小心!
    参考:#2726
  • [sql] [bug] [mssql]
    由于这个问题导致不支持的关键字“true”被呈现,添加逻辑将其转换为 SQL Server 的 1/0。
    参考:#2682

postgresql

  • [postgresql] [feature]
    添加了对 PostgreSQL 9.2 范围类型的支持。目前,不提供类型转换,因此目前直接使用字符串或 psycopg2 2.5 范围扩展类型。补丁由 Chris Withers 提供。
  • [postgresql] [feature]
    在使用 psycopg2 DBAPI 时,添加了对“AUTOCOMMIT”隔离的支持。该关键字可通过isolation_level执行选项使用。补丁由 Roman Podolyaka 提供。
    参考:#2072
  • [postgresql] [bug]
    在 PostgreSQL 方言上,extract() 的行为已简化,不再向给定表达式注入硬编码的::timestamp或类似转换,因为这会干扰诸如时区感知日期时间之类的类型,但在现代版本的 psycopg2 中似乎也不是必要的。
    参考:#2740
  • [postgresql] [bug]
    修复了 HSTORE 类型中包含反斜杠引号的键/值在使用“非本机”(即非-psycopg2)手段翻译 HSTORE 数据时无法正确转义的错误。感谢 Ryan Kelly 提供的补丁。
    参考:#2766
  • [postgresql] [bug]
    修复了多列 PostgreSQL 索引中列的顺序反映错误的 bug。感谢 Roman Podolyaka。
    参考:#2767
  • [postgresql] [bug]
    修复了 HSTORE 类型以正确编码/解码 Unicode。这始终开启,因为 hstore 是一种文本类型,并且在使用 Python 3 时与 psycopg2 的行为匹配。感谢 Dmitry Mugtasimov。
    参考:#2735

mysql

  • [mysql] [功能]
    用于 Indexmysql_length 参数现在可以作为列名/长度字典传递,用于复合索引。非常感�� Roman Podolyaka 提供的补丁。
    参考:#2704
  • [mysql] [bug]
    修复了在使用多表 UPDATE 时出现的 bug,其中一个补充表是带有自己绑定参数的 SELECT,当使用 MySQL 的特殊语法时,绑定参数的位置与语句本身相反。
    参考:#2768
  • [mysql] [bug]
    添加了另一个条件到 mysql+gaerdbms 方言中,以检测所谓的“开发”模式,在这种模式下,我们应该使用 rdbms_mysqldb DBAPI。感谢 Brett Slatkin 提供的补丁。
    参考:#2715
  • [mysql] [bug]
    ForeignKeyForeignKeyConstraint 上的 deferrable 关键字参数不会在 MySQL 方言上呈现 DEFERRABLE 关键字。很长一段时间以来,我们一直保留这个设置,因为非延迟外键与延迟外键的行为非常不同,但某些环境只是在 MySQL 上禁用 FKs,所以我们在这里会少些主观意见。
    参考:#2721
  • [mysql] [bug]
    更新了 mysqlconnector 方言以根据异常中发送的明显字符串消息检查断开连接;已针对 mysqlconnector 1.0.9 进行测试。

sqlite

  • [sqlite] [bug]
    sqlalchemy.types.BIGINT 添加到可以由 SQLite 方言反射的类型名称列表中;感谢 Russell Stuart。
    参考:#2764

mssql

  • [mssql] [bug]
    在查询 SQL Server 2000 上的信息模式时,移除了在 0.8.1 版本中添加的 CAST 调用,以帮助处理驱动程序问题,显然在 2000 年不兼容。CAST 仍然适用于 SQL Server 2005 及更高版本。
    参考:#2747

misc

  • [feature] [firebird]
    为 kinterbasdb 和 fdb 方言添加了新标志 retaining=True。这控制发送到 DBAPI 连接的 commit()rollback() 方法的 retaining 标志的值。由于历史原因,在 0.8.2 版本中,此标志默认为 True,但在 0.9.0b1 版本中,此标志默认为 False
    参考:#2763
  • [bug] [firebird]
    在反射  Firebird 类型 LONG 和 INT64 时,类型查找已修复,使得 LONG 被视为 INTEGER,INT64 被视为  BIGINT,除非该类型具有“精度”,在这种情况下,它将被视为 NUMERIC。补丁由 Russell Stuart 提供。
    参考:#2757
  • [bug] [ext]
    修复了一个错误,即如果使用函数而不是类设置复合类型,则当尝试检查该列是否为 MutableComposite 时,可变扩展会出错(它不是)。感谢 asldevi。
  • [requirements]
    现在运行单元测试套件需要 Python 的 mock 库。虽然作为 Python 3.3 的一部分,但之前的 Python 安装需要安装此库才能运行单元测试或使用 sqlalchemy.testing 包进行外部方言。

orm

  • [orm] [feature]
    添加了一个新方法 Query.select_entity_from(),将在 0.9 版本中取代 Query.select_from() 的部分功能。在 0.8 版本中,这两个方法执行相同的功能,因此可以将代码迁移到适当使用 Query.select_entity_from() 方法。详细信息请参阅 0.9 迁移指南。
    参考:#2736
  • [orm] [bug]
    当尝试刷新一个继承类的对象时,如果多态鉴别器被分配给了该类无效的值,将会发出警告。
    参考:#2750
  • [orm] [bug]
    修复了多态 SQL 生成中的错误,如果多个继承实体针对同一基类相互连接,且连接字符串超过两个实体,则基表上的列将无法独立跟踪彼此。
    参考:#2759
  • [orm] [bug]
    修复了将复合属性发送到Query.order_by()会产生一种某些数据库不接受的带括号的表达式的错误。
    参考:#2754
  • [orm] [错误]
    修复了复合属性与aliased()函数之间的交互。 以前,在应用别名时,复合属性在比较操作中无法正常工作。
    参考:#2755
  • [orm] [错误] [扩展]
    修复了当调用clear()MutableDict未报告更改事件的错误。
    参考:#2730
  • [orm] [错误]
    修复了由#2682引起的回归,即Query.update()Query.delete()调用的评估会遇到由于使用IS而出现的不支持的TrueFalse符号。
    参考:#2737
  • [orm] [错误]
    修复了由此票引起的从 0.7 版本中的一个回归,该回归使得在自引用的急切连接中递归溢出检查过于宽松,错过了一个特定情况,即子类配置了 lazy=”joined”或“subquery”,并且加载是针对基类的“with_polymorphic”。
    参考:#2481
  • [orm] [错误]
    修复了从 0.7 版本中的一个回归,即Session.begin_nested()的上下文管理器功能在发生刷新错误时无法正确回滚事务,而是引发自己的异常,同时保留会话仍在等待回滚。
    参考:#2718

orm 声明

  • [orm] [声明] [功能]
    现在可以通过名称引用 ORM 描述符,例如混合属性,在与relationship()中使用的字符串参数中,用于order_byprimaryjoin或类似操作,除了列绑定属性。
    参考:#2761

示例

  • [示例] [错误]
    修复了“版本控制”配方中的一个问题,即当存在反向引用时,一个多对一引用可能会为目标产生一个无意义的版本,即使它没有被更改。 补丁由 Matt Chisholm 提供。
  • [示例] [错误]
    修复了狗窝示例中的一个小 bug,在生成 SQL 缓存键时,没有像 Query 通常做的那样将去重标签应用到语句上的问题。

engine

  • [engine] [bug]
    修复了一个 bug,在重新生成池时,各种 Pool 实现中的 reset_on_return 参数不会传播的问题。感谢 Eevee。
  • [engine] [bug] [sybase]
    修复了一个 bug,在某些情况下(例如 Sybase 方言),用于检测传递给 create_engine() 的正确 kwargs 的例程会失败的问题。
    参考:#2732

sql

  • [sql] [feature]
    TypeDecorator 提供了一个新属性,名为 TypeDecorator.coerce_to_is_types,使得更容易控制使用 ==!=None 和布尔类型进行比较时产生 IS 表达式或带有绑定参数的普通等式表达式的方式。
    参考:#2734, #2744
  • [sql] [bug]Select 构造的相关行为进行了多次修复,这些修复首次出现在 0.8.0 中:
  • 为了满足应该将 FROM 条目向外相关到封装另一个 SELECT 的 SELECT,然后再封装此 SELECT 的用例,现在当通过 Select.correlate() 建立了显式相关性时,相关性会在多个级别上进行操作,前提是目标选择在由 WHERE/ORDER BY/columns 子句包含的链中的某个位置,而不仅仅是嵌套 FROM 子句。这使得 Select.correlate() 再次表现得更加与 0.7 兼容,同时仍保持新的“智能”相关性。
  • 当未使用显式相关性时,通常的“隐式”相关性限制其行为仅限于直接封闭的 SELECT,以最大限度地提高与 0.7 应用的兼容性,并且在这种情况下还防止了跨嵌套 FROM 的相关性,从而保持了与 0.8.0/0.8.1 的兼容性。
  • Select.correlate_except()方法未在所有情况下阻止给定的 FROM 子句进行关联,并且还会导致 FROM 子句被错误地完全省略(更像是 0.7 的行为),这已经修复。
  • 调用 select.correlate_except(None)将使所有 FROM 子句进入关联,这是预期的行为。
  • 参考:#2668, #2746
  • [sql] [bug]
    修复了一个 bug,即将一个表“A”的 select()与到表“B”的多个外键路径连接时,连接到表“B”会失败,而不会产生“模糊的连接条件”错误,如果直接将表“A”连接到“B”会报告错误;相反,它会产生具有多个条件的连接条件。
    参考:#2738
  • [sql] [bug] [reflection]
    修复了一个 bug,即在远程模式下使用MetaData.reflect()跨越一个本地模式和一个远程模式时,如果两个模式都有相同名称的表,则可能产生错误的结果。
    参考:#2728
  • [sql] [bug]
    从基础ColumnOperators类中删除了“未实现”的__iter__()调用,尽管这在 0.8.0 中引入是为了防止在自定义运算符上实现__getitem__()方法并在该对象上错误调用list()时出现无限、内存增长的循环,但这导致列元素报告它们实际上是可迭代类型,然后在尝试迭代时抛出错误。在这里没有真正的办法同时实现两者,因此我们坚持使用 Python 最佳实践。在自定义运算符上实现__getitem__()时要小心!
    参考:#2726
  • [sql] [bug] [mssql]
    从这个票据中导致不支持的关键字“true”被呈现,添加逻辑将其转换为 SQL 服务器的 1/0。
    参考:#2682

postgresql

  • [postgresql] [feature]
    添加了对 PostgreSQL 9.2 范围类型的支持。目前,不提供类型转换,因此目前直接使用字符串或 psycopg2 2.5 范围扩展类型。补丁由 Chris Withers 提供。
  • [postgresql] [feature]
    当使用 psycopg2 DBAPI 时,添加了对“AUTOCOMMIT”隔离的支持。该关键字可通过isolation_level执行选项使用。补丁由 Roman Podolyaka 提供。
    参考:#2072
  • [postgresql] [bug]
    在 PostgreSQL 方言上,extract() 的行为已经简化,不再将硬编码的 ::timestamp 或类似的转换注入到给定的表达式中,因为这会干扰到像时区感知的日期时间这样的类型,但是对于现代版本的 psycopg2 来说,这似乎完全不必要。
    参考:#2740
  • [postgresql] [bug]
    修复了 HSTORE 类型中的一个错误,即包含反斜杠引号的键/值在使用“非本地”(即非-psycopg2)方式转换 HSTORE 数据时无法正确转义。补丁由 Ryan Kelly 提供。
    参考:#2766
  • [postgresql] [bug]
    修复了在多列 PostgreSQL 索引中列的顺序反映错误顺序的错误。感谢 Roman Podolyaka。
    参考:#2767
  • [postgresql] [bug]
    修复了 HSTORE 类型以正确地对 Unicode 进行编码/解码。这总是开启的,因为 hstore 是一种文本类型,并且与使用 Python 3 时 psycopg2 的行为匹配。感谢 Dmitry Mugtasimov。
    参考:#2735

mysql

  • [mysql] [feature]
    Index 中使用的 mysql_length 参数现在可以作为列名/长度的字典传递,用于复合索引。非常感谢 Roman Podolyaka 提供的补丁。
    参考:#2704
  • [mysql] [bug]
    修复了在使用多表 UPDATE 时出现的一个错误,其中一个辅助表是带有自己绑定参数的 SELECT,当使用 MySQL 的特殊语法时,绑定参数的位置与语句本身相反。
    参考:#2768
  • [mysql] [bug]
    mysql+gaerdbms 方言中添加了另一个条件来检测所谓的“开发”模式,在这种情况下,我们应该使用 rdbms_mysqldb DBAPI。补丁由 Brett Slatkin 提供。
    参考:#2715
  • [mysql] [bug]
    在 MySQL 方言上,ForeignKeyForeignKeyConstraint 上的 deferrable 关键字参数将不会渲染 DEFERRABLE 关键字。很长一段时间以来,我们一直保留这个功能,因为非延迟外键的行为与延迟外键的行为有很大不同,但是一些环境只是在 MySQL 上禁用了 FK,所以我们在这里的态度会更加开放。
    参考:#2721
  • [mysql] [bug]
    更新了 mysqlconnector 方言,根据异常中发送的明显字符串消息检查断开连接;已针对 mysqlconnector 1.0.9 进行了测试。

sqlite

  • [sqlite] [bug]
    sqlalchemy.types.BIGINT添加到可以由 SQLite 方言反射的类型名称列表中;感谢 Russell Stuart。
    参考:#2764

mssql

  • [mssql] [bug]
    在 SQL Server 2000 上查询信息模式时,删除了在 0.8.1 中添加的 CAST 调用,以帮助处理驱动程序问题,显然在 2000 上不兼容。CAST 保留在 SQL Server 2005 及更高版本中。
    参考:#2747

杂项

  • [feature] [firebird]
    向 kinterbasdb 和 fdb 方言添加了新标志retaining=True。这控制了发送到 DBAPI 连接的commit()rollback()方法的retaining标志的值。由于历史原因,此标志在 0.8.2 中默认为True,但在 0.9.0b1 中此标志默认为False
    参考:#2763
  • [bug] [firebird]
    修复了在反射  Firebird 类型 LONG 和 INT64 时的类型查找,使得 LONG 被视为 INTEGER,INT64 被视为  BIGINT,���非类型具有“精度”,在这种情况下,它被视为 NUMERIC。补丁感谢 Russell Stuart。
    参考:#2757
  • [bug] [ext]
    修复了一个 bug,当使用函数而不是类设置复合类型时,当尝试检查该列是否为MutableComposite时,可变扩展会出错(它不是)。感谢 asldevi。
  • [requirements]
    现在需要 Python 的mock库才能运行单元测试套件。虽然作为 Python 3.3 的一部分已包含在标准库中,但以前的 Python 安装需要安装此库才能运行单元测试或使用sqlalchemy.testing包进行外部方言。

0.8.1

发布日期:2013 年 4 月 27 日

orm

  • [orm] [feature]
    添加了一个方便的方法到 Query,将查询转换为形式为EXISTS (SELECT 1 FROM ... WHERE ...)的 EXISTS 子查询。
    参考:#2673
  • [orm] [bug]
    修复了一个 bug,当查询形式为:query(SubClass).options(subqueryload(Baseclass.attrname)),其中SubClassBaseClass的联接继承时,会导致在属性加载时未能应用子查询中的JOIN,从而产生笛卡尔积。填充的结果仍然倾向于是正确的,因为额外的行只是被忽略,所以这个问题可能会在其他方面正常工作的应用程序中表现为性能下降。
    此更改也回溯到:0.7.11
    参考:#2699
  • [orm] [bug]
    修复了工作单元中的一个 bug,即如果两个表之间没有设置 ForeignKey 约束,一个 joined-inheritance 子类可能会在父表之前插入“sub”表的行。
    此更改也被回溯到:0.7.11
    参考:#2689
  • [orm] [bug]
    修复了sqlalchemy.ext.serializer扩展的问题,包括从 pickler 传递的“id”被转换为字符串以防止在 Py3K 上解析字节,以及relationship()orm.join()构造现在被正确序列化。
    参考:#2698
  • [orm] [bug]
    对   query.join()的内部工作方式进行了显著改进,使得如何进行连接的决策变得极为简化。现在新的测试用例通过了,例如从已经复杂的涉及继承的连接系列的中间延伸多个连接。从深度嵌套的子查询结构进行连接仍然很复杂且不是没有注意事项的,但通过这些改进,边缘情况希望被推到更远的边缘。
    参考:#2714
  • [orm] [bug]
    添加了一个条件到 ORM 映射对象的反序列化过程中,这样如果对象被 pickled 时丢失了对对象的引用,我们就不会错误地尝试设置 _sa_instance_state - 修复了一个 NoneType 错误。
  • [orm] [bug]
    修复了 uselist=False 的多对多关系无法删除关联行并在标量属性设置为 None 时引发错误的 bug。这是由于为#2229引入的变更导致的回归。
    参考:#2710
  • [orm] [bug]
    改进了实例管理关于在 Session 中创建强引用的行为;如果对象处于瞬态状态或进入分离状态,对象将不再创建内部引用循环 - 只有当对象附加到 Session 时才创建强引用,并在对象分离时删除。这使得对象具有 del()方法更安全,尽管这并不被推荐,因为具有反向引用的关系也会产生循环。当映射了一个具有 del()方法的类时,会添加一个警告。
    参考:#2708
  • [orm] [bug]
    修复了一个 bug,当刷新一个继承映射类时,ORM 会运行错误类型的查询,其中超类被映射到非 Table 对象,比如自定义 join()或 select(),运行一个假设映射到单独 Table-per-class 的层次结构的查询。
    参考:#2697
  • [orm] [bug]
    修复了在对象初始化之前就能正常工作的 mapper 属性构造函数的 repr(),以便最近的 Sphinx 版本可以读取它们。

orm 声明式

  • [orm] [declarative] [bug]
    修复了间接回归有关has_inherited_table()的问题,因为它考虑了当前类的__table__,所以对调用时敏感。这也是 0.7 的行为,但在 0.7 中,事情往往会在__mapper_args__()等事件中“解决”。has_inherited_table()现在只考虑超类,因此无论何时调用它,都应返回关于当前类的相同答案(显然假设超类的状态)。
    参考:#2656

示例

  • [examples] [bug]
    修复了缓存示例中长期存在的一个 bug,其中在计算缓存键时不会考虑 limit/offset 参数值。_key_from_query()函数已简化,直接从最终编译的语句中工作,以便获取完整的语句以及完全处理的参数列表。

sql

  • [sql] [feature]
    放宽了传递给 Table()的特定于方言的参数名称的检查;因为我们希望支持外部方言,也希望支持未安装某个特定方言的参数,所以现在只检查参数的格式,而不再在 sqlalchemy.dialects 中查找该方言。
  • [sql] [bug] [mysql]
    完全实现了 IS 和 IS NOT 运算符与 True/False 常量相关。像col.is_(True)这样的表达式现在将在目标平台上呈现col IS true,而不是将 True/False 常量转换为整数绑定参数。这允许is_()运算符在给定 True/False 常量时在 MySQL 上工作。
    参考:#2682
  • [sql] [bug]
    对  select()对象在使用 apply_labels()时生成带标签列的方式进行了重大修复;这种模式生成一个  SELECT,其中每列都标记为_,以消除多个表选择的列名冲突。修复的是,如果两个标签与表名组合时发生冲突,即“foo.bar_id”和“foo_bar.id”,则将对其中一个重复项应用匿名别名。这允许  ORM 独立处理两个列;以前,0.7 在某些情况下会默默地为“重复项”发出第二个 SELECT,并且在 0.8  中会发出模棱两可的列错误。应用于 select()的.c.集合的“键”也将被去重,因此对于指定了 use_labels 的任何  select(),将不再为“被替换的列”警告发出,尽管重复键将被赋予一个通常不友好的匿名标签。
    参考:#2702
  • [sql] [bug]
    修复了一个 bug,即在连接对象已经关闭后,如果错误在断开连接检测时被引发,会引发属性错误。
    参考:#2691
  • [sql] [bug]
    重新设计了在重新引发之前发出 rollback()的内部异常引发,以便在进入 rollback 之前保留来自 sys.exc_info()的堆栈跟踪。这样,在使用协程框架时,即使在 rollback 函数返回之前切换上下文,也能保留堆栈跟踪。
    参考:#2703
  • [sql] [bug] [postgresql]
    _Binary 基本类型现在在 Python 3 上通过 bytes()可调用函数转换值;特别是 psycopg2 2.5 与 Python 3.3 似乎现在返回“memoryview”类型,因此在返回之前将其转换为 bytes。
  • [sql] [bug]
    改进了  Connection 自动失效处理。如果发生非断开连接错误,但在错误处理中导致延迟断开连接错误(在 MySQL  中发生),则会检测到断开连接条件。Connection  现在也可以在无效状态下关闭,这意味着在下一次使用时会引发“closed”,此外,“close with  result”功能将在错误处理例程中的自动回滚失败时工作,无论条件是断开连接还是其他情况。
    参考:#2695
  • [sql] [bug]
    修复了一个 bug,即 DBAPI 可能会返回“0”作为 cursor.lastrowid,但与ResultProxy.inserted_primary_key结合使用时无法正常工作。

postgresql

  • [postgresql] [bug]
    打开了使用 psycopg2/libpq 检查“断开连接”的检查,以检查完整异常层次结构中的所有各种“断开连接”消息。具体来说,“意外关闭连接”消息现在至少在三种不同的异常类型中被看到。感谢 Eli Collins。
    参考:#2712
  • [postgresql] [bug]
    PostgreSQL ARRAY 类型的运算符支持输入类型为集合、生成器等,即使未指定维度,也会将给定的可迭代对象无条件地转换为集合。
    参考:#2681
  • [postgresql] [bug]
    添加了缺失的 HSTORE 类型到 postgresql 类型名称中,���便可以反射该类型。
    参考:#2680

mysql

  • [mysql] [bug]
    修复以支持最新的 cymysql DBAPI,感谢 Hajime Nakagami。
  • [mysql] [bug]
    改进了 Python 3 上 pymysql 方言的操作,包括一些重要的解码/字节步骤。由于驱动程序问题,BLOB 类型仍然存在问题。感谢 Ben Trofatter。
    参考:#2663
  • [mysql] [bug]
    更新了一个正则表达式以正确提取 Google App Engine v1.7.5 及更新版本的错误代码。感谢丹·林格。

mssql

  • [mssql] [bug]
    作为解决 pyodbc + mssql  所需的一系列修复的一部分,现在在所有信息模式查询的绑定参数中为表名和模式名添加了 CAST 到 NVARCHAR(max),以避免  NVARCHAR 与 NTEXT 的比较问题,这似乎在某些情况下被 ODBC 驱动程序拒绝,例如 FreeTDS (0.91 only?)  加上传递的 Unicode 绑定参数。这个问题似乎特定于 SQL Server  信息模式表,并且这个解决方法对于那些首次不存在问题的情况是无害的。
    参考:#2355
  • [mssql] [bug]
    添加了对于 pymssql 方言的额外“断开连接”消息的支持。感谢约翰·安德森。
  • [mssql] [bug]
    修复了关于“二进制”类型和 pymssql 的 Py3K bug。感谢马克·阿布拉莫维茨。
    参考:#2683

orm

  • [orm] [feature]
    添加了一个方便的方法到 Query,将查询转换为 EXISTS 子查询,形式为 EXISTS (SELECT 1 FROM ... WHERE ...)
    参考:#2673
  • [orm] [bug]
    修复了一个 bug,当查询形式为:query(SubClass).options(subqueryload(Baseclass.attrname)),其中 SubClassBaseClass 的 joined inh 时,会导致属性加载中的子查询内部未能应用 JOIN,从而产生笛卡尔积。生成的结果仍然倾向于是正确的,因为额外的行被忽略掉了,所以这个问题可能存在于其他方面正常工作的应用程序中的性能下降。
    这个更改也 回溯 到:0.7.11
    参考:#2699
  • [orm] [bug]
    修复了一个单元操作中的 bug,即当一个 joined-inheritance 子类可以在父表之前插入“子”表的行时,如果两个表之间没有设置外键约束。
    这个更改也 回溯 到:0.7.11
    参考:#2689
  • [orm] [bug]
    对于 sqlalchemy.ext.serializer 扩展进行了修复,包括将来自 pickler 的“id”转换为字符串,以防止在 Py3K 上解析字节,以及现在正确地序列化 relationship()orm.join() 结构。
    参考:#2698
  • [orm] [bug]
    对于  query.join()  的内部工作进行了显著改进,决定如何连接的过程已经大大简化。新的测试案例现在通过了,例如从已经复杂的继承关系和多个连接扩展的中间部分进行连接。从深度嵌套的子查询结构进行连接仍然很复杂,并且不是没有注意事项,但是通过这些改进,边缘情况希望能够进一步推迟。
    参考:#2714
  • [orm] [bug]
    在 ORM 映射对象的反序列化过程中添加了一个条件,这样如果对象在序列化时丢失引用,我们就不会错误地尝试设置 _sa_instance_state——修复了 NoneType 错误。
  • [orm] [bug]
    修复了当多对多关系中 uselist=False 时删除关联行失败的 bug,如果标量属性设置为 None,则会引发错误。这是由于对 #2229 的更改引入的退化。
    参考:#2710
  • [orm] [bug]
    改进了关于 Session 中强引用创建的实例管理行为;如果对象处于临时状态或进入脱离状态,则不再创建内部引用循环——只有在对象附加到会话时才创建强引用,并在对象脱离时移除。即使不推荐这样做,这样做会使得对象拥有 del() 方法更安全,因为具有反向引用的关系也会产生循环。当映射了具有 del() 方法的类时,添加了警告。
    参考:#2708
  • [orm] [bug]
    修复了一个 bug,在刷新继承映射类时 ORM 会运行错误类型的查询,其中超类映射到非 Table 对象,如自定义 join() 或 select(),运行一个假设映射到单独 Table-per-class 的层次结构的查询。
    参考:#2697
  • [orm] [bug]
    修复了对映射器属性构造函数的 repr() 方法,在对象初始化之前就可以工作,这样最近的 Sphinx 版本就可以读取它们了。

ORM 声明式

  • [orm] [declarative] [bug]
    修复了关于 has_inherited_table() 的间接退化,因为它考虑当前类的 __table__,所以对其调用时敏感。这也是 0.7 版本的行为,但在 0.7 版本中,事情往往会在 __mapper_args__() 等事件中“解决”。has_inherited_table() 现在只考虑超类,因此无论何时调用它,都应该返回相同的关于当前类的答案(显然假设超类的状态相同)。
    参考:#2656

示例

  • [examples] [bug]
    修复了缓存示例中的一个长期存在的 bug,其中 limit/offset 参数值在计算缓存键时不会被考虑。_key_from_query() 函数已简化为直接从最终编译的语句中工作,以便获取完整的语句以及完全处理过的参数列表。

sql

  • [sql] [feature]
    放宽了传递给 Table() 的特定于方言的参数名称的检查;由于我们希望支持外部方言,并且还希望支持未安装某个特定方言的参数,因此现在仅检查参数的格式,而不是在 sqlalchemy.dialects 中查找该方言。
  • [sql] [bug] [mysql]
    完全实现了对 True/False 常量的 IS 和 IS NOT 运算符。现在像 col.is_(True) 这样的表达式将在目标平台上呈现为 col IS true,而不是将 True/False 常量转换为整数绑定参数。这使得 is_() 运算符在给定 True/False 常量时能够在 MySQL 上工作。
    参考:#2682
  • [sql] [bug]
    当  apply_labels() 被使用时,修复了 select() 对象生成标记列的方式;此模式生成一个 SELECT,其中每个列都被标记为  _,以消除多表选择中的列名冲突。修复的问题是,如果两个标签与表名组合时发生冲突,即“foo.bar_id” 和  “foo_bar.id”,则将对其中一个 dupes 应用匿名别名。这允许 ORM 独立处理两个列;在此之前,0.7  在某些情况下会静默地为“duped”列发出第二个 SELECT,并且在 0.8 中会发出一个模糊的列错误。对 select() 的 .c.  集合应用的 “keys” 也将被去重,因此对于指定了 use_labels 的任何 select(),将不再发出“正在替换的列”警告,尽管  dupes 键将被赋予一个不通常用户友好的匿名标签。
    参考:#2702
  • [sql] [bug]
    修复了在错误断开连接时,如果错误是在 Connection 对象已经关闭之后引发的,会引发属性错误的错误。
    参考:#2691
  • [sql] [bug]
    重新设计了在重新引发之前发出回滚() 的内部异常引发,以便从 sys.exc_info() 中保留堆栈跟踪,然后进入回滚。这样,当使用可能在回滚函数返回之前切换上下文的协程框架时,将保留堆栈跟踪。
    参考:#2703
  • [sql] [bug] [postgresql]
    当在 Python 3 上运行时,_Binary 基础类型现在通过 bytes() 可调用进行值转换;特别是 psycopg2 2.5 与 Python 3.3 似乎现在返回“memoryview”类型,因此在返回之前将其转换为字节。
  • [sql] [bug]
    改进了  Connection 自动失效处理。如果发生非断开连接错误,但在错误处理中导致延迟断开连接错误(在 MySQL  中发生),则会检测到断开连接条件。Connection  现在也可以在无效状态下关闭,这意味着在下一次使用时会引发“closed”,此外,“close with  result”功能将在错误处理例程中的自动回滚失败时工作,无论条件是断开连接还是其他情况。
    参考:#2695
  • [sql] [bug]
    修复了一个 bug,即一个可以为 cursor.lastrowid 返回“0”的 DBAPI 与 ResultProxy.inserted_primary_key 结合使用时将无法正确运行。

postgresql

  • [postgresql] [bug]
    打开了对 psycopg2/libpq 中“断开连接”检查的检查,以检查完整异常层次结构中的所有不同“断开连接”消息。具体来说,“意外关闭连接”消息现在至少在三种不同的异常类型中被看到。由 Eli Collins 提供。
    参考:#2712
  • [postgresql] [bug]
    PostgreSQL ARRAY 类型的操作符支持集合、生成器等输入类型,即使未指定维度,也会无条件地将给定的可迭代对象转换为集合。
    参考:#2681
  • [postgresql] [bug]
    添加了缺失的 HSTORE 类型到 postgresql 类型名称中,以便可以反射该类型。
    参考:#2680

mysql

  • [mysql] [bug]
    修复以支持最新的 cymysql DBAPI,由 Hajime Nakagami 提供。
  • [mysql] [bug]
    对 Python 3 上 pymysql 方言的操作进行了改进,包括一些重要的解码/字节步骤。由 Ben Trofatter 提供。问题仍然存在于 BLOB 类型,由于驱动程序问题。
    参考:#2663
  • [mysql] [bug]
    更新了一个正则表达式,以正确提取谷歌应用引擎 v1.7.5 及更新版本的错误代码。感谢 Dan Ring。

mssql

  • [mssql] [bug]
    作为一系列修复的一部分,需要为  pyodbc+ mssql 添加 CAST 到 NVARCHAR(max),以避免在所有信息模式查询的表名和模式名的绑定参数中出现将  NVARCHAR 与 NTEXT 进行比较的问题,这似乎在某些情况下被 ODBC 驱动程序拒绝,例如 FreeTDS(仅限  0.91?)加上传递的 Unicode 绑定参数。该问题似乎特定于 SQL Server  信息模式表,并且解决方法对于那些问题本来就不存在的情况是无害的。
    参考:#2355
  • [mssql] [bug]
    为 pymssql 方言添加了对额外“断开连接”消息的支持��由 John Anderson 提供。
  • [mssql] [bug]
    修复了关于“binary”类型和 pymssql 的 Py3K bug。由 Marc Abramowitz 提供。
    参考:#2683


SqlAlchemy 2.0 中文文档(六十五)(4)https://developer.aliyun.com/article/1560890

相关文章
|
9天前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十四)(3)
SqlAlchemy 2.0 中文文档(六十四)
10 0
|
9天前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十四)(1)
SqlAlchemy 2.0 中文文档(六十四)
10 0
|
5天前
|
SQL 数据库连接 数据库
SqlAlchemy 2.0 中文文档(五十五)(2)
SqlAlchemy 2.0 中文文档(五十五)
11 1
|
5天前
|
SQL 缓存 数据库连接
SqlAlchemy 2.0 中文文档(五十五)(1)
SqlAlchemy 2.0 中文文档(五十五)
12 1
|
5天前
|
SQL 缓存 编译器
SqlAlchemy 2.0 中文文档(五十五)(4)
SqlAlchemy 2.0 中文文档(五十五)
13 1
|
5天前
|
SQL 数据库连接 API
SqlAlchemy 2.0 中文文档(五十五)(3)
SqlAlchemy 2.0 中文文档(五十五)
10 1
|
5天前
|
API 数据库 Python
SqlAlchemy 2.0 中文文档(五十五)(6)
SqlAlchemy 2.0 中文文档(五十五)
12 1
|
5天前
|
SQL 安全 数据库连接
SqlAlchemy 2.0 中文文档(五十五)(5)
SqlAlchemy 2.0 中文文档(五十五)
14 1
|
9天前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十五)(1)
SqlAlchemy 2.0 中文文档(六十五)
12 0
|
9天前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十五)(5)
SqlAlchemy 2.0 中文文档(六十五)
10 0