1.0 更新日志

1.0.19

发布日期: 2017年8月3日

oracle

  • [oracle] [bug] [performance] [py2k]

    修复了由 #3937 的修复引起的性能回归,其中 cx_Oracle 从 5.3 版本开始,从其命名空间中删除了 .UNICODE 符号,这被解释为 cx_Oracle 的 “WITH_UNICODE” 模式被无条件开启,从而在 SQLAlchemy 侧调用函数,无条件地将所有字符串转换为 unicode,从而导致性能影响。实际上,根据 cx_Oracle 作者的说法,“WITH_UNICODE” 模式已从 5.1 版本开始完全删除,因此不再需要昂贵的 unicode 转换函数,如果在 Python 2 下检测到 cx_Oracle 5.1 或更高版本,则会禁用这些函数。在 #3937 下删除的针对 “WITH_UNICODE” 模式的警告也已恢复。

    参考链接: #4035

1.0.18

发布日期: 2017年7月24日

oracle

  • [oracle] [bug]

    修复了 cx_Oracle 的 WITH_UNICODE 模式的一个错误,该错误是由 cx_Oracle 5.3 现在似乎在构建中硬编码了这个标志的事实暴露出来的;使用这种模式的内部方法没有使用正确的签名。

    参考链接: #3937

tests

  • [tests] [bug] [py3k]

    修复了测试 fixtures 中的一个问题,该问题与 Python 3.6.2 中对上下文管理器所做的更改不兼容。

    参考链接: #4034

1.0.17

发布日期: 2017年1月17日

orm

  • [orm] [bug]

    修复了当也使用多态继承时,针对多个实体进行连接的预先加载时会抛出 “'NoneType' object has no attribute 'isa'” 的错误。此问题是由 #3611 的修复引入的。

    参考链接: #3884

misc

  • [bug] [py3k]

    修复了与没有 'r' 修饰符的转义字符串相关的 Python 3.6 DeprecationWarnings,并为 Python 3.6 添加了测试覆盖率。

    参考链接: #3886

1.0.16

发布日期: 2016年11月15日

orm

  • [orm] [bug]

    修复了 Session.bulk_update_mappings() 中的一个错误,其中备用名称的主键属性无法正确跟踪到 UPDATE 语句中。

    参考链接: #3849

  • [orm] [bug]

    修复了当 polymorphic_on 设置为未映射的表达式(例如 CASE 表达式)时,连接的预先加载对于多态加载的映射器会失败的错误。

    参考链接: #3800

  • [orm] [bug]

    修复了通过 Session.bind_mapper(), Session.bind_table() 或构造函数发送到 Session 的无效绑定引发的 ArgumentError 无法正确引发的错误。

    参考链接: #3798

  • [orm] [bug]

    修复了 Session.bulk_save() 中的一个错误,其中 UPDATE 无法与实现版本 ID 计数器的映射一起正常工作。

    参考链接: #3781

  • [orm] [bug]

    修复了当在首次调用这些访问器后将映射器属性或其他 ORM 构造添加到映射器/类时,Mapper.attrs, Mapper.all_orm_descriptors 和其他派生属性无法刷新的错误。

    参考链接: #3778

mssql

  • [mssql] [bug]

    更改了用于获取 “默认模式名称” 的查询,从查询数据库主体表的查询更改为使用 “schema_name()” 函数,因为已报告前一个系统在 Azure 数据仓库版本上不可用。希望这最终可以在所有 SQL Server 版本和身份验证样式下工作。

    参考链接: #3810

  • [mssql] [bug]

    更新了 pyodbc 的服务器版本信息方案,以使用 SQL Server SERVERPROPERTY(),而不是依赖于 pyodbc.SQL_DBMS_VER,后者仍然不可靠,尤其是在 FreeTDS 中。

    参考链接: #3814

  • [mssql] [bug]

    将错误代码 20017 “从服务器意外 EOF” 添加到导致连接池重置的断开连接异常列表中。感谢 Ken Robbins 的拉取请求。

    参考链接: #3791

  • [mssql] [bug]

    修复了 pyodbc 方言(以及大部分无法工作的 adodbapi 方言)中的一个错误,其中密码或用户名字段中出现的分号可能被解释为另一个令牌的分隔符;现在,当存在分号时,这些值会被引用。

    参考链接: #3762

misc

  • [bug] [orm.declarative]

    修复了设置连接表子类的单表 inh 子类(包含额外的列)会破坏映射表的外键集合,从而干扰关系初始化的错误。

    参考链接: #3797

1.0.15

发布日期: 2016年9月1日

orm

  • [orm] [bug]

    修复了子查询预先加载中的一个错误,其中 “of_type()” 对象的 subqueryload 链接到普通映射类的第二个 subqueryload,或者更长的几个 “of_type()” 属性链,将无法正确链接连接。

    参考链接: #3773, #3774

sql

  • [sql] [bug]

    修复了 Table 中的一个错误,其中内部方法 _reset_exported() 会破坏对象的状态。此方法旨在用于可选择对象,并在某些情况下由 ORM 调用;错误的映射器配置可能会导致 ORM 在 Table 对象上调用此方法。

    参考链接: #3755

mysql

  • [mysql] [bug]

    添加了对解析 URL 查询字符串中 MySQL/Connector 布尔值和整数参数的支持:connection_timeout, connect_timeout, pool_size, get_warnings, raise_on_warnings, raw, consume_results, ssl_verify_cert, force_ipv6, pool_reset_session, compress, allow_local_infile, use_pure。

    参考链接: #3787

misc

  • [bug] [ext]

    修复了 sqlalchemy.ext.baked 中的一个错误,其中子查询预先加载器查询的 unbaking 会因变量作用域问题而失败,当涉及多个子查询加载器时。感谢 Mark Hahnenberg 的拉取请求。

    参考链接: #3743

1.0.14

发布日期: 2016年7月6日

examples

  • [examples] [bug]

    修复了 examples/vertical/dictlike-polymorphic.py 示例中发生的回归,该回归阻止了它运行。

    参考链接: #3704

engine

  • [engine] [bug] [postgresql]

    修复了结合 MetaData.schema 参数的跨模式外键反射中的错误,其中 “default” 模式中存在的被引用表将失败,因为没有办法指示模式为 “blank” 的 Table。特殊符号 sqlalchemy.schema.BLANK_SCHEMA 已添加为 Table.schemaSequence.schema 的可用值,指示即使指定了 MetaData.schema,模式名称也应强制为 None

    参考链接: #3716

sql

  • [sql] [bug]

    修复了 SQL 数学求反运算符中的问题,其中表达式的类型不再是原始的数字类型。这将导致类型决定结果集行为的问题。

    参考链接: #3735

  • [sql] [bug]

    修复了 sqlalchemy.util.Properties 的 __getstate__ / __setstate__ 方法由于 1.0 系列中过渡到 __slots__ 而无法工作的错误。此问题可能影响某些第三方应用程序。感谢 Pieter Mulder 的拉取请求。

    参考链接: #3728

  • [sql] [bug]

    FromClause.count() 将在 1.1 版本中被弃用。此函数使用表中的任意列,并且不可靠;对于 Core 用法,应首选 func.count()

    参考链接: #3724

  • [sql] [bug]

    修复了 CTE 结构中的一个错误,该错误会导致在使用 union 时无法正确克隆它,这在递归 CTE 中很常见。不正确的克隆会在 CTE 用于各种 ORM 上下文(例如 column_property() 的上下文)时导致错误。

    参考链接: #3722

  • [sql] [bug]

    修复了 Table.tometadata() 会为每个具有 unique=True 参数的 Column 对象创建重复的 UniqueConstraint 的错误。

    参考链接: #3721

postgresql

  • [postgresql] [bug]

    修复了 PostgreSQL 方言对 TypeDecoratorVariant 类型检查不够深入的错误,无法确定是否需要渲染 SMALLSERIAL 或 BIGSERIAL 而不是 SERIAL。

    参考链接: #3739

oracle

  • [oracle] [bug]

    修复了 Select.with_for_update.of 中的一个错误,其中 Oracle “rownum” 的 LIMIT/OFFSET 方法无法容纳 “OF” 子句中的表达式,这些表达式必须在最顶层声明,并引用子查询中的表达式。现在,如果需要,表达式会添加到子查询中。

    参考链接: #3741

1.0.13

发布日期: 2016年5月16日

orm

  • [orm] [bug]

    修复了 Query.update()Query.delete() 的 “evaluate” 策略中的一个错误,该错误无法容纳具有 “callable” 值的绑定参数,当通过关系沿多对一相等表达式进行过滤时会发生这种情况。

    参考链接: #3700

  • [orm] [bug]

    修复了当在深度类继承层次结构中结合多个映射器配置步骤使用时,用于反向引用的事件监听器可能会被无意中多次应用的错误。

    参考链接: #3710

  • [orm] [bug]

    修复了将 text() 构造传递给 Query.group_by() 方法会引发错误,而不是将对象解释为 SQL 片段的错误。

    参考链接: #3706

  • [orm] [bug]

    匿名标签应用于传递给 column_property()func 构造,以便如果同一个属性被引用为列表达式两次,则名称会去重,从而避免 “ambiguous column” 错误。以前,需要应用 .label(None) 才能取消匿名化名称。

    参考链接: #3663

  • [orm] [bug]

    修复了 1.0 系列中出现的 ORM 加载回归,其中对于预期的列丢失引发的异常将错误地成为 NoneType 错误,而不是预期的 NoSuchColumnError

    参考链接: #3658

examples

  • [examples] [bug]

    更改了 “directed graph” 示例,不再将节点的整数标识符视为重要;“higher” / “lower” 引用现在允许双向互边。

    参考链接: #3698

sql

  • [sql] [bug]

    修复了当 Engine 使用 case_sensitive=False 时,结果集无法正确容纳结果集中的重复列名,导致在 1.0 中执行语句时出错,并阻止 “ambiguous column” 异常在 1.1 中起作用的错误。

    参考链接: #3690

  • [sql] [bug]

    修复了 EXISTS 表达式的否定在结果中未正确键入为布尔值,并且也无法在 SELECT 列表中匿名别名(非否定 EXISTS 构造的情况)的错误。

    参考链接: #3682

  • [sql] [bug]

    修复了在 Insert.values() 使用参数映射列表而不是单个参数映射调用时,“未使用的列名” 异常无法引发的错误。感谢 Athena Yao 的拉取请求。

    参考链接: #3666

postgresql

  • [postgresql] [bug]

    为错误字符串 “SSL error: decryption failed or bad record mac” 添加了断开连接检测支持。感谢 Iuri de Silvio 的拉取请求。

    参考链接: #3715

mssql

  • [mssql] [bug]

    修复了 SQL Server 中应用于 OFFSET 选择的 ROW_NUMBER OVER 子句会不恰当地替换本地语句中的普通列(该列与语句的 ORDER BY 条件使用的标签名称重叠)的错误。

    参考链接: #3711

  • [mssql] [bug] [oracle]

    修复了 1.0 系列中出现的回归,该回归会导致 Oracle 和 SQL Server 方言在将 SELECT 包装在子查询中以提供 LIMIT/OFFSET 行为时,错误地计算结果集列,并且原始 SELECT 语句多次引用同一列,例如列和同一列的标签。此问题与 #3658 相关,因为当错误发生时,它也会导致 NoneType 错误,而不是报告它找不到列。

    参考链接: #3657

oracle

  • [oracle] [bug]

    修复了 cx_Oracle 连接过程中的一个错误,该错误在用户、密码或 dsn 为空时导致 TypeError。这阻止了对 Oracle 数据库的外部身份验证,并阻止连接到默认 dsn。连接字符串 oracle:// 现在使用操作系统用户名登录到默认 dsn,相当于使用 ‘/’ 与 sqlplus 连接。

    参考链接: #3705

  • [oracle] [bug]

    修复了主要由 Oracle 使用的结果代理中的一个错误,当二进制和其他 LOB 类型发挥作用时,当使用查询/语句缓存时,类型级结果处理器(特别是二进制类型本身所需的处理器,以及任何其他处理器)将在语句的第一次运行后丢失,因为它已从缓存的结果元数据中删除。

    参考链接: #3699

misc

  • [bug] [py3k]

    修复了 “to_list” 转换中的一个错误,其中单个字节对象将被转换为单个字符列表。这将影响在主键是字节对象的情况下使用 Query.get() 方法等操作。

    参考链接: #3660

1.0.12

发布日期: 2016年2月15日

orm

  • [orm] [bug]

    修复了 Session.merge() 中的一个错误,该错误发生在当一个复合主键对象只有部分主键字段值时,会发出一个 SELECT 语句,将内部的 NEVER_SET 符号泄漏到查询中,而不是检测到该对象没有可搜索的主键,因此不应发出 SELECT 语句。

    参考链接: #3647

  • [orm] [bug]

    修复了自 0.9 版本以来的回归问题,该问题导致 0.9 风格的加载器选项系统无法处理单个查询中的多个 undefer_group() 加载器选项。现在,即使针对同一实体,也会考虑多个 undefer_group() 选项。

    参考链接: #3623

engine

  • [engine] [bug] [mysql]

    重新审视 #2696,该问题首次在 1.0.10 版本中发布,旨在解决 Python 2 缺乏异常上下文报告的问题,方法是在尝试回滚已失败的事务时,对于被第二个异常中断的异常发出警告;这个问题在 MySQL 后端与意外丢失的保存点结合使用时仍然会发生,这会导致尝试回滚时出现 “no such savepoint” 错误,从而掩盖了原始条件。

    该方法已推广到 Core “safe reraise” 函数,该函数在 ORM 和 Core 中任何因尝试提交时发生错误而回滚事务的地方执行,包括 SessionConnection 提供的上下文管理器,以及诸如 “RELEASE SAVEPOINT” 失败等操作。以前,此修复仅在 ORM flush/commit 过程中的特定路径中有效;现在它也适用于所有事务上下文管理器。

    参考链接: #2696

sql

  • [sql] [bug]

    修复了当编译为字符串 SQL 时,“literal_binds” 标志未针对 insert(), update()delete() 构造传播的问题。感谢 Tim Tate 提供 Pull request。

    参考链接: #3643

  • [sql] [bug]

    修复了意外使用 Python __contains__ 覆盖与列表达式(例如,使用 'x' in col)会导致 ARRAY 类型无限循环的问题,因为 Python 将此操作委托给 __getitem__ 访问,而对于此类型,__getitem__ 访问永远不会引发异常。总体而言,现在所有 __contains__ 的使用都会引发 NotImplementedError。

    参考链接: #3642

  • [sql] [bug]

    修复了 0.9 系列版本左右出现的 Table 元数据构造中的一个错误,该错误导致向反序列化的 Table 添加列时,无法正确地在 'c' 集合中建立 Column,从而导致 ORM 配置等区域出现问题。这可能会影响诸如 extend_existing 等用例。

    参考链接: #3632

postgresql

  • [postgresql] [bug]

    修复了 text() 构造中的一个错误,该错误导致双冒号表达式无法正确转义,例如 some\:\:expr,这在渲染 PostgreSQL 风格的 CAST 表达式时最常见。

    参考链接: #3644

mssql

  • [mssql] [bug]

    修复了在 MSSQL 上针对 datetime 值使用 extract() 函数的语法;移除了关键字周围的引号。感谢 Guillaume Doumenc 提供 Pull request。

    参考链接: #3624

  • [mssql] [bug] [firebird]

    修复了 1.0 版本的回归问题,该问题导致通过纯文本或通过 text() 构造发出的 UPDATE 或 DELETE 语句不再调用游标的 eager fetch of cursor.rowcount,从而影响那些在游标关闭后会清除 cursor.rowcount 的驱动程序,例如 SQL Server ODBC 和 Firebird 驱动程序。

    参考链接: #3622

oracle

  • [oracle] [bug] [jython]

    修复了 Jython Oracle 编译器中涉及 “RETURNING” 渲染的一个小问题,该问题允许这个目前不受支持/未经测试的方言在 1.0 系列中粗略地工作。感谢 Carlos Rivas 提供 Pull request。

    参考链接: #3621

misc

  • [bug] [py3k]

    修复了某些异常重新引发场景会将异常自身附加为 “cause” 的错误;虽然 Python 3 解释器可以接受这一点,但它可能会在 iPython 中导致无限循环。

    参考链接: #3625

1.0.11

发布日期: 2015年12月22日

orm

  • [orm] [bug]

    修复了 1.0.10 版本中由 #3593 的修复引起的回归问题,其中为 poly_subclass->class->poly_baseclass 连接添加的多态 joinedload 检查会在 class->poly_subclass->class 的场景中失败。

    参考链接: #3611

  • [orm] [bug]

    修复了当使用 Session.bulk_update_mappings() 及相关方法时,版本 ID 计数器不会递增的错误。此处的体验仍然有点粗糙,因为给定的字典中需要原始版本 ID,并且目前还没有关于此的清晰错误报告。

    参考链接: #3610

  • [orm] [bug]

    Mapper.eager_defaults 标志进行了重大修复,此标志在需要发出多个 UPDATE 语句的情况下(无论是作为 flush 操作还是 bulk update 操作的一部分)无法正确地被遵守。此外,RETURNING 会在 update 语句中不必要地发出。

    参考链接: #3609

  • [orm] [bug]

    修复了使用 Query.select_from() 方法会导致随后调用 Query.with_parent() 方法失败的错误。

    参考链接: #3606

sql

  • [sql] [bug]

    修复了 Update.return_defaults() 中的一个错误,该错误会导致所有 insert-default holding 列(未包含在 SET 子句中的列,例如主键列)即使是 UPDATE 也会被渲染到 RETURNING 中。

    参考链接: #3609

mysql

  • [mysql] [bug]

    调整了解析 MySQL 视图的正则表达式,这样我们就不再假设 “ALGORITHM” 关键字存在于反射的视图源中,因为一些用户报告说在某些 Amazon RDS 环境中不存在该关键字。

    参考链接: #3613

  • [mysql] [bug]

    为 MySQL 方言添加了 MySQL 5.7 的新保留字,包括 ‘generated’、‘optimizer_costs’、‘stored’、‘virtual’。感谢 Hanno Schlichting 提供 Pull request。

misc

  • [bug] [ext]

    进一步修复了 #3605MutableDict 上的 pop 方法,其中未包含 “default” 参数。

    参考链接: #3605

  • [bug] [ext]

    修复了 baked loader 系统中的一个错误,该错误导致用于设置 baked lazy loader 的系统范围 monkeypatch 会干扰其他依赖于 lazy loading 作为后备的加载策略,例如 joined 和 subquery eager loader,从而导致 mapper 配置时出现 IndexError 异常。

    参考链接: #3612

1.0.10

发布日期: 2015年12月11日

orm

  • [orm] [bug]

    修复了当 many-to-one 关系上的 post_update 在属性设置为 None 且之前未加载的情况下,未能发出 UPDATE 的问题。

    参考链接: #3599

  • [orm] [bug]

    修复了一个实际上是版本 0.8.0 和 0.8.1 之间发生的回归错误,原因是 #2714。当 joined eager loading 需要在子类绑定的关系上进行 join out,并且也使用了 “with_polymorphic” 时,会从错误的实体进行 join。

    参考链接: #3593

  • [orm] [bug]

    修复了 joinedload 错误,该错误会在以下情况下发生:a. 查询包含强制子查询的 limit/offset 条件 b. 关系使用 “secondary” c. 关系的 primaryjoin 引用一个列,该列要么不是主键的一部分,要么是 joined-inheritance 子类表中的 PK 列,该列的属性名称与父表的主键列不同 d. 查询延迟了 primaryjoin 中存在的列,通常是通过不包含在 load_only() 中;必要的列不会出现在子查询中,并生成无效的 SQL。

    参考链接: #3592

  • [orm] [bug]

    一个罕见的情况,当 Session.rollback()Session.flush() 操作(该操作正在引发异常)的范围内失败时发生,这在某些 MySQL SAVEPOINT 案例中已经观察到,会阻止在 flush 期间发出的原始数据库异常被观察到,但这仅在 Py2K 上发生,因为 Py2K 不支持异常链接;在 Py3K 上,原始异常会被链接。作为一种解决方法,在这种特定情况下会发出警告,至少显示原始数据库错误的字符串消息,然后我们继续引发回滚引发的异常。

    参考链接: #2696

orm declarative

  • [orm] [declarative] [bug]

    修复了在 Py2K 中,unicode 字符串字面量在使用 backref()relationship() 上时,不被 declarative 接受为类名或其他参数的错误。感谢 Nils Philippsen 提供 Pull request。

sql

  • [sql] [feature]

    在 UPDATE 语句中添加了对参数排序的 SET 子句的支持。此功能通过将 update.preserve_parameter_order 标志传递给 core Update 构造,或者将其添加到 ORM 级别的 Query.update.update_args 字典中来使用,同时将参数本身作为 2 元组列表传递。感谢 Gorka Eguileor 实现和测试。

    另请参阅

    参数排序的更新

  • [sql] [bug]

    修复了 Insert.from_select() 构造中的一个问题,即当编译 Insert 构造时,Select 构造的 ._raw_columns 集合会被就地修改,当目标 Table 具有 Python 侧默认值时。 Select 构造会在编译 Insert 之后以错误的列独立编译,并且 Insert 语句本身会由于重复的绑定参数而在第二次编译尝试时失败。

    参考链接: #3603

  • [sql] [bug] [postgresql]

    修复了使用无列表但具有诸如 CHECK 约束之类的约束的 CREATE TABLE 会在定义中渲染错误逗号的错误;这种情况可能会发生在 PostgreSQL INHERITS 表中,该表本身没有列。

    参考链接: #3598

postgresql

  • [postgresql] [bug]

    修复了如果引用的表具有 schema 限定符,则 PostgreSQL 特定的 “FOR UPDATE OF” SELECT 修饰符会失败的问题;PG 需要省略 schema 名称。感谢 Diana Clarke 提供 Pull request。

    参考链接: #3573

  • [postgresql] [bug]

    修复了传递给 ExcludeConstraint 的 “where” 子句的某些 SQL 表达式变体无法被正确接受的错误。感谢 aisch 提供 Pull request。

  • [postgresql] [bug]

    修复了 INTERVAL.python_type 属性,使其返回 datetime.timedelta,方式与 python_type 相同,而不是引发 NotImplementedError

    参考链接: #3571

mysql

  • [mysql] [bug]

    修复了 MySQL 反射中的一个错误,其中 DATETIME, TIMESTAMPTIME 类型的 “小数秒部分” 会被错误地放置到 timezone 属性中(MySQL 未使用该属性),而不是 fsp 属性中。

    参考链接: #3602

mssql

  • [mssql] [bug]

    将错误 “20006: Write to the server failed” 添加到 pymssql 驱动程序的断开连接错误列表中,因为已观察到该错误会导致连接不可用。

    参考链接: #3585

  • [mssql] [bug]

    现在,如果 SQL server 从 DATE 或 TIME 列返回无效的日期或时间格式,则会引发描述性的 ValueError,而不是因 NoneType 错误而失败。感谢 Ed Avis 提供 Pull request。

  • [mssql] [bug]

    修复了为精度为 “零” 的 MSSQL 类型 DATETIME2、TIME 和 DATETIMEOFFSET 生成 DDL 时,不会生成精度字段的问题。感谢 Jacobo de Vera 提供 Pull request。

tests

  • [tests] [change]

    ORM 和 Core 教程(一直以 doctest 格式存在)现在在 Python 2 和 Python 3 的普通单元测试套件中进行练习。

misc

  • [bug] [ext]

    MutableDict 类添加了对 dict.pop()dict.popitem() 方法的支持。

    参考链接: #3605

  • [bug] [py3k]

    更新了内部 getargspec() 调用,一些 py36 相关 fixture 更新,以及对两个迭代器的修改,使其 “return” 而不是引发 StopIteration,以允许测试在 Py3.5、Py3.6 上通过,而不会出现错误或警告,感谢 Jacob MacDonald、Luri de Silvio 和 Phil Jones 提供 pull request。

  • [bug] [ext]

    修复了 baked queries 中的一个问题,其中 .get() 方法(直接使用或在 lazy load 中使用)没有将 mapper 的 “get clause” 视为缓存键的一部分,如果子句被重新生成,则会导致绑定参数不匹配。此子句由 mapper 动态缓存,但在高度并发的场景中,首次访问时可能会生成多次。

    参考链接: #3597

1.0.9

发布日期: 2015年10月20日

orm

  • [orm] [feature]

    添加了新方法 Query.one_or_none();与 Query.one() 相同,但如果没有找到行则返回 None。感谢 esiegerman 提供 Pull request。

  • [orm] [bug] [postgresql]

    修复了 1.0 版本中的回归问题,其中在 ORM 中为 UPDATE 语句使用 “executemany” 的新功能(例如,UPDATE 语句现在在 flush 中使用 executemany() 批量处理)在使用服务器端版本生成方案时会在 PostgreSQL 和其他 RETURNING 后端上中断,因为服务器端值是通过 RETURNING 检索的,而 RETURNING 不支持 executemany。

    参考链接: #3556

  • [orm] [bug]

    修复了在字符串化某些类型的内部列加载器选项时可能发生的罕见 TypeError。

    参考链接: #3539

  • [orm] [bug]

    修复了 Session.bulk_save_objects() 中的一个错误,其中具有某种 “fetch on update” 值且在给定对象中本地不存在的映射列会导致操作内部出现 AttributeError。

    参考链接: #3525

  • [orm] [bug]

    修复了 1.0 版本中的一个回归错误,即 “noload” 加载策略在多对一关系中无法正常工作的问题。该加载器使用 API 将 “None” 放入字典,但这实际上不再写入值;这是 #3061 的副作用。

    参考链接:#3510

示例

  • [示例] [bug]

    修复了 “history_meta” 示例中的两个问题:历史记录跟踪可能会遇到空历史记录,以及键入到备用属性名称的列将无法正确跟踪。修复由 Alex Fraser 提供。

sql

  • [sql] [bug]

    修复了 1.0 发布版本中多-VALUES insert 语句 #3288 的默认处理器回归错误,其中默认持有列的列类型不会传播到已编译的语句中(如果正在使用默认值),从而导致绑定级别的类型处理程序未被调用。

    参考链接:#3520

postgresql

  • [postgresql] [bug]

    调整了 1.0.6 中发布的 PostgreSQL 新特性,即反映存储选项和 #3455 的 USING,对于 PostgreSQL 版本 < 8.2(其中未提供 reloptions 列)禁用此特性;这使得 Amazon Redshift 能够再次工作,因为它基于 PostgreSQL 的 8.0.x 版本。修复由 Pete Hollobon 提供。

oracle

  • [oracle] [bug] [py3k]

    修复了对 cx_Oracle 5.2 版本的支持,该版本在 Python 3 下会触发 SQLAlchemy 的版本检测,并无意中未对 Python 3 使用正确的 unicode 模式。这将导致诸如绑定变量被错误地解释为 NULL 以及行被静默地不返回等问题。

    此更改也向后移植到:0.7.0b1

    参考链接:#3491

  • [oracle] [bug]

    修复了 Oracle 方言中的一个 bug,其中反射名称被引用以强制全小写的表和其他符号在反射查询中无法被正确识别。quoted_name 构造现在应用于检测到在 “名称规范化” 过程中被强制转换为全小写的传入符号名称。

    参考链接:#3548

misc

  • [feature] [ext]

    AssociationProxy 构造函数添加了 AssociationProxy.info 参数,以适应在 #2971 中添加的 AssociationProxy.info 访问器。这是可能的,因为 AssociationProxy 是显式构造的,这与通过装饰器语法隐式构造的 hybrid 不同。

    参考链接:#3551

  • [bug] [sybase]

    修复了关于 Sybase 反射的两个问题,允许反射没有主键的表,并确保预先获取外键检测中涉及的 SQL 语句,以避免嵌套查询时的驱动程序问题。此处的修复由 Eugene Zapolsky 提供;请注意,我们目前无法本地测试 Sybase 以验证这些更改。

    参考链接:#3508, #3509

1.0.8

发布日期:2015 年 7 月 22 日

engine

  • [engine] [bug]

    修复了一个严重问题,即在池无效并重新连接尝试失败的情况下,可能会针对陈旧的连接调用池 “checkout” 事件处理程序,而没有调用 “connect” 事件处理程序;陈旧的连接将保持存在,并在后续尝试中使用。此问题在 1.0.2 之后的 1.0 系列中具有更大的影响,因为它还向事件处理程序传递了一个空白的 .info 字典;在 1.0.2 之前,.info 字典仍然是之前的字典。

    此更改也向后移植到:0.7.0b1

    参考链接:#3497

sqlite

  • [sqlite] [bug]

    修复了 SQLite 方言中的一个 bug,其中反射名称中包含非字母字符(如点或空格)的 UNIQUE 约束将不会反映其名称。

    此更改也向后移植到:0.9.10

    参考链接:#3495

misc

  • [misc] [bug]

    修复了 utils 中特定基类未实现 __slots__ 的问题,因此意味着该类的所有子类也没有实现,从而否定了使用 __slots__ 的理由。除了在 IronPython 上之外,没有引起任何问题,IronPython 显然没有与 cPython 兼容地实现 __slots__ 行为。

    参考链接:#3494

1.0.7

发布日期:2015 年 7 月 20 日

orm

  • [orm] [bug]

    修复了 1.0 版本中的一个回归错误,即覆盖 __eq__() 以返回非布尔值对象(例如某些 geoalchemy 类型以及 numpy 类型)的值对象在工作单元更新操作期间会被测试 bool(),而在 0.9 中,__eq__() 的返回值会针对 “is True” 进行测试以防止这种情况。

    参考链接:#3469

  • [orm] [bug]

    修复了 1.0 版本中的一个回归错误,即如果 “deferred” 属性在 “优化的继承加载” 中加载,则该属性将无法正确填充,这是一种特殊的 SELECT,在连接表继承的情况下发出,用于填充过期或未加载的属性,而无需加载基表。这与 SQLA 1.0 不再猜测加载 deferred 列并且必须显式指示有关。

    参考链接:#3468

  • [orm] [bug]

    修复了 1.0 版本中的一个回归错误,即 aliased() 对象之上的同义词映射属性的 “父实体” 将解析为原始的 mapper,而不是它的 aliased() 版本,从而导致 Query 出现问题,该 Query 依赖于此属性(例如,它是构造函数中给出的唯一代表属性)来找出查询的正确 FROM 子句。

    参考链接:#3466

orm declarative

  • [orm] [declarative] [bug]

    修复了 AbstractConcreteBase 扩展中的一个 bug,其中在 ABC 基类上设置的列(具有不同的属性名称与列名称)将无法在最终基类上正确映射。0.9 上的失败将是静默的,而 1.0 上会引发 ArgumentError,因此在 1.0 之前可能没有注意到。

    参考链接:#3480

engine

  • [engine] [bug]

    修复了一个回归错误,其中 ORM Query 对象使用的 ResultProxy 上的新方法(作为 #3175 的性能增强的一部分)在驱动程序(通常是 MySQL)未能正确生成 cursor.description 的情况下,不会引发 “此结果不返回行” 异常;而是会引发针对 NoneType 的 AttributeError。

    参考链接:#3481

  • [engine] [bug]

    修复了一个回归错误,其中 ResultProxy.keys() 将为 “匿名” 标签返回未调整的内部符号名称,这些标签是我们为没有标签的 SQL 函数和类似函数生成的 “foo_1” 类型的标签。这是作为 #918 的一部分实现的性能增强的副作用。

    参考链接:#3483

sql

  • [sql] [feature]

    添加了 ColumnElement.cast() 方法,该方法与独立的 cast() 函数具有相同的目的。拉取请求由 Sebastian Bank 提供。

    参考链接:#3459

  • [sql] [bug]

    修复了与 and_()or_() 结合使用时,文字 TrueFalse 常量的强制转换会因 AttributeError 而失败的 bug。

    参考链接:#3490

  • [sql] [bug]

    修复了潜在问题,即 FunctionElement 或其他列元素的自定义子类错误地将 ‘None’ 或任何其他无效对象声明为 .type 属性将报告此异常,而不是递归溢出。

    参考链接:#3485

  • [sql] [bug]

    修复了由于缺少 __rmod__ 方法,模数 SQL 运算符在反向不起作用的 bug。拉取请求由 dan-gittik 提供。

schema

  • [schema] [feature]

    为 PostgreSQL 和 Oracle 支持的 CREATE SEQUENCE 添加了对 MINVALUE、MAXVALUE、NO MINVALUE、NO MAXVALUE 和 CYCLE 参数的支持。拉取请求由 jakeogh 提供。

1.0.6

发布日期:2015 年 6 月 25 日

orm

  • [orm] [bug]

    修复了 1.0 系列中的一个主要回归错误,其中 version_id_counter 特性会导致对象的版本计数器在对象的行没有净更改时递增,而是通过关系(例如,通常是多对一)与其相关的对象被关联或解除关联,从而导致 UPDATE 语句更新对象的版本计数器,而没有其他操作。在使用相对较新的 “服务器端” 和/或 “程序化/条件” 版本计数器特性(例如,将 version_id_generator 设置为 False)的情况下,此 bug 可能会导致发出没有有效 SET 子句的 UPDATE。

    参考链接:#3465

  • [orm] [bug]

    修复了 1.0 版本中的一个回归错误,其中 #3222 的单继承连接的增强行为不适当地发生在沿显式连接条件的 JOIN 中,该连接条件具有不使用任何鉴别器的单继承子类,从而导致额外的 “AND NULL” 子句。

    参考链接:#3462

  • [orm] [bug]

    修复了新的 Session.bulk_update_mappings() 特性中的一个 bug,其中用于在 WHERE 子句中定位行的主键列也将包含在 SET 子句中,从而不必要地将其值设置为自身。拉取请求由 Patrick Hayes 提供。

    参考链接:#3451

  • [orm] [bug]

    修复了一个意外使用的回归错误,其中自定义 Comparator 对象使用 __clause_element__() 方法并返回一个对象,该对象是 ORM 映射的 InstrumentedAttribute 而不是显式的 ColumnElement,当作为表达式传递给 Session.query() 时,将无法正确处理。0.9 中的逻辑恰好成功,因此现在支持此用例。

    参考链接:#3448

sql

  • [sql] [bug]

    修复了一个 bug,其中应用于 Label 对象的子句适配在所有情况下都无法容纳标记的 SQL 表达式,因此任何使用 Label.self_group() 的 SQL 操作都将使用原始的未适配表达式。这会产生一个影响,即 ORM aliased() 构造无法完全容纳由 column_property 映射的属性,因此当在某些类型的 SQL 比较中使用属性时,未别名的表可能会泄漏出来。

    参考链接:#3445

postgresql

  • [postgresql] [feature]

    添加了对 CREATE INDEX 下存储参数的支持,使用新的关键字参数 postgresql_with。还添加了对反射的支持,以支持 postgresql_with 标志和 postgresql_using 标志,这两个标志现在都将在反射的 Index 对象上设置,并且也存在于 Inspector.get_indexes() 结果中的新 “dialect_options” 字典中。拉取请求由 Pete Hollobon 提供。

    另请参阅

    索引存储参数

    参考链接:#3455

  • [postgresql] [feature]

    添加了新的执行选项 max_row_buffer,该选项在使用 stream_results 选项时由 psycopg2 方言解释,该选项设置了可能分配的行缓冲区大小的限制。此值也基于发送到 Query.yield_per() 的整数值提供。拉取请求由 mcclurem 提供。

  • [postgresql] [bug] [pypy]

    重新修复了首次在 1.0.5 中发布的此问题,以再次修复 psycopg2cffi JSONB 支持,因为他们在 2.7.1 版本中突然开启了 JSONB 类型的无条件解码。版本检测现在指定 2.7.1 为我们应该期望 DBAPI 为我们进行 json 编码的版本。

    参考链接:#3439

  • [postgresql] [bug]

    修复了 ExcludeConstraint 构造,以支持其他对象(如 Index)现在执行的常见特性,即列表达式可以指定为任意 SQL 表达式,例如 casttext

    参考链接:#3454

mssql

  • [mssql] [bug]

    修复了将 VARBINARY 类型与 NULL + pyodbc 的 INSERT 结合使用时的问题;pyodbc 需要传入一个特殊对象才能持久化 NULL。由于 VARBINARY 类型现在通常是 LargeBinary 的默认类型,因为 #3039,因此此问题部分是 1.0 中的回归错误。pymssql 驱动程序似乎不受影响。

    参考链接:#3464

misc

  • [bug] [documentation]

    修复了方法类型的内部 “memoization” 例程,使得不再使用 Python 描述符;修复了这些方法的可检查性,包括对 Sphinx 文档的支持。

    参考链接:#2077

1.0.5

发布日期:2015 年 6 月 7 日

orm

  • [orm] [feature]

    添加了新的事件 InstanceEvents.refresh_flush(),当在 flush 过程中通过 RETURNING 或 Python 端默认值获取 INSERT 或 UPDATE 级别默认值时调用。这是为了提供一个挂钩,该挂钩不再存在,这是 #3167 的结果,其中属性和验证事件不再在 flush 过程中调用。

    参考链接:#3427

  • [orm] [bug]

    Query 返回行时使用的 “轻量级命名元组” 未能正确实现 __slots__,因此它仍然具有 __dict__。此问题已解决,但在极不可能的情况下,有人将值分配给返回的元组,这将不再起作用。

    参考链接:#3420

engine

  • [engine] [feature]

    添加了新的引擎事件 ConnectionEvents.engine_disposed()。在调用 Engine.dispose() 方法后调用。

  • [engine] [feature]

    调整了引擎插件钩子,使得当使用方言插件时,URL.get_dialect() 方法将继续返回最终的 Dialect 对象,而无需调用者了解 Dialect.get_dialect_cls() 方法。

    参考链接:#3379

  • [engine] [bug]

    修复了 engine_from_config() 使用的已知布尔值未被正确解析的 bug;这些值包括 pool_threadlocal 和 psycopg2 参数 use_native_unicode

    参考链接:#3435

  • [engine] [bug]

    为行为不端的 DBAPI 添加了支持,该 DBAPI 的 pep-249 异常名称链接到完全不同名称的异常类,从而阻止 SQLAlchemy 自己的异常包装程序适当地包装错误。正在使用的 SQLAlchemy 方言需要实现一个新的访问器 DefaultDialect.dbapi_exception_translation_map 以支持此特性;现在已为 py-postgresql 方言实现。

    参考链接:#3421

  • [engine] [bug]

    修复了涉及使用池 checkout 事件处理程序并且处理程序本身中进行的连接尝试失败的情况的 bug,拥有连接记录将不会被释放,直到连接错误的堆栈跟踪本身被释放。对于仅使用单个连接的测试池的情况,这意味着池将被完全检出,直到该堆栈跟踪被释放。这主要影响非常具体的调试场景,并且不太可能在任何生产应用程序中被注意到。此修复程序在重新引发捕获的异常之前应用了记录的显式检入。

    参考链接:#3419

sql

  • [sql] [feature]

    添加了对 Insert.from_select() 内部的 SELECT 使用的 CTE 的官方支持。此行为在 0.9.9 之前意外地工作,但在 0.9.9 中,由于作为 #3248 一部分的不相关更改而不再工作。请注意,这是在 INSERT 之后、SELECT 之前呈现的 WITH 子句;在 INSERT、UPDATE、DELETE 的顶层呈现 CTE 的完整功能是针对更高版本的新特性。

    此更改也向后移植到:0.9.10

    参考链接:#3418

postgresql

  • [postgresql] [bug] [pypy]

    修复了一些与 pypy psycopg2cffi 方言相关的类型和测试问题,特别是当前的 2.7.0 版本不原生支持 JSONB 类型。psycopg2 特性的版本检测已调整为 psycopg2cffi 的特定子版本。此外,已为 psycopg2cffi 下的整个 psycopg2 特性系列启用了测试覆盖率。

    参考链接:#3439

mssql

  • [mssql] [bug]

    为 MSSQL 方言添加了一个新的方言标志 legacy_schema_aliasing,当设置为 False 时,将禁用一个非常旧且过时的行为,即编译器尝试将所有模式限定的表名转换为别名,以解决旧的且不再可定位的问题,即 SQL 服务器在所有情况下都无法解析多部分标识符名称。此行为阻止了更复杂的语句正常工作,包括那些使用提示的语句,以及嵌入相关 SELECT 语句的 CRUD 语句。与其继续修复该功能以使其与更复杂的语句一起工作,不如直接禁用它,因为它对于任何现代 SQL 服务器版本都不再需要。对于 1.0.x 系列,该标志默认为 True,使当前行为在此版本系列中保持不变。在 1.1 系列中,它将默认为 False。对于 1.0 系列,当未显式设置为任一值时,当在语句中首次使用模式限定的表时,会发出警告,建议对于所有现代 SQL Server 版本,将该标志设置为 False。

    另请参阅

    旧模式架构

    参考链接:#3424, #3430

其他

  • [feature] [ext]

    添加了对传递 *args 到 baked query 初始可调用对象的支持,与 BakedQuery.add_criteria()BakedQuery.with_criteria() 方法支持 *args 的方式相同。初始 PR 由 Naoki INADA 提供。

  • [feature] [ext]

    MutableBase 添加了一个新的半公开方法 MutableBase._get_listen_keys()。在 MutableBase 子类需要为与可变类型关联的键以外的属性键传播事件的情况下,拦截 InstanceEvents.refresh()InstanceEvents.refresh_flush() 事件时,需要重写此方法。当前的例子是使用 MutableComposite 的组合类型。

    参考链接:#3427

  • [bug] [ext]

    修复了 #3167 的错误修复导致 sqlalchemy.ext.mutable 扩展中的回归,其中属性和验证事件不再在 flush 过程中调用。在列级 Python 端默认值负责在 INSERT 或 UPDATE 时生成新值,或者当从 “eager defaults” 模式的 RETURNING 子句中获取值时,可变扩展依赖于此行为。新值在填充时不会受到任何事件的影响,并且可变扩展无法建立适当的强制转换或历史记录监听。添加了一个新的事件 InstanceEvents.refresh_flush(),可变扩展现在为此用例使用了该事件。

    参考链接:#3427

1.0.4

发布日期:2015 年 5 月 7 日

orm

  • [orm] [bug]

    修复了意外使用回归,在关系的 primaryjoin 涉及与不可哈希类型(如 HSTORE)比较的奇怪情况下,由于对语句参数的哈希定向检查,延迟加载将失败,这是 1.0 中由于 #3061 而修改的,并在 #3368 中修改为在比 “load on pending” 更常见的情况下发生。现在预先检查这些值是否具有 __hash__ 属性。

    参考链接:#3416

  • [orm] [bug]

    放宽了作为 #3347 一部分添加的断言,以防止在使用 innerjoin=True 的连接 eager 加载中拼接内部连接时出现未知情况;如果某些连接使用 “secondary” 表,则断言需要解包更进一步的连接才能通过。

    参考链接:#3347, #3412

  • [orm] [bug]

    修复/添加到测试中更多表达式,这些表达式报告在使用添加到 Query.column_descriptions 的新 ‘entity’ 键值时失败,再次重新设计发现 “from” 子句的逻辑,以适应来自别名类的列,并在这些情况下报告 “aliased” 标志的正确值。

    参考链接:#3320, #3409

schema

  • [schema] [bug]

    修复了 #3341 中引入的增强约束附加逻辑中的错误,在约束同时引用 Column 对象和字符串列名的不寻常情况下,将跳过自动附加到列的逻辑;为了在这种情况下自动附加约束,所有列都必须预先在目标表上组装好。在迁移文档中添加了一个关于原始功能以及此更改的新章节。

    参考链接:#3411

tests

  • [tests] [bug] [pypy]

    修复了一个阻止 “pypy setup.py test” 正确工作的导入错误。

    此更改也向后移植到:0.9.10

    参考链接:#3406

misc

  • [bug] [ext]

    修复了当使用扩展属性检测系统时,当使用无效输入(碰巧也是不可弱引用的,例如整数)调用 class_mapper() 时,不会引发正确异常的错误。

    此更改也向后移植到:0.9.10

    参考链接:#3408

1.0.3

发布日期:2015 年 4 月 30 日

orm

  • [orm] [bug] [pypy]

    修复了由于 #3349 导致的 0.9.10 版本之前的回归,其中对 Query.update()Query.delete() 的查询状态检查将空元组与自身使用 is 进行比较,这在 PyPy 上会失败,在这种情况下产生 True;这将在 0.9 中错误地发出警告,并在 1.0 中引发异常。

    参考链接:#3405

  • [orm] [bug]

    修复了由于 0.9.10 版本之前的回归,其中 Query.column_descriptions 访问器中新添加的 entity,如果目标实体是从核心 selectable(如 TableCTE 对象)生成,则会失败。

    参考链接:#3320, #3403

  • [orm] [bug]

    修复了 flush 过程中的回归,当属性设置为 UPDATE 的 SQL 表达式时,并且当 SQL 表达式与属性的先前值进行比较时,会产生 ==!= 以外的 SQL 比较,将引发异常 “Boolean value of this clause is not defined”。修复确保了工作单元不会以这种方式解释 SQL 表达式。

    参考链接:#3402

  • [orm] [bug]

    修复了由于 #2992 导致的意外使用回归,其中与连接 eager 加载结合使用的文本元素放置在 Query.order_by() 子句中,当连接 eager 加载需要将查询包装在子查询中以适应 limit/offset 时,将以它们被假定为表绑定列名的方式添加到内部查询的 columns 子句中。

    最初,这里的行为是故意的,例如 query(User).order_by('name').limit(1) 这样的查询将按 user.name 排序,即使查询被连接 eager 加载修改为在子查询中,因为 'name' 将被解释为要在 FROM 子句中定位的符号,在本例中为 User.name,然后将其复制到 columns 子句中以确保它存在于 ORDER BY 中。但是,该功能未能预料到 order_by("name") 指的是本地 columns 子句中已存在的特定标签名称,而不是绑定到 FROM 子句中的 selectable 的名称的情况。

    除此之外,该功能对于已弃用的情况(例如 order_by("name desc"))也失败,虽然它发出警告,提示此处应使用 text()(请注意,问题不影响显式使用 text() 的情况),但仍然会产生与以前不同的查询,其中 “name desc” 表达式被不适当地复制到 columns 子句中。解决方案是,“连接 eager 加载” 功能将跳过这些所谓的 “标签引用” 表达式,在增强内部 columns 子句时,就像它们已经是 text() 构造一样。

    参考链接:#3392

  • [orm] [bug]

    修复了关于 MapperEvents.instrument_class() 事件的回归,其中它的调用被移动到类管理器检测类之后,这与事件文档明确声明的相反。切换的基本原理是由于 Declarative 采取了在映射类之前为类设置完整的 “检测管理器” 的步骤,目的是为了 改进声明式 mixin,@declared_attr 和相关功能 中描述的新 @declared_attr 功能,但此更改也针对 Mapper 的经典用法进行了,以保持一致性。但是,SQLSoup 依赖于检测事件在经典映射下的任何检测之前发生。在经典映射和声明式映射的情况下,行为被恢复,后者通过使用简单的 memoization 而不使用类管理器来实现。

    参考链接:#3388

  • [orm] [bug]

    修复了新 QueryEvents.before_compile() 事件中的问题,其中在事件中对 Query 对象的要加载的实体集合所做的更改将在 SQL 中呈现,但不会在加载过程中反映出来。

    参考链接:#3387

engine

  • [engine] [feature]

    添加了新功能以支持具有高级功能的引擎/连接池插件。在检出的连接包装器以及 _ConnectionRecord 级别,为连接池添加了新的 “soft invalidate” 功能。这与现代连接池失效类似,因为连接不会被主动关闭,而是在下次检出时才会被回收;这本质上是该功能的每个连接版本。添加了一个新的事件 PoolEvents.soft_invalidate() 以补充它。

    还添加了新的标志 ExceptionContext.invalidate_pool_on_disconnect。允许 ConnectionEvents.handle_error() 中的错误处理程序维护 “disconnect” 条件,但在事件中以特定方式处理对单个连接调用 invalidate 的情况。

    参考链接:#3379

  • [engine] [feature]

    添加了新的事件 do_connect,允许拦截/替换何时调用 Dialect.connect() 钩子来创建 DBAPI 连接。还添加了方言插件钩子 Dialect.get_dialect_cls()Dialect.engine_created(),允许外部插件使用入口点向现有方言添加事件。

    参考链接:#3355

sql

  • [sql] [feature]

    添加了一个占位符方法 TypeEngine.compare_against_backend(),Alembic 迁移从 0.7.6 版本开始使用该方法。用户定义的类型可以实现此方法,以协助比较类型与从数据库反射的类型。

  • [sql] [bug]

    修复了 SQL 中长标签的截断可能产生与另一个未截断的标签重叠的标签的错误;这是因为截断的长度阈值大于截断后标签的剩余部分。这两个值现在已设置为相同;label_length - 6。这里的效果是,较短的列标签将被 “截断”,而之前它们不会被截断。

    参考链接:#3396

  • [sql] [bug]

    修复了由于 #3282 导致的回归,其中作为关键字参数传递给 DDLEvents.before_create(), DDLEvents.after_create(), DDLEvents.before_drop(), 和 DDLEvents.after_drop() 事件的 tables 集合不再是表列表,而是包含第二个条目的元组列表,其中包含要添加或删除的外键。由于 tables 集合虽然文档中说明不一定稳定,但已被依赖,因此此更改被认为是回归。此外,在某些 “drop” 的情况下,此集合将是一个迭代器,如果过早迭代,将导致操作失败。现在,该集合在所有情况下都是表对象的列表,并且现在添加了对此集合格式的测试覆盖率。

    参考链接:#3391

misc

  • [bug] [ext]

    修复了关联代理中的错误,其中在 relationship->标量非对象属性比较上的 any()/has() 将失败,例如 filter(Parent.some_collection_to_attribute.any(Child.attr == 'foo'))

    参考链接:#3397

1.0.2

发布日期:2015 年 4 月 24 日

orm declarative

  • [orm] [declarative] [bug]

    修复了关于声明式 __declare_first____declare_last__ 访问器的意外使用回归,其中这些访问器不再在声明式基类的超类上调用。

    参考链接:#3383

sql

  • [sql] [bug]

    修复了在 1.0.0b4 中错误修复的回归(因此变成了两个回归);报告称 SELECT 语句将按标签名称进行 GROUP BY 并失败,错误地理解为某些后端(如 SQL Server)根本不应在简单标签名称上发出 ORDER BY 或 GROUP BY;而实际上,我们忘记了 0.9 已经在所有后端对简单标签名称发出 ORDER BY,如 标签构造现在可以在 ORDER BY 中仅呈现其名称 中所述,即使 1.0 包含作为 #2992 一部分对此逻辑的重写。至于对简单标签发出 GROUP BY,即使 PostgreSQL 也有些情况会引发错误,即使要分组的标签应该是明显的,因此很明显 GROUP BY 永远不应以这种方式自动呈现。

    在 1.0.2 中,SQL Server、Firebird 和其他数据库将再次在简单标签名称上发出 ORDER BY,当传递一个 Label 构造时,该构造也存在于 columns 子句中。此外,当传递一个 Label 构造时,没有后端会仅针对简单标签名称发出 GROUP BY。

    参考链接:#3338, #3385

1.0.1

发布日期:2015 年 4 月 23 日

orm

  • [orm] [bug]

    修复了 query(B).filter(B.a != A(id=7)) 形式的查询在给定瞬态对象时会呈现 NEVER_SET 符号的问题。对于持久对象,它总是使用持久化的数据库值,而不是当前设置的值。假设启用了 autoflush,这通常对于持久值来说并不明显,因为在任何情况下,任何待处理的更改都会首先被 flush。但是,这与用于非否定比较 query(B).filter(B.a == A(id=7)) 的逻辑不一致,后者确实使用了当前值,并且还允许与瞬态对象进行比较。比较现在使用当前值,而不是数据库持久化的值。

    与作为此版本中由 #3061 引起的回归修复的其他 NEVER_SET 问题不同,此特定问题至少在 0.8 版本甚至更早版本中就已存在,但是它是作为修复相关的 NEVER_SET 问题的结果而发现的。

    参考链接:#3374

  • [orm] [bug]

    修复了由 #3061 引起的意外使用回归,其中 NEVER_SET 符号可能泄漏到面向关系的查询中,包括 filter()with_parent() 查询。在所有情况下都返回 None 符号,但是这些查询中的许多查询在任何情况下都从未得到正确支持,并且产生与 NULL 的比较,而没有使用 IS 运算符。因此,还为当前不提供 IS NULL 的关系查询子集添加了警告。

    参考链接:#3371

  • [orm] [bug]

    修复了由 #3061 引起的回归,其中 NEVER_SET 符号可能泄漏到延迟加载查询中,这是在 flush 待处理对象之后发生的。这通常发生在不使用简单 “get” 策略的多对一关系中。好消息是,修复提高了相对于 0.9 的效率,因为当检测到参数中存在 NEVER_SET 符号时,我们现在可以完全跳过 SELECT 语句;在 #3061 之前,我们无法辨别这里的 None 是否已设置。

    参考链接:#3368

engine

  • [engine] [bug]

    将字符串值 "none" 添加到 Pool.reset_on_return 参数接受的值中,作为 None 的同义词,以便字符串值可以用于所有设置,从而允许像 engine_from_config() 这样的实用程序可以无问题地使用。

    此更改也向后移植到:0.9.10

    参考链接:#3375

sql

  • [sql] [bug]

    修复了直接 SELECT EXISTS 查询无法将 Boolean 的正确结果类型分配给结果映射,而是会将查询中的列类型泄漏到结果映射中的问题。此问题在 0.9 及更早版本中也存在,但是在这些版本中的影响较小。在 1.0 中,由于 #918,这成为一个回归,因为我们现在依赖于结果映射非常准确,否则我们可能会将结果类型处理器分配给错误的列。在所有版本中,此问题还会导致简单的 EXISTS 不会应用 Boolean 类型处理程序,从而导致没有本机布尔值的后端使用简单的 1/0 值,而不是 True/False。修复包括 EXISTS 列参数将像其他列表达式一样进行匿名标记;对于纯布尔表达式(如 not_(True())),也实现了类似的修复。

    参考链接:#3372

sqlite

  • [sqlite] [bug]

    修复了由于 #3282 导致的回归,由于我们尝试在创建/删除模式时假设 ALTER 的可用性,在 SQLite 的情况下,我们在创建和删除表时只是说完全不用担心外键。这意味着在 SQLite 的情况下,基本上跳过了表的排序,对于绝大多数 SQLite 用例来说,这不是问题。

    但是,在 SQLite 上对包含数据且启用了引用完整性的表执行 DROP 的用户将遇到错误,因为当这些表包含数据时,依赖关系排序在 DROP 与强制约束的情况下 *确实* 很重要(SQLite 仍然很乐意让你创建指向不存在表的外键,并在启用约束的情况下删除引用现有表的表,只要没有被引用的数据)。

    为了在保持 #3282 新功能的同时,仍然允许 SQLite DROP 操作保持排序,我们现在在充分考虑 FK 的情况下进行排序,并且如果我们遇到无法解决的循环依赖,*才* 放弃尝试对表进行排序;我们改为发出警告并使用未排序的列表。如果环境既需要有序的 DROP *又* 具有外键循环,则警告指出他们将需要将 use_alter 标志恢复到他们的 ForeignKeyForeignKeyConstraint 对象,以便仅将这些对象从依赖关系排序中省略。

    另请参阅

    ForeignKeyConstraint 上的 use_alter 标志(通常)不再需要 - 包含关于 SQLite 的更新说明。

    参考链接:#3378

misc

  • [bug] [firebird]

    修复了由于 #3034 导致的回归问题,该问题导致 Firebird 方言无法正确解析 limit/offset 子句。感谢 effem-git 提供的 Pull request。

    参考链接: #3380

  • [bug] [firebird]

    修复了在 Firebird 中使用 limit/offset 时对 “literal_binds” 模式的支持,以便在选择此模式时再次内联渲染这些值。与 #3034 相关。

    参考链接: #3381

1.0.0

发布日期: 2015年4月16日

orm

  • [orm] [feature]

    添加了新的参数 Query.update.update_args,允许将诸如 mysql_limit 之类的 kw 参数传递给底层的 Update 构造器。感谢 Amir Sadoughi 提供的 Pull request。

  • [orm] [bug]

    发现了一个在处理多次 Query.join() 到同一目标时的不一致性;仅在关系连接的情况下隐式地去重,并且由于 #3233,在 1.0 版本中,两次连接到同一表的行为与 0.9 版本不同,因为它不再错误地创建别名。为了帮助记录此更改,迁移说明中关于 #3233 的措辞已被通用化,并且当 Query.join() 被调用多次针对同一目标关系时,已添加警告。

    参考链接: #3367

  • [orm] [bug]

    对关系的启发式方法进行了一项小的改进,当使用半自引用(例如,两个连接的 inh 子类相互引用)、非简单的连接条件确定远程端时,会考虑 parententity,并可以减少对使用 remote() 注解的需求;这可以恢复一些在 0.9.4 之前可能在没有注解的情况下通过 #2948 工作的情况。

    参考链接: #3364

sql

  • [sql] [feature]

    用于排序 Table 对象并可通过 MetaData.sorted_tables 集合访问的拓扑排序现在将产生确定性排序;也就是说,对于具有特定名称和依赖关系的一组表,每次都产生相同的排序。这有助于比较 DDL 脚本和其他用例。表在发送到拓扑排序时按名称排序,并且拓扑排序本身将以有序的方式处理传入的数据。感谢 Sebastian Bank 提供的 Pull request。

    参考链接: #3084

  • [sql] [bug]

    修复了使用命名约定 MetaData 对象无法与 pickle 正确工作的问题。该属性被跳过,导致如果反序列化的 MetaData 对象用于创建其他表,则会导致不一致和失败。

    此更改也向后移植到:0.9.10

    参考链接: #3362

postgresql

  • [postgresql] [bug]

    修复了一个长期存在的 bug,即当 Enum 类型与 psycopg2 方言结合使用非 ASCII 值和 native_enum=False 时,将无法正确解码返回结果。这源于 PG ENUM 类型曾经是一个没有 “非原生” 选项的独立类型。

    此更改也向后移植到:0.9.10

    参考链接: #3354

mssql

  • [mssql] [bug]

    修复了一个回归问题,即 “最后插入的 id” 机制在主键值在执行前的 insert 参数中存在的情况下,以及在来自 SELECT 的 INSERT 将目标列声明为列对象而不是字符串键的情况下,无法为 MSSQL 存储正确的值。

    参考链接: #3360

  • [mssql] [bug]

    现在使用 pymssql 中提供的 Binary 构造器,而不是修补一个。感谢 Ramiro Morales 提供的 Pull request。

tests

  • [tests] [bug]

    修复了测试运行时使用的路径;对于 sqla_nose.py 和 py.test,只有在 sys.flags.no_user_site 未设置时,才会再次将 “./lib” 前缀插入到 sys.path 的头部;这使其行为就像 Python 默认将 “.” 放在当前路径中一样。对于 tox,我们现在设置了 PYTHONNOUSERSITE 标志。

    参考链接: #3356

1.0.0b5

发布日期: 2015年4月3日

orm

  • [orm] [bug]

    修复了在多个嵌套的 Session.begin_nested() 操作中状态跟踪会失败的 bug,无法为在内部保存点内更新的对象传播 “dirty” 标志,这样如果封闭的保存点被回滚,该对象将不会成为已过期状态的一部分,因此不会恢复到其数据库状态。

    此更改也向后移植到:0.9.10

    参考链接: #3352

  • [orm] [bug]

    当使用 Query.update()Query.delete() 方法时,Query 不支持连接、子查询或特殊的 FROM 子句;如果调用了诸如 Query.join()Query.select_from() 之类的方法,则不会静默地忽略这些字段,而是会引发错误。在 0.9.10 版本中,这只会发出警告。

    参考链接: #3349

  • [orm] [bug]

    在会话的提交阶段中使用的弱字典周围添加了一个 list() 调用,如果没有它,如果垃圾回收在进程中交互,可能会导致 “dictionary changed size during iter” 错误。此更改由 #3139 引入。

  • [orm] [bug]

    修复了一个与 “嵌套” 内连接迫切加载相关的 bug,该 bug 在 0.9 版本中也存在,但在 1.0 版本中更像是一个回归,因为 #3008 默认启用 “嵌套”,这样,当一系列内/外连接混合在一起时,从共同祖先使用 innerjoin=True 跨兄弟路径的连接迫切加载将正确地将每个 “innerjoin” 兄弟节点拼接连接到适当的部分。

    参考链接: #3347

sql

  • [sql] [bug]

    放宽了 unicode 类型对非 unicode 类型发出的警告,以警告甚至不是字符串值的值,例如整数;以前,1.0 的更新警告系统使用了字符串格式化操作,这将引发内部 TypeError。虽然这些情况理想情况下应该完全引发错误,但某些后端(如 SQLite 和 MySQL)确实接受它们,并且可能被旧代码使用,更不用说如果为目标后端关闭 unicode 转换,它们将始终通过。

    参考链接: #3346

postgresql

  • [postgresql] [bug]

    修复了由于 #3184 导致的更新的 PG 索引反射会在 PostgreSQL 8.4 及更早版本上导致索引操作失败的 bug。当使用旧版本的 PostgreSQL 时,这些增强功能现在被禁用。

    参考链接: #3343

1.0.0b4

发布日期: 2015年3月29日

sql

  • [sql] [bug]

    修复了 #2992 的新 “标签解析” 功能中的 bug,其中匿名标签,然后再次使用名称标记的标签,将无法通过文本标签定位。这种情况在映射的 column_property() 在查询中被赋予显式标签时自然发生。

    参考链接: #3340

  • [sql] [bug]

    修复了 #2992 的新 “标签解析” 功能中的 bug,其中放置在语句的 order_by() 或 group_by() 中的字符串标签将更高的优先级放在 FROM 子句中找到的名称上,而不是 columns 子句中更本地可用的名称。

    参考链接: #3335

schema

mysql

  • [mysql] [bug] [pymysql]

    修复了在使用带有 unicode 参数的 “executemany” 操作时 PyMySQL 的 unicode 支持。 SQLAlchemy 现在将语句和绑定参数都作为 unicode 对象传递,因为 PyMySQL 通常在内部使用字符串插值来生成最终语句,并且在 executemany 的情况下,仅对最终语句执行 “encode” 步骤。

    此更改也向后移植到:0.9.10

    参考链接: #3337

mssql

  • [mssql] [bug] [firebird] [oracle] [sybase]

    关闭了 MSSQL、Oracle 方言的 “简单 order by” 标志;根据 #2992,此标志会导致 order by 或 group by 列子句中也存在的表达式按标签复制,即使引用为表达式对象也是如此。MSSQL 的行为现在是旧的行为,默认情况下复制整个表达式,因为 MSSQL 在这些方面可能很挑剔,尤其是在 GROUP BY 表达式中。为了安全起见,Firebird 和 Sybase 方言也关闭了该标志。

    注意

    此解决方案不正确,请参阅 1.0.2 版本以了解此解决方案的返工。

    参考链接: #3338

1.0.0b3

发布日期: 2015年3月20日

mysql

  • [mysql] [bug]

    修复了 #2771 问题的提交,该提交被意外注释掉。

    参考链接: #2771

1.0.0b2

发布日期: 2015年3月20日

orm

  • [orm] [bug]

    修复了 pullreq github:137 中意外使用回归的问题,其中 Py2K unicode 字面量 (例如 u"") 不会被 relationship.cascade 选项接受。感谢 Julien Castets 提供的 Pull request。

    参考链接: #3327

orm declarative

  • [orm] [declarative] [change]

    放宽了对 @declared_attr 对象添加的一些限制,这些限制阻止它们在声明性过程之外被调用;这与 #3150 的增强功能有关,这些功能允许 @declared_attr 返回一个基于当前类在配置时缓存的值。异常引发已被删除,并且行为已更改,以便在声明性过程之外,由 @declared_attr 修饰的函数每次都像常规 @property 一样被调用,而不使用任何缓存,因为在此阶段没有缓存可用。

    参考链接: #3331

engine

  • [engine] [bug]

    ResultProxy 的 “自动关闭” 现在是 “软” 关闭。也就是说,在使用 fetch 方法耗尽所有行后,DBAPI 游标会像以前一样被释放,并且该对象可以安全地丢弃,但是 fetch 方法可以继续被调用,它们将返回结果结束对象(fetchone 为 None,fetchmany 和 fetchall 为空列表)。只有显式调用 ResultProxy.close() 时,这些方法才会引发 “result is closed” 错误。

    参考链接: #3329, #3330

mysql

  • [mysql] [bug] [py3k]

    修复了 Py3K 上 BIT 类型没有正确使用 ord() 函数的问题。感谢 David Marin 提供的 Pull request。

    此更改也向后移植到:0.9.10

    参考链接: #3333

  • [mysql] [bug]

    修复了完全支持将 'utf8mb4' MySQL 特定字符集与 MySQL 方言(特别是 MySQL-Python 和 PyMySQL)一起使用的问题。此外,报告更不寻常字符集(如 ‘koi8u’ 或 ‘eucjpms’)的 MySQL 数据库也将正常工作。感谢 Thomas Grainger 提供的 Pull request。

    参考链接: #2771

1.0.0b1

发布日期: 2015年3月13日

版本 1.0.0b1 是 1.0 系列的第一个版本。此处描述的许多更改也存在于 0.9,有时也存在于 0.8 系列中。对于 1.0 特有的更改,重点关注兼容性问题,请参阅 SQLAlchemy 1.0 中的新功能?

general

  • [general] [feature]

    通过更大量地使用 __slots__ 用于许多内部对象,改进了结构内存使用。此优化特别针对具有大量表和列的大型应用程序的基本内存大小,并大大减少了各种高容量对象的内存大小,包括事件侦听内部组件、比较器对象以及 ORM 属性和加载器策略系统的各个部分。

  • [general] [bug]

    现在为所有那些派生为 “公共工厂” 符号的 SQL 和 ORM 函数设置了 __module__ 属性,这应有助于文档工具能够报告目标模块。

    参考链接: #3218

orm

  • [orm] [feature]

    Query.column_descriptions 返回的字典添加了一个新的条目 "entity"。这指的是表达式引用的主要 ORM 映射类或别名类。与现有的 "type" 条目相比,它将始终是一个映射实体,即使是从列表达式中提取的,如果给定的表达式是纯核心表达式,则为 None。另请参阅 #3403,它修复了此功能中的回归问题,该回归问题在 0.9.10 中未发布,但在 1.0 版本中已发布。

    此更改也向后移植到:0.9.10

    参考链接: #3320

  • [orm] [feature]

    添加了新的参数 Session.connection.execution_options,可用于在首次检出 Connection 时,在事务开始之前设置执行选项。这用于在事务开始之前在连接上设置隔离级别等选项。

    另请参阅

    设置事务隔离级别 / DBAPI 自动提交 - 新的文档部分详细介绍了使用会话设置事务隔离的最佳实践。

    此更改也向后移植到:0.9.9

    参考链接: #3296

  • [orm] [feature]

    添加了新的方法 Session.invalidate(),其功能类似于 Session.close(),但也会对所有连接调用 Connection.invalidate(),保证它们不会返回到连接池。这在某些情况下很有用,例如处理 gevent 超时,此时继续使用连接是不安全的,即使是用于回滚也是如此。

    此更改也向后移植到:0.9.9

  • [orm] [feature]

    “primaryjoin” 模型已进一步扩展,以允许严格从单个列到自身的连接条件,通过某种 SQL 函数或表达式进行转换。这有点实验性,但第一个概念验证是 “物化路径” 连接条件,其中路径字符串使用 “like” 与自身进行比较。ColumnOperators.like() 运算符也已添加到可在 primaryjoin 条件中使用的有效运算符列表中。

    此更改也向后移植到:0.9.5

    参考链接: #3029

  • [orm] [feature]

    添加了新的实用程序函数 make_transient_to_detached(),可用于制造行为类似于从会话加载然后分离的对象。不存在的属性被标记为已过期,并且可以将对象添加到会话中,在该会话中,它将像持久对象一样运行。

    此更改也向后移植到:0.9.5

    参考链接: #3017

  • [orm] [feature]

    添加了一个新的事件套件 QueryEventsQueryEvents.before_compile() 事件允许创建函数,这些函数可以在构建 SELECT 语句之前对 Query 对象进行额外的修改。希望通过新的检查系统的出现,此事件将变得更加有用,该系统将允许以自动化的方式对 Query 对象进行详细修改。

    另请参阅

    QueryEvents

    参考链接: #3317

  • [orm] [feature]

    当连接迫切加载与也具有 LIMIT、OFFSET 或 DISTINCT 的一对多查询一起使用时发生的子查询包装已禁用,对于一对一关系的情况,即 relationship.uselist 设置为 False 的一对多关系。这将在这些情况下产生更高效的查询。

    参考链接: #3249

  • [orm] [feature]

    映射状态内部组件已重新设计,以允许将与对象 “过期” 相关的调用计数减少 50%,例如 Session.commit() 的 “自动过期” 功能和 Session.expire_all() 以及在对象状态被垃圾回收时发生的 “清理” 步骤中。

    参考链接: #3307

  • [orm] [feature]

    当相同的多态标识分配给同一层次结构中的两个不同的映射器时,会发出警告。这通常是用户错误,意味着两种不同的映射类型在加载时无法正确区分。感谢 Sebastian Bank 提供的 Pull request。

    参考链接: #3262

  • [orm] [feature]

    创建了一系列新的 Session 方法,这些方法提供了直接进入工作单元工具的钩子,用于发出 INSERT 和 UPDATE 语句。如果使用得当,这种面向专家的系统可以允许使用 ORM 映射来生成批量插入和更新语句,这些语句被批量处理到 executemany 组中,从而使语句的执行速度可以与直接使用 Core 相媲美。

    另请参阅

    批量操作

    参考链接: #3100

  • [orm] [feature]

    添加了一个参数 Query.join.isouter,它与调用 Query.outerjoin() 同义;此标志的目的是提供与 Core FromClause.join() 更一致的接口。此拉取请求由 Jonathan Vanasco 友情提供。

    参考: #3217

  • [orm] [feature]

    添加了新的事件处理程序 AttributeEvents.init_collection()AttributeEvents.dispose_collection(),它们跟踪集合何时首次与实例关联以及何时被替换。这些处理程序取代了 collection.linker() 注解。旧的钩子仍然通过事件适配器支持。

  • [orm] [feature]

    Query 与映射或选项一起使用 Query.yield_per() 时,如果发生子查询急切加载或集合的连接急切加载,则会引发异常。这些加载策略目前与 yield_per 不兼容,因此通过引发此错误,该方法使用起来更安全。可以使用 lazyload('*') 选项或 Query.enable_eagerloads() 禁用急切加载。

  • [orm] [feature]

    Query 对象使用的新 KeyedTuple 实现,在获取大量面向列的行时,提供了显著的速度提升。

    参考: #3176

  • [orm] [feature]

    joinedload.innerjoin 以及 relationship.innerjoin 的行为现在是使用“嵌套”内连接,即右嵌套,作为当内连接急切加载链接到外连接急切加载时的默认行为。

    参考: #3008

  • [orm] [feature]

    UPDATE 语句现在可以在 ORM 刷新中批量处理为更高效的 executemany() 调用,类似于 INSERT 语句的批量处理方式;这将会在刷新中被调用,前提是对于相同的映射和表,后续的 UPDATE 语句在 VALUES 子句中使用相同的列,没有嵌入 SET 级别的 SQL 表达式,并且映射的版本控制要求与后端方言返回 executemany 操作正确行数的能力兼容。

  • [orm] [feature]

    info 参数已添加到 SynonymPropertyComparableProperty 的构造函数中。

    参考: #2963

  • [orm] [feature]

    InspectionAttr.info 集合现在已向下移动到 InspectionAttr,除了在所有 MapperProperty 对象上可用之外,现在还可以在混合属性、关联代理上使用,当通过 Mapper.all_orm_descriptors 访问时。

    参考: #2971

  • [orm] [change]

    标记为延迟但没有显式取消延迟的映射属性,即使它们的列以某种方式出现在结果集中,现在仍将保持“延迟”状态。这是一种性能增强,因为 ORM 加载不再花费时间在获取结果集时搜索每个延迟列。但是,对于一直依赖此行为的应用程序,现在应使用显式的 undefer() 或类似选项。

  • [orm] [changed]

    传递给自定义 Bundle 类的 create_row_processor() 方法的 proc() 可调用对象现在仅接受单个“row”参数。

  • [orm] [changed]

    已删除已弃用的事件钩子:populate_instance, create_instance, translate_row, append_result

  • [orm] [bug]

    修复了子查询急切加载中的错误,其中多态子类边界上的长链急切加载与多态加载结合使用时,将无法在链中找到子类链接,并因 AliasedClass 上缺少属性名称而报错。

    此更改也向后移植到:0.9.5、0.8.7

    参考: #3055

  • [orm] [bug]

    修复了 ORM 错误,其中 class_mapper() 函数会屏蔽由于用户错误而在映射器配置期间应引发的 AttributeError 或 KeyError。对属性/键错误的捕获已变得更加具体,不包括配置步骤。

    此更改也向后移植到:0.9.5、0.8.7

    参考: #3047

  • [orm] [bug]

    修复了 ORM 对象比较中的错误,其中如果源是别名类,或者如果查询需要由于别名连接或多态查询而对表达式应用特殊别名,则多对一 != None 的比较将失败;还修复了在查询需要由于别名连接或多态查询而对表达式应用特殊别名的情况下,将多对一与对象状态进行比较将失败的错误。

    此更改也向后移植到:0.9.9

    参考: #3310

  • [orm] [bug]

    修复了在 Sessionafter_rollback() 处理程序不正确地将状态添加到该 Session 中,并且警告和删除此状态的任务(由 #2389 建立)尝试继续执行的情况下,内部断言会失败的错误。

    此更改也向后移植到:0.9.9

    参考: #3309

  • [orm] [bug]

    修复了当使用未知 kw 参数调用 Query.join() 时,由于格式错误而引发自身 TypeError 的 TypeError 错误。此拉取请求由 Malthe Borch 友情提供。

    此更改也向后移植到:0.9.9

  • [orm] [bug]

    修复了延迟加载 SQL 构造中的错误,其中在自引用连接的“指向自身的列”样式中多次引用同一个“本地”列的复杂 primaryjoin 在所有情况下都不会被替换。此处确定替换的逻辑已被重新设计为更开放。

    此更改也向后移植到:0.9.9

    参考: #3300

  • [orm] [bug]

    “通配符”加载器选项,特别是 load_only() 选项设置的用于覆盖所有未明确提及的属性的选项,现在考虑了给定实体的超类(如果该实体使用继承映射进行映射),以便超类中的属性名称也从加载中省略。此外,多态鉴别器列无条件地包含在列表中,就像主键列一样,以便即使设置了 load_only(),子类型的多态加载也能继续正常工作。

    此更改也向后移植到:0.9.9

    参考: #3287

  • [orm] [bug] [pypy]

    修复了在 Query 开始时(在获取结果之前,尤其是在无法形成行处理器时)抛出异常的情况下,游标将保持打开状态并挂起结果,而实际上并未关闭的错误。这通常仅在像 PyPy 这样的解释器上才是一个问题,在 PyPy 中,游标不会立即被 GC,并且在某些情况下可能导致事务/锁保持打开状态的时间比预期的要长。

    此更改也向后移植到:0.9.9

    参考: #3285

  • [orm] [bug]

    修复了在不支持且强烈不推荐的用例中发生的泄漏,即多次替换固定映射类上的关系,引用任意数量增长的目标映射器。当旧关系被替换时,会发出警告,但是如果映射已用于查询,则旧关系仍将在某些注册表中被引用。

    此更改也向后移植到:0.9.9

    参考: #3251

  • [orm] [bug] [sqlite]

    修复了表达式突变相关的错误,当在针对 SQLite 查询时,使用 Query 从多个匿名列实体中选择时,可能会表现为“Could not locate column”错误,这是 SQLite 方言使用的“连接重写”功能的副作用。

    此更改也向后移植到:0.9.9

    参考: #3241

  • [orm] [bug]

    修复了 Query.join()Query.outerjoin() 到使用 of_type() 的单继承子类的 ON 子句,如果设置了 from_joinpoint=True 标志,则不会渲染 ON 子句中的“单表条件”的错误。

    此更改也向后移植到:0.9.9

    参考: #3232

  • [orm] [bug] [engine]

    修复了通常与 #3199 的事件类别相同的错误,当使用 named=True 参数时。某些事件将无法注册,而另一些事件将无法正确调用事件参数,通常发生在事件以某种其他方式“包装”以进行适配的情况下。“named”机制已被重新安排为不干扰内部包装函数期望的参数签名。

    此更改也向后移植到:0.9.8

    参考: #3197

  • [orm] [bug]

    修复了影响许多事件类别的错误,特别是 ORM 事件以及引擎事件,其中对于那些侦听器函数被包装的事件,使用相同参数冗余调用 listen() 的常用逻辑“去重”将失败。registry.py 中会遇到断言。此断言现在已集成到去重检查中,并额外提供了一种更简单的方法来全面检查去重。

    此更改也向后移植到:0.9.8

    参考: #3199

  • [orm] [bug]

    修复了当复杂的自引用 primaryjoin 包含函数,同时指定了 remote_side 时,会发出警告的错误;该警告会建议设置“remote side”。现在仅当 remote_side 不存在时才会发出。

    此更改也向后移植到:0.9.8

    参考: #3194

  • [orm] [bug] [eagerloading]

    修复了由 0.9.4 中发布的 #2976 引起的回归,其中沿着连接急切加载链的“外连接”传播将错误地将兄弟连接路径上的“内连接”也转换为外连接,而只有后代路径才应该接收“外连接”传播;此外,还修复了相关的错误,其中“嵌套”连接传播将在两个兄弟连接路径之间不适当地发生。

    此更改也向后移植到:0.9.7

    参考: #3131

  • [orm] [bug]

    修复了由于 #2736 导致的 0.9.0 版本中的回归,其中 Query.select_from() 方法不再正确设置 Query 对象的“from entity”,因此后续的 Query.filter_by()Query.join() 调用在按字符串名称搜索属性时将无法检查适当的“from”实体。

    此更改也向后移植到:0.9.7

    参考: #2736, #3083

  • [orm] [bug]

    修复了在保存点块中持久化、删除或主键更改的项目在外部事务回滚后,将不会恢复到其先前状态(不在会话中,在会话中,先前的 PK)的错误。

    此更改也向后移植到:0.9.7

    参考: #3108

  • [orm] [bug]

    修复了子查询急切加载与 with_polymorphic() 结合使用时的错误,子查询加载中实体和列的定位对于这种类型的实体和其他实体已变得更加准确。

    此更改也向后移植到:0.9.7

    参考: #3106

  • [orm] [bug]

    对于继承映射器隐式地将其基于列的属性之一与父映射器的属性组合,而这些列通常不一定共享相同值的情况,已添加了额外的检查。这是通过 #1892 添加的现有检查的扩展;但是,此新检查仅发出警告,而不是异常,以允许可能依赖于现有行为的应用程序。

    此更改也向后移植到:0.9.5

    参考: #3042

  • [orm] [bug]

    修改了 load_only() 的行为,使得主键列始终添加到要“取消延迟”的列列表中;否则,ORM 无法加载行的身份。显然,可以延迟映射的主键,并且 ORM 将会失败,但这尚未更改。但是,由于 load_only 本质上是说“延迟除 X 之外的所有内容”,因此主键列不应成为此延迟的一部分更为关键。

    此更改也向后移植到:0.9.5

    参考: #3080

  • [orm] [bug]

    修复了在所谓的“行切换”场景中出现的一些边缘情况,其中 INSERT/DELETE 可以转换为 UPDATE。在这种情况下,设置为 None 的多对一关系,或者在某些情况下设置为 None 的标量属性,可能不会被检测为值的净变化,因此 UPDATE 不会重置先前行上的内容。这是由于属性历史记录在隐式地假设 None 对于先前未设置的属性而言实际上不是“更改”方面的一些尚未解决的副作用。另请参阅 #3061

    注意

    此更改已在 0.9.6 中回滚。完整的修复将在 SQLAlchemy 1.0 版本中。

    此更改也向后移植到:0.9.5

    参考: #3060

  • [orm] [bug]

    #3060 相关,对工作单元进行了调整,使得在要删除的自引用对象图的情况下,相关多对一对象的加载稍微更具侵略性;相关对象的加载是为了在未设置 passive_deletes 时帮助确定正确的删除顺序。

    此更改也向后移植到:0.9.5

  • [orm] [bug]

    修复了 SQLite 连接重写中的错误,其中由于重复而匿名化的列名在子查询中无法正确重写。这将影响任何类型的子查询 + 连接的 SELECT 查询。

    此更改也向后移植到:0.9.5

    参考: #3057

  • [orm] [bug] [sql]

    修复了 #2804 中新增强的布尔强制转换中的错误,其中“where”和“having”的新规则对于 select() 构造的“whereclause”和“having” kw 参数不起作用,这也是 Query 使用的,因此在 ORM 中也无法正常工作。

    此更改也向后移植到:0.9.5

    参考: #3013

  • [orm] [bug]

    修复了会话附加错误“对象已附加到会话 X”未能阻止对象也附加到新会话的错误,在错误引发后继续执行的情况下。

    参考: #3301

  • [orm] [bug]

    Query 的主 Mapper 现在在调用 Query.count(), Query.update(), Query.delete() 以及针对映射列、column_property 对象以及从映射列派生的 SQL 函数和表达式的查询时,传递给 Session.get_bind() 方法。这允许依赖于自定义 Session.get_bind() 方案或“绑定”元数据的会话在所有相关情况下工作。

    参考: #1326, #3227, #3242

  • [orm] [bug]

    PropComparator.of_type() 修饰符已与加载器指令(例如 joinedload()contains_eager())结合使用进行了改进,这样如果遇到同一基本类型/路径的两个 PropComparator.of_type() 修饰符,它们将被合并为一个“多态”实体,而不是用类型 B 的实体替换类型 A 的实体。例如,A.b.of_type(BSub1)->BSub1.c 的 joinedload 与 A.b.of_type(BSub2)->BSub2.c 的 joinedload 组合将创建一个 A.b.of_type((BSub1, BSub2)) -> BSub1.c, BSub2.c 的单个 joinedload,而无需在查询中显式使用 with_polymorphic

    另请参阅

    多态子类型的急切加载 - 包含一个更新的示例,说明了新格式。

    参考: #3256

  • [orm] [bug]

    修复了 copy.deepcopy() 调用在被 CascadeOptions 参数使用时的支持,如果 copy.deepcopy()relationship() 一起使用(不是官方支持的用例),则会发生这种情况。此拉取请求由 duesenfranz 友情提供。

  • [orm] [bug]

    修复了 Session.expunge() 在对象已刷新但未提交的删除操作时,不会完全分离给定对象的错误。这也会影响诸如 make_transient() 之类的相关操作。

    参考: #3139

  • [orm] [bug]

    在多个最终将填充外键列的关系与另一个关系冲突的情况下,会发出警告,其中关系尝试从不同的源列复制值。这种情况发生在复合外键与重叠列映射到每个引用不同引用列的关系时。新的文档部分说明了该示例,以及如何通过在每个关系的基础上专门指定“foreign”列来克服该问题。

    另请参阅

    重叠的外键

    参考: #3230

  • [orm] [bug]

    Query.update() 方法现在会将给定值字典中的字符串键名转换为针对正在更新的映射类的映射属性名称。以前,字符串名称是直接接收并传递给核心更新语句的,而没有任何针对映射实体解析的方法。Query.update() 的主题属性也支持同义词和混合属性。

    参考: #3228

  • [orm] [bug]

    改进了 Session 用于查找“绑定”(例如要使用的引擎)的机制,此类引擎可以与 mixin 类、具体子类以及更广泛的表元数据(例如连接继承表)关联。

    参考: #3035

  • [orm] [bug]

    修复了单表继承中的一个 bug,该 bug 导致当连接链多次包含相同的单表继承实体时(通常这会引发错误),在某些情况下,取决于“从”什么地方进行连接,可能会隐式地为第二个单表继承实体创建别名,从而生成一个“有效”的查询。但是,由于这种隐式别名在单表继承的情况下并非预期行为,因此它实际上并没有“完全有效”,并且非常具有误导性,因为它并非总是出现。

    参考链接: #3233

  • [orm] [bug]

    现在,当使用 Query.join(), Query.outerjoin(), 或独立的 join() / outerjoin() 函数连接到单表继承子类时,即使 ON 子句是手动编写的,渲染后的 ON 子句现在也会包含“单表条件”;现在它会使用 AND 添加到条件中,就像使用 relationship 或类似方式连接到单表目标一样。

    这有点介于功能和 bug 之间。

    参考链接: #3222

  • [orm] [bug]

    对表达式标签的行为进行了重大重构,特别是当与具有自定义 SQL 表达式的 ColumnProperty 构造以及 0.9 中首次引入的“order by labels”逻辑结合使用时。修复包括 order_by(Entity.some_col_prop) 现在即使 Entity 已经通过继承渲染或使用 aliased() 构造进行了别名化,也会使用“order by label”规则;多次渲染具有别名的相同列属性(例如 query(Entity.some_prop, entity_alias.some_prop))将为实体的每次出现标记一个不同的标签,并且“order by label”规则也适用于两者(例如 order_by(Entity.some_prop, entity_alias.some_prop))。此外,还修复了可能阻止 0.9 中的“order by label”逻辑工作的其他问题,最值得注意的是,Label 的状态可能会发生变化,从而导致“order by label”停止工作,具体取决于事物的调用方式。

    参考链接: #3148, #3188

  • [orm] [bug]

    更改了使用 Query.from_self() 或其常用用户 Query.count() 时应用“单表继承条件”的方法。现在,将行限制为特定类型的条件在内部子查询中指示,而不是在外部子查询中,这样即使“类型”列在 columns 子句中不可用,我们也可以在“内部”查询中对其进行过滤。

    参考链接: #3177

  • [orm] [bug]

    对延迟加载的机制进行了一个小的调整,使其更少机会干扰 joinload(),在对象指向自身的极少数情况下;在这种情况下,对象在加载其属性时引用自身,这可能导致加载器之间的混淆。“对象指向自身”的用例未完全支持,但此修复程序也消除了一些开销,因此目前是测试的一部分。

    参考链接: #3145

  • [orm] [bug]

    “resurrect” ORM 事件已被删除。自从 0.8 中删除了旧的“mutable attribute”系统以来,此事件钩子没有任何用途。

    参考链接: #3171

  • [orm] [bug]

    修复了当属性“set”事件或带有 @validates 的列作为“fetch and populate”操作的目标时(例如自增主键、Python 端默认值或通过 RETURNING “急切”获取的服务器端默认值),事件会在 flush 进程中触发的 bug。

    参考链接: #3167

  • [orm] [bug] [py3k]

    Session.identity_map 公开的 IdentityMap 现在在 Py3K 中为 items()values() 返回列表。此处早期移植到 Py3K 时,这些返回的是迭代器,而从技术上讲它们应该是“可迭代视图”……目前,列表是可以的。

  • [orm] [bug]

    query.update()/delete() 的“evaluator”不适用于多表更新,需要设置为 synchronize_session=Falsesynchronize_session='fetch';现在会引发异常,并显示一条消息来更改同步设置。这是从 0.9.7 版本开始发出的警告升级而来的。

    参考链接: #3117

  • [orm] [enhancement]

    调整了属性机制,关于何时通过首次访问将值隐式初始化为 None;此操作一直导致属性的填充,但现在不再这样做;返回 None 值,但底层属性未收到 set 事件。这与集合的工作方式一致,并允许属性机制的行为更加一致;特别是,获取没有值的属性不会阻止在实际将值设置为 None 时应继续的事件。

    其中绑定参数根据编译时选项以内联字符串形式呈现。此功能的开发归功于 Dobes Vandermeer。

    参考链接: #3061

orm declarative

examples

  • [examples] [feature]

    添加了一个新示例,演示了物化路径,使用了最新的 relationship 功能。示例由 Jack Zhou 提供。

    此更改也向后移植到:0.9.5

  • [examples] [feature]

    一套新的示例,专门用于详细研究 SQLAlchemy ORM 和 Core 以及 DBAPI 的性能,从多个角度进行分析。该套件在容器内运行,该容器提供内置的性能分析显示,既可以通过控制台输出,也可以通过 RunSnake 工具以图形方式显示。

    另请参阅

    性能

  • [examples] [bug]

    更新了 使用历史表的版本控制 示例,以便重新映射映射列以匹配列名和列的分组;特别是,这允许在同名列的连接继承场景中显式分组的列以相同的方式在历史映射中进行映射,从而避免了 0.9 系列中添加的关于此模式的警告,并允许相同的属性键视图。

    此更改也向后移植到:0.9.9

  • [examples] [bug]

    修复了 examples/generic_associations/discriminator_on_association.py 示例中的一个 bug,其中 AddressAssociation 的子类未被映射为“单表继承”,导致在进一步使用映射时出现问题。

    此更改也向后移植到:0.9.9

engine

  • [engine] [feature]

    添加了新的用户空间访问器,用于查看事务隔离级别; Connection.get_isolation_level(), Connection.default_isolation_level

    此更改也向后移植到:0.9.9

  • [engine] [feature]

    添加了新的事件 ConnectionEvents.handle_error(),这是一个功能更全面、更完善的 ConnectionEvents.dbapi_error() 替代方案。

    此更改也向后移植到:0.9.7

    参考链接: #3076

  • [engine] [feature]

    可以发出一种新的警告样式,它将“过滤”最多 N 次参数化字符串的出现。这允许参数化警告(可以引用其参数)传递固定次数,直到允许 Python 警告过滤器抑制它们,并防止内存在 Python 的警告注册表中无限增长。

    参考链接: #3178

  • [engine] [bug]

    修复了 Connection 和连接池中的 bug,其中 Connection.invalidate() 方法或由于数据库断开连接导致的失效,如果 isolation_level 参数已与 Connection.execution_options() 一起使用,则会失败;重置隔离级别的“finalizer”将在不再打开的连接上调用。

    此更改也向后移植到:0.9.9

    参考链接: #3302

  • [engine] [bug]

    如果在 Transaction 正在进行时,将 isolation_level 参数与 Connection.execution_options() 一起使用,则会发出警告; DBAPI 和/或 SQLAlchemy 方言(如 psycopg2、MySQLdb)可能会隐式回滚或提交事务,或者在下一个事务之前不更改设置,因此这绝不安全。

    此更改也向后移植到:0.9.9

    参考链接: #3296

  • [engine] [bug]

    通过 create_engine.execution_optionsEngine.update_execution_options() 传递给 Engine 的执行选项不会传递给用于在“首次连接”事件中初始化方言的特殊 Connection;方言通常在此阶段执行自己的查询,并且此处不应应用任何当前的可用选项。特别是,“autocommit”选项导致在此初始连接中尝试自动提交,这将因 Connection 的非标准状态而导致 AttributeError 失败。

    此更改也向后移植到:0.9.8

    参考链接: #3200

  • [engine] [bug]

    用于确定 INSERT 或 UPDATE 受影响列的字符串键现在在它们贡献于“compiled cache”缓存键时进行排序。这些键以前不是确定性排序的,这意味着相同的语句可能会在等效键上多次缓存,从而在内存和性能方面都造成损失。

    此更改也向后移植到:0.9.8

    参考链接: #3165

  • [engine] [bug]

    修复了当引擎首次连接并执行其初始检查时发生 DBAPI 异常,并且该异常不是断开连接异常,但当我们尝试关闭游标时游标引发错误时会发生的 bug。在这种情况下,当我们尝试通过连接池记录游标关闭异常并失败时,真正的异常将被压制,因为我们尝试以不适当的方式在此非常特定的场景中访问池的记录器。

    此更改也向后移植到:0.9.5

    参考链接: #3063

  • [engine] [bug]

    修复了一些检测到的“双重失效”情况,其中连接失效可能发生在像 connection.close() 这样的已处于临界区的部分内;最终,这些情况是由 #2907 中的更改引起的,因为“返回时重置”功能会调用 Connection/Transaction 来处理它,其中可能会捕获“断开连接检测”。但是,#2985 中最近的更改可能使其更容易被发现,因为“连接失效”操作速度更快,因为该问题在 0.9.4 上比 0.9.3 更容易重现。

    现在在任何可能发生失效的部分内添加了检查,以阻止对失效连接的进一步不允许的操作。这包括引擎级别和连接池级别的两个修复程序。虽然该问题是在高度并发的 gevent 情况下观察到的,但理论上它可能发生在任何类型的场景中,其中断开连接发生在连接关闭操作中。

    此更改也向后移植到:0.9.5

    参考链接: #3043

  • [engine] [bug]

    引擎级别的错误处理和包装例程现在将在所有引擎连接用例中生效,包括当用户自定义的连接例程通过 create_engine.creator 参数使用时,以及当 Connection 在重新验证时遇到连接错误时。

    参考链接: #3266

  • [engine] [bug]

    在事件本身正在运行时(无论是从侦听器内部还是从并发线程),同时删除(或添加)事件侦听器,现在会引发 RuntimeError,因为使用的集合现在是 collections.deque() 的实例,并且不支持在迭代时进行更改。以前,使用普通的 Python 列表,从事件内部删除会导致静默失败。

    参考链接: #3163

sql

  • [sql] [feature]

    稍微放宽了 Index 的约定,即您可以将 text() 表达式指定为目标;如果索引要手动添加到表中,无论是通过内联声明还是通过 Table.append_constraint() 添加,则索引不再需要存在表绑定的列。

    此更改也向后移植到:0.9.5

    参考链接: #3028

  • [sql] [feature]

    添加了新的标志 between.symmetric,当设置为 True 时,呈现“BETWEEN SYMMETRIC”。还添加了一个新的否定运算符“notbetween_op”,现在允许像 ~col.between(x, y) 这样的表达式呈现为“col NOT BETWEEN x AND y”,而不是带括号的 NOT 字符串。

    此更改也向后移植到:0.9.5

    参考链接: #2990

  • [sql] [feature]

    SQL 编译器现在生成预期列的映射,以便它们按位置而不是按名称与接收到的结果集匹配。最初,这被视为一种处理返回的列名难以预测的情况的方法,尽管在现代使用中,这个问题已通过匿名标记得到克服。在此版本中,该方法基本上将每个结果的函数调用计数减少了几十次调用,对于更大的结果列集则更多。如果编译的列集与接收到的列集之间存在任何大小差异,该方法仍然会退化为旧方法的现代版本,因此对于部分或完全文本编译场景,这些列表可能不一致,因此不存在问题。

    参考链接: #918

  • [sql] [feature]

    DefaultClause 中的文字值(在使用 Column.server_default 参数时调用)现在将使用“内联”编译器呈现,以便它们按原样呈现,而不是作为绑定参数。

    参考链接: #3087

  • [sql] [feature]

    当传递给 SQL 表达式单元的对象无法解释为 SQL 片段时,会报告表达式的类型;拉取请求由 Ryan P. Kelly 提供。

  • [sql] [feature]

    Table.tometadata() 方法添加了一个新参数 Table.tometadata.name。与 Table.tometadata.schema 类似,此参数使新复制的 Table 采用新名称而不是现有名称。它增加的一个有趣功能是将 Table 对象复制到相同MetaData 目标,并使用新名称。拉取请求由 n.d. parker 提供。

  • [sql] [feature]

    异常消息已得到一些改进。如果 SQL 语句和参数为 None,则不会显示,从而减少了与语句无关的错误消息的混乱。显示 DBAPI 级别异常的完整模块和类名,使其清楚地表明这是一个包装的 DBAPI 异常。语句和参数本身被限定在括号部分内,以便更好地将它们与错误消息和彼此隔离。

    参考链接: #3172

  • [sql] [feature]

    Insert.from_select() 现在包括 Python 和 SQL 表达式默认值(如果未另行指定);非服务器列默认值未包含在 INSERT FROM SELECT 中的限制现已解除,这些表达式将作为常量呈现到 SELECT 语句中。

  • [sql] [feature]

    The UniqueConstraint 构造现在包含在反射 Table 对象时,适用于支持此功能的数据库。 为了在充分的精度下实现这一点,MySQL 和 PostgreSQL 现在包含了修正索引和唯一约束重复的功能,当反射表、索引和约束时。 在 MySQL 的情况下,实际上并没有独立于“唯一索引”概念的“唯一约束”概念,因此对于此后端,UniqueConstraint 继续保持在反射的 Table 中不出现。 对于 PostgreSQL,用于检测 pg_index 的索引的查询已得到改进,以检查 pg_constraint 中的相同构造,并且隐式构造的唯一索引不包含在反射的 Table 中。

    在这两种情况下,Inspector.get_indexes()Inspector.get_unique_constraints() 方法都分别返回这两种构造,但在 PostgreSQL 的情况下包含一个新的令牌 duplicates_constraint,或者在 MySQL 的情况下包含 duplicates_index,以指示何时检测到这种情况。 此拉取请求由 Johannes Erdfelt 提供。

    参考链接: #3184

  • [sql] [feature]

    添加了新的方法 Select.with_statement_hint() 和 ORM 方法 Query.with_statement_hint(),以支持非特定于表的语句级提示。

    参考链接: #3206

  • [sql] [feature]

    info 参数已作为构造函数参数添加到所有模式构造中,包括 MetaData, Index, ForeignKey, ForeignKeyConstraint, UniqueConstraint, PrimaryKeyConstraint, CheckConstraint

    参考: #2963

  • [sql] [feature]

    Table.autoload_with 标志现在意味着 Table.autoload 应该为 True。 此拉取请求由 Malik Diarra 提供。

    参考链接: #3027

  • [sql] [feature]

    Select.limit()Select.offset() 方法现在除了接受整数值作为参数外,还接受任何 SQL 表达式。 通常,这用于允许传递绑定参数,该参数稍后可以替换为值,从而允许在 Python 端缓存 SQL 查询。 此处的实现与现有的第三方方言完全向后兼容,但是那些实现特殊 LIMIT/OFFSET 系统的方言将需要修改才能利用新功能。 Limit 和 offset 也支持 “literal_binds” 模式,

    参考链接: #3034

  • [sql] [changed]

    column()table() 构造现在可以从 “from sqlalchemy” 命名空间导入,就像每个其他的 Core 构造一样。

  • [sql] [changed]

    当传递给 select() 的大多数构建器方法以及 Query 时,将字符串隐式转换为 text() 构造现在会发出警告,并只发送纯字符串。 文本转换仍然正常进行。 唯一接受字符串而没有警告的方法是 “label reference” 方法,如 order_by(), group_by(); 这些函数现在将在编译时尝试将单个字符串参数解析为 selectable 中存在的列或标签表达式; 如果未找到,表达式仍然会渲染,但您会再次收到警告。 这里的理由是,从字符串到文本的隐式转换现在比过去更出乎意料,并且最好是用户在传递原始字符串时向 Core / ORM 发送更多方向,以说明应采取什么方向。 Core/ORM 教程已更新,以更深入地介绍如何处理文本。

    参考链接: #2992

  • [sql] [bug]

    修复了 Enum 和其他 SchemaType 子类中的错误,其中将类型与 MetaData 直接关联会导致在 MetaData 上发出事件(如创建事件)时挂起。

    此更改也 backported 到: 0.9.7, 0.8.7

    参考链接: #3124

  • [sql] [bug]

    修复了自定义运算符加 TypeEngine.with_variant() 系统中的一个错误,其中将 TypeDecorator 与 variant 结合使用时,当使用比较运算符时会失败并出现 MRO 错误。

    此更改也 backported 到: 0.9.7, 0.8.7

    参考链接: #3102

  • [sql] [bug]

    修复了 INSERT..FROM SELECT 构造中的错误,其中从 UNION 中选择会将 union 包装在一个匿名(例如,未标记的)子查询中。

    此更改也向后移植到:0.9.5、0.8.7

    参考链接: #3044

  • [sql] [bug]

    修复了当应用空的 and_()or_() 或其他空白表达式时,Table.update()Table.delete() 会产生一个空的 WHERE 子句的错误。 现在这与 select() 的行为一致。

    此更改也向后移植到:0.9.5、0.8.7

    参考链接: #3045

  • [sql] [bug]

    native_enum 标志添加到 Enum__repr__() 输出中,这在使用 Alembic autogenerate 时尤为重要。 此拉取请求由 Dimitris Theodorou 提供。

    此更改也向后移植到:0.9.9

  • [sql] [bug]

    修复了当使用一个 TypeDecorator 实现的类型也是一个 TypeDecorator 时,当对使用此类型的对象使用任何类型的 SQL 比较表达式时,会失败并出现 Python 的 “Cannot create a consistent method resolution order (MRO)” 错误。

    此更改也向后移植到:0.9.9

    参考链接: #3278

  • [sql] [bug]

    修复了 INSERT 中嵌入的 SELECT 中的列,无论是通过 values 子句还是作为 “from select”,都会污染 RETURNING 子句产生的 result set 中使用的列类型的问题,当来自两个语句的列共享相同的名称时,会导致潜在的错误或在检索返回行时出现误适配。

    此更改也向后移植到:0.9.9

    参考链接: #3248

  • [sql] [bug]

    修复了 sql 包中相当多的 SQL 元素无法成功 __repr__() 的错误,原因是缺少 description 属性,然后当内部 AttributeError 然后重新调用 __repr__() 时,将调用递归溢出。

    此更改也向后移植到:0.9.8

    参考链接: #3195

  • [sql] [bug]

    对表/索引反射的调整,这样如果索引报告的列未在表中找到,则会发出警告并跳过该列。 这可能会发生在某些特殊的系统列情况下,如在 Oracle 中观察到的那样。

    此更改也向后移植到:0.9.8

    参考链接: #3180

  • [sql] [bug]

    修复了 CTE 中的错误,其中 literal_binds 编译器参数在语句中一个 CTE 引用另一个别名 CTE 时,不会总是正确传播。

    此更改也向后移植到:0.9.8

    参考链接: #3154

  • [sql] [bug]

    修复了 0.9.7 回归,该回归由 #3067 与一个命名错误的单元测试结合引起,因此所谓的 “schema” 类型,如 BooleanEnum,可能不再被 pickle 序列化。

    此更改也向后移植到:0.9.8

    参考链接: #3067, #3144

  • [sql] [bug]

    修复了命名约定功能中的错误,其中使用包含 constraint_name 的检查约束约定会强制所有 BooleanEnum 类型也需要名称,因为这些类型隐式地创建了一个约束,即使最终目标后端是不需要生成约束的后端,例如 PostgreSQL。 这些特定约束的命名约定机制已重新组织,以便在 DDL 编译时而不是在约束/表构造时完成命名确定。

    此更改也向后移植到:0.9.7

    参考链接: #3067

  • [sql] [bug]

    修复了公用表表达式中的错误,其中当 CTE 以某种方式嵌套时,位置绑定参数可能会以错误的最终顺序表达。

    此更改也向后移植到:0.9.7

    参考链接: #3090

  • [sql] [bug]

    修复了多值 Insert 构造未能检查给定文字 SQL 表达式的第一个值条目之后的后续值条目的错误。

    此更改也向后移植到:0.9.7

    参考链接: #3069

  • [sql] [bug]

    为 Python 版本 < 2.6.5 添加了一个 “str()” 步骤到 dialect_kwargs 迭代中,以解决 “no unicode keyword arg” 错误,因为这些参数在某些反射过程中作为关键字参数传递。

    此更改也向后移植到:0.9.7

    参考链接: #3123

  • [sql] [bug]

    TypeEngine.with_variant() 方法现在将接受一个类型类作为参数,该参数在内部转换为实例,使用与其他构造(如 Column)长期建立的约定相同。

    此更改也向后移植到:0.9.7

    参考链接: #3122

  • [sql] [bug]

    Column 在该表的显式 PrimaryKeyConstraint 中引用时,Column.nullable 标志隐式设置为 False。 此行为现在与当 Column 本身将 Column.primary_key 标志设置为 True 时的行为相匹配,这旨在成为完全等效的情况。

    此更改也向后移植到:0.9.5

    参考链接: #3023

  • [sql] [bug]

    修复了在自定义 Comparator 实现中,Operators.__and__(), Operators.__or__()Operators.__invert__() 运算符重载方法无法被覆盖的错误。

    此更改也向后移植到:0.9.5

    参考链接: #3012

  • [sql] [bug]

    修复了新的 DialectKWArgs.argument_for() 方法中的错误,其中为以前未包含任何特殊参数的构造添加参数将失败。

    此更改也向后移植到:0.9.5

    参考链接: #3024

  • [sql] [bug]

    修复了 0.9 中引入的回归,其中来自 #1068 的新 “ORDER BY <labelname>” 功能不会将引号规则应用于 ORDER BY 中渲染的标签名称。

    此更改也向后移植到:0.9.5

    参考链接: #1068, #3020

  • [sql] [bug]

    恢复了 Functionsqlalchemy.sql.expression 导入命名空间的导入,该导入在 0.9 的开头被删除。

    此更改也向后移植到:0.9.5

  • [sql] [bug]

    Insert.values() 的多值版本已修复,以便在使用具有 Python 端默认值和/或函数以及服务器端默认值的表时更加有用。 该功能现在可以与使用 “positional” 参数的方言一起使用; Python 可调用对象也将为每一行单独调用,就像 “executemany” 样式调用一样; 服务器端默认列将不再隐式接收为第一行显式指定的值,而是拒绝在没有显式值的情况下调用。

    参考链接: #3288

  • [sql] [bug]

    修复了 Table.tometadata() 方法中的错误,其中与 BooleanEnum 类型对象关联的 CheckConstraint 将在目标表中加倍。 复制过程现在将此约束对象的生成跟踪为类型对象的本地对象。

    参考链接: #3260

  • [sql] [bug]

    ForeignKeyConstraint.columns 集合的行为约定已变得一致; 此属性现在是一个 ColumnCollection,就像所有其他约束一样,并且在约束与 Table 关联时初始化。

    参考链接: #3243

  • [sql] [bug]

    Column.key 属性现在用作表达式中匿名绑定参数名称的来源,以匹配在 INSERT 或 UPDATE 语句中呈现时将此值用作键的现有用法。 这允许 Column.key 用作 “substitute” 字符串,以解决难以转换为绑定参数名称的列名。 请注意,paramstyle 在任何情况下都可在 create_engine() 上配置,并且当今大多数 DBAPI 都支持命名和位置样式。

    参考链接: #3245

  • [sql] [bug]

    修复了传递给 PoolEvents.reset.dbapi_connection 参数的名称,特别是这影响了此事件的 “named” 参数样式的用法。 此拉取请求由 Jason Goldberger 提供。

  • [sql] [bug]

    撤消了 0.9 中所做的更改,null(), true()false() “常量” 的 “singleton” 性质已恢复。 这些函数返回 “singleton” 对象的效果是,不同的实例将被视为相同,而不管词法使用情况如何,这尤其会影响 SELECT 语句的 columns 子句的渲染。

    参考文献: #3170

  • [sql] [bug] [engine]

    修复了当调用 Connection.connect() 时获得的“分支”连接不会与父连接共享失效状态的错误。分支连接的架构已进行了一些调整,以便分支连接将所有失效状态和操作都推迟到父连接处理。

    参考文献: #3215

  • [sql] [bug] [engine]

    修复了当调用 Connection.connect() 时获得的“分支”连接不会与父连接共享事务状态的错误。分支连接的架构已进行了一些调整,以便分支连接将所有事务状态和操作都推迟到父连接处理。

    参考文献: #3190

  • [sql] [bug]

    现在使用 Insert.from_select() 意味着在 insert() 上使用 inline=True。这有助于修复一个错误,该错误会导致 INSERT…FROM SELECT 结构在支持返回的后端上被错误地编译为“隐式返回”,这会在插入零行的情况下导致中断(因为隐式返回期望返回一行),以及在插入多行的情况下导致任意返回数据(例如,仅返回多行中的第一行)。类似的更改也应用于具有多个参数集的 INSERT..VALUES;隐式 RETURNING 也不会再为此语句发出。由于这两种结构都处理可变数量的行,因此 ResultProxy.inserted_primary_key 访问器不适用。之前,文档中有一个注释,建议对于 INSERT..FROM SELECT 最好使用 inline=True,因为某些数据库不支持返回,因此无法进行“隐式”返回,但无论如何,INSERT…FROM SELECT 都不需要隐式返回。如果需要返回插入的数据,则应使用常规的显式 Insert.returning() 来返回可变数量的结果行。

    参考文献: #3169

  • [sql] [enhancement]

    自定义方言如果实现了 GenericTypeCompiler,现在可以被构造为使其 visit 方法接收到拥有表达式对象的指示(如果有的话)。任何接受关键字参数的 visit 方法(例如 **kw)在大多数情况下都会接收到一个关键字参数 type_expression,它指向类型所属的表达式对象。对于 DDL 中的列,方言的 compiler 类可能还需要修改其 get_column_specification() 方法以支持此功能。UserDefinedType.get_col_spec() 方法如果在其参数签名中提供了 **kw,也将接收 type_expression

    参考文献: #3074

schema

postgresql

  • [postgresql] [feature]

    为 PostgreSQL 索引添加了对 CONCURRENTLY 关键字的支持,可以使用 postgresql_concurrently 进行设置。感谢 Iuri de Silvio 提供的 pull request。

    此更改也向后移植到:0.9.9

  • [postgresql] [feature] [pg8000]

    为 pg8000 驱动程序添加了“合理的多行计数”支持,这主要适用于在 ORM 中使用版本控制的情况。此功能基于正在使用的 pg8000 1.9.14 或更高版本进行版本检测。感谢 Tony Locke 提供的 pull request。

    此更改也向后移植到:0.9.8

  • [postgresql] [feature]

    ColumnOperators.match() 运算符添加了关键字参数 postgresql_regconfig,允许为发出的 to_tsquery() 函数指定 “reg config” 参数。感谢 Jonathan Vanasco 提供的 pull request。

    此更改也向后移植到:0.9.7

    参考文献: #3078

  • [postgresql] [feature]

    通过 JSONB 添加了对 PostgreSQL JSONB 的支持。感谢 Damian Dimmich 提供的 pull request。

    此更改也向后移植到:0.9.7

  • [postgresql] [feature]

    在使用 pg8000 DBAPI 时,添加了对 AUTOCOMMIT 隔离级别的支持。感谢 Tony Locke 提供的 pull request。

    此更改也向后移植到:0.9.5

  • [postgresql] [feature]

    为 PostgreSQL ARRAY 类型添加了一个新的标志 ARRAY.zero_indexes。当设置为 True 时,在传递给数据库之前,所有数组索引值都将加 1,从而实现 Python 风格的从零开始的索引和 PostgreSQL 的从一开始的索引之间更好的互操作性。感谢 Alexey Terentev 提供的 pull request。

    此更改也向后移植到:0.9.5

    参考文献: #2785

  • [postgresql] [feature]

    PG8000 方言现在支持 create_engine.encoding 参数,通过在连接上设置客户端编码,然后由 pg8000 拦截。感谢 Tony Locke 提供的 pull request。

  • [postgresql] [feature]

    添加了对 PG8000 原生 JSONB 功能的支持。感谢 Tony Locke 提供的 pull request。

  • [postgresql] [feature] [pypy]

    在 pypy 上添加了对 psycopg2cffi DBAPI 的支持。感谢 shauns 提供的 pull request。

    参考文献: #3052

  • [postgresql] [feature]

    添加了对应用于聚合函数的 FILTER 关键字的支持,PostgreSQL 9.4 支持此关键字。感谢 Ilja Everilä 提供的 pull request。

  • [postgresql] [feature]

    添加了对物化视图和外表的反射支持,以及对 Inspector.get_view_names() 中物化视图的支持,以及在 PostgreSQL 版本的 Inspector 上可用的新方法 PGInspector.get_foreign_table_names()。感谢 Rodrigo Menezes 提供的 pull request。

    参考文献: #2891

  • [postgresql] [feature]

    在使用 Table 构造渲染 DDL 时,添加了对 PG 表选项 TABLESPACE、ON COMMIT、WITH(OUT) OIDS 和 INHERITS 的支持。感谢 malikdiarra 提供的 pull request。

    另请参阅

    PostgreSQL 表选项

    参考文献: #2051

  • [postgresql] [feature]

    添加了新方法 PGInspector.get_enums(),当使用 PostgreSQL 的 inspector 时,将提供 ENUM 类型的列表。感谢 Ilya Pekelny 提供的 pull request。

  • [postgresql] [bug]

    为 PG HSTORE 类型添加了 hashable=False 标志,这是为了允许 ORM 在请求混合列/实体列表时跳过尝试“哈希”ORM 映射的 HSTORE 列。感谢 Gunnlaugur Þór Briem 提供的补丁。

    此更改也向后移植到:0.9.5、0.8.7

    参考文献: #3053

  • [postgresql] [bug]

    添加了一个新的“断开连接”消息“connection has been closed unexpectedly”(连接已意外关闭)。这似乎与较新版本的 SSL 有关。感谢 Antti Haapala 提供的 pull request。

    此更改也向后移植到:0.9.5、0.8.7

  • [postgresql] [bug]

    修复了在使用 psycopg2 时对 PostgreSQL UUID 类型结合 ARRAY 类型的支持。psycopg2 方言现在使用 psycopg2.extras.register_uuid() 钩子,以便 UUID 值始终作为 UUID() 对象在 DBAPI 之间传递。 UUID.as_uuid 标志仍然有效,但对于 psycopg2,当禁用此标志时,我们需要将返回的 UUID 对象转换回字符串。

    此更改也向后移植到:0.9.9

    参考文献: #2940

  • [postgresql] [bug]

    添加了对使用 psycopg2 2.5.4 或更高版本时的 postgresql.JSONB 数据类型的支持,该版本具有 JSONB 数据的原生转换,因此必须禁用 SQLAlchemy 的转换器;此外,新添加的 psycopg2 扩展 extras.register_default_jsonb 用于建立传递给方言的 JSON 反序列化器,通过 json_deserializer 参数。还修复了 PostgreSQL 集成测试,这些测试实际上并没有往返 JSONB 类型,而不是 JSON 类型。感谢 Mateusz Susik 提供的 pull request。

    此更改也向后移植到:0.9.9

  • [postgresql] [bug]

    修复了在使用旧版本 psycopg2 < 2.4.3 时使用 “array_oid” 标志注册 HSTORE 类型的问题,旧版本不支持此标志,以及在使用用户定义的 json_deserializer 在 psycopg2 版本 < 2.5 上使用原生 json 序列化器钩子 “register_default_json” 的问题,旧版本不包含原生 json。

    此更改也向后移植到:0.9.9

  • [postgresql] [bug]

    修复了 PostgreSQL 方言在 Index 中渲染不直接对应于表绑定列的表达式时会失败的错误;通常当 text() 构造是索引中的表达式之一时;或者如果其中一个或多个表达式是此类表达式,则可能会错误地解释表达式列表。

    此更改也向后移植到:0.9.9

    参考文献: #3174

  • [postgresql] [bug]

    重新审视了在 0.9.5 中首次修补的此问题,显然 psycopg2 的 .closed 访问器不如我们假设的那么可靠,因此我们在检测是否为断开连接场景时添加了对异常消息 “SSL SYSCALL error: Bad file descriptor” 和 “SSL SYSCALL error: EOF detected” 的显式检查。我们将继续将 psycopg2 的 connection.closed 作为第一道检查。

    此更改也向后移植到:0.9.8

    参考文献: #3021

  • [postgresql] [bug]

    修复了 PostgreSQL JSON 类型无法持久化或渲染 SQL NULL 列值,而是 JSON 编码的 'null' 的错误。为了支持这种情况,更改如下:

    • 现在可以指定值 null(),这将始终导致语句中产生 NULL 值。

    • 添加了一个新的参数 JSON.none_as_null,当为 True 时,表示 Python None 值应持久化为 SQL NULL,而不是 JSON 编码的 'null'

    对于 psycopg2 以外的 DBAPI(即 pg8000),也修复了将 NULL 作为 None 检索的问题。

    此更改也向后移植到:0.9.8

    参考文献: #3159

  • [postgresql] [bug]

    DBAPI 错误的异常包装系统现在可以容纳非标准的 DBAPI 异常,例如 psycopg2 TransactionRollbackError。这些异常现在将使用 sqlalchemy.exc 中最接近的可用子类引发,对于 TransactionRollbackError,将使用 sqlalchemy.exc.OperationalError

    此更改也向后移植到:0.9.8

    参考文献: #3075

  • [postgresql] [bug]

    修复了 array 对象中与纯 Python 列表比较时无法使用正确的数组构造函数的错误。感谢 Andrew 提供的 pull request。

    此更改也向后移植到:0.9.8

    参考文献: #3141

  • [postgresql] [bug]

    为函数(例如 func 构造)添加了受支持的 FunctionElement.alias() 方法。以前,此方法的行为未定义。当前行为模仿 pre-0.9.4,即将函数转换为具有给定别名名称的单列 FROM 子句,其中列本身是匿名命名的。

    此更改也向后移植到:0.9.8

    参考文献: #3137

  • [postgresql] [bug] [pg8000]

    修复了 0.9.5 版本中引入的 pg8000 隔离级别新功能导致的引擎级别隔离级别参数在连接时会引发错误的错误。

    此更改也向后移植到:0.9.7

    参考文献: #3134

  • [postgresql] [bug]

    现在在确定异常是否为“断开连接”错误时,会咨询 psycopg2 的 .closed 访问器;理想情况下,这应该消除对异常消息进行任何其他检查以检测断开连接的需求,但是我们将保留那些现有的消息作为后备。这应该能够处理较新的情况,例如 “SSL EOF” 条件。感谢 Dirk Mueller 提供的 pull request。

    此更改也向后移植到:0.9.5

    参考文献: #3021

  • [postgresql] [bug]

    当调用普通的 table.drop() 时,PostgreSQL ENUM 类型将发出 DROP TYPE 指令,假设该对象未直接与 MetaData 对象关联。为了适应在多个表之间共享枚举类型的使用场景,该类型应直接与 MetaData 对象关联;在这种情况下,该类型将仅在元数据级别或直接创建时创建。PostgreSQL 枚举类型的创建/删除规则已在总体上进行了高度的重新设计。

    参考文献: #3319

  • [postgresql] [bug]

    当 schema 名称为 None 时,PGDialect.has_table() 方法现在将针对 pg_catalog.pg_table_is_visible(c.oid) 进行查询,而不是测试完全的 schema 匹配;这样该方法也将说明临时表的存在。请注意,这是一个行为更改,因为 PostgreSQL 允许非临时表静默覆盖同名的现有临时表,因此这改变了 checkfirst 在这种不寻常情况下的行为。

    参考文献: #3264

  • [postgresql] [enhancement]

    为 PostgreSQL 方言添加了一个新的类型 OID。虽然 “oid” 通常是 PG 中的私有类型,在现代版本中不公开,但在某些 PG 用例中,例如大对象支持,这些类型可能会被公开,以及在一些用户报告的模式反射用例中。

    此更改也向后移植到:0.9.5

    参考文献: #3002

mysql

  • [mysql] [feature]

    MySQL 方言现在在所有情况下都渲染带有 NULL / NOT NULL 的 TIMESTAMP,以便启用 explicit_defaults_for_timestamp 标志的 MySQL 5.6.6 在 nullable=False 时可以继续按预期工作。现有应用程序不受影响,因为对于 nullable=True 的 TIMESTAMP 列,SQLAlchemy 始终发出 NULL。

    参考文献: #3155

  • [mysql] [feature]

    在 Python 2 下,为 MySQLdb 和 Pymysql 更新了 “supports_unicode_statements” 标志为 True。这指的是 SQL 语句本身,而不是参数,并影响诸如使用非 ASCII 字符的表名和列名之类的问题。这些驱动程序在现代版本中似乎都无问题地支持 Python 2 Unicode 对象。

    参考文献: #3121

  • [mysql] [change]

    gaerdbms 方言不再必要,并发出弃用警告。Google 现在建议直接使用 MySQLdb 方言。

    此更改也向后移植到:0.9.9

    参考文献: #3275

  • [mysql] [bug]

    MySQL 错误 2014 “commands out of sync”(命令不同步)在现代 MySQL-Python 版本中似乎作为 ProgrammingError 而不是 OperationalError 引发;所有经过测试的 “is disconnect”(是否断开连接)的 MySQL 错误代码现在都在 OperationalError 和 ProgrammingError 中进行检查,无论如何。

    此更改也 backported 到: 0.9.7, 0.8.7

    参考文献: #3101

  • [mysql] [bug]

    修复了添加到索引的 mysql_length 参数中的列名需要具有相同的引号才能被识别的错误。此修复使引号成为可选,但也为使用此变通方法的人提供了向后兼容性的旧行为。

    此更改也向后移植到:0.9.5、0.8.7

    参考文献: #3085

  • [mysql] [bug]

    添加了对反射表的支持,其中索引包含使用等号的 KEY_BLOCK_SIZE。感谢 Sean McGivern 提供的 pull request。

    此更改也向后移植到:0.9.5、0.8.7

  • [mysql] [bug]

    为 MySQLdb 方言添加了版本检查,以处理 ‘utf8_bin’ 校对的检查,因为这在 MySQL 服务器 < 5.0 版本中会失败。

    此更改也向后移植到:0.9.9

    参考链接: #3274

  • [mysql] [bug] [mysqlconnector]

    从 2.0 版本开始,Mysqlconnector 可能是由于 python 3 合并的副作用,现在即使在使用 “pyformat” 绑定参数格式时,也不再期望百分号(例如,用作模运算符等)被加倍(此更改未在 Mysqlconnector 中记录)。方言现在检查 py2k 和低于 2.0 版本的 mysqlconnector,以检测模运算符是否应呈现为 %%%

    此更改也向后移植到:0.9.8

  • [mysql] [bug] [mysqlconnector]

    Unicode SQL 现在为 MySQLconnector 2.0 及更高版本传递;对于 Py2k 和 MySQL < 2.0,字符串会被编码。

    此更改也向后移植到:0.9.8

  • [mysql] [bug]

    MySQL 方言现在支持对构造为 TypeDecorator 对象的类型进行 CAST 操作。

  • [mysql] [bug]

    当在 MySQL 方言中对 MySQL 不支持 CAST 的类型使用 cast() 时,会发出警告;MySQL 仅支持对一部分数据类型进行 CAST 操作。长期以来,对于 MySQL,SQLAlchemy 只是省略了对不支持类型的 CAST 操作。虽然我们现在不想改变这一点,但我们会发出警告以表明这种情况已经发生。当 CAST 与不支持 CAST 的旧版本 MySQL (< 4) 一起使用时,也会发出警告,在这种情况下也会跳过 CAST 操作。

    参考链接: #3237

  • [mysql] [bug]

    SET 类型已进行全面修订,不再假设空字符串或包含单个空字符串值的集合实际上是包含单个空字符串值的集合;相反,默认情况下,这被视为空集。为了处理实际想要包含空白值 '' 作为合法值的 SET 的持久性,添加了一种新的按位操作模式,该模式通过 SET.retrieve_as_bitwise 标志启用,这将使用其位标志位置明确地持久化和检索值。还修复了对于不原生转换 unicode 的驱动程序配置,unicode 值的存储和检索。

    参考链接: #3283

  • [mysql] [bug]

    现在处理 ColumnOperators.match() 运算符,使其返回类型不再严格地假定为布尔值;它现在返回一个名为 MatchTypeBoolean 子类。该类型在 Python 表达式中使用时仍会产生布尔行为,但是方言可以在结果时覆盖其行为。在 MySQL 的情况下,虽然 MATCH 运算符通常在表达式中的布尔上下文中使用,但如果实际查询匹配表达式的值,则会返回浮点值;此值与 SQLAlchemy 基于 C 的布尔处理器不兼容,因此 MySQL 的结果集行为现在遵循 Float 类型的行为。还添加了一个新的运算符对象 notmatch_op,以便更好地允许方言定义匹配操作的否定。

    参考链接: #3263

  • [mysql] [bug]

    MySQL 布尔符号 “true”、“false” 再次工作。0.9 版本在 #2682 中的更改不允许 MySQL 方言在 “IS”/“IS NOT” 的上下文中使用 “true” 和 “false” 符号,但 MySQL 支持此语法,即使它没有布尔类型。MySQL 仍然是 “非原生布尔型”,但是 true()false() 符号再次生成关键字 “true” 和 “false”,因此像 column.is_(true()) 这样的表达式再次在 MySQL 上工作。

    参考链接: #3186

  • [mysql] [bug]

    MySQL 方言现在将禁用 ConnectionEvents.handle_error() 事件,使其不会为那些在内部用于检测表是否存在的语句触发。这是通过使用执行选项 skip_user_error_events 实现的,该选项在执行范围内禁用错误处理事件。这样,重写异常的用户代码无需担心 MySQL 方言或其他偶尔需要捕获 SQLAlchemy 特定异常的方言。

  • [mysql] [bug]

    将 MySQLconnector 的 “raise_on_warnings” 的默认值更改为 False。由于某些原因,它被设置为 True。“buffered” 标志不幸地必须保持为 True,因为 MySQLconnector 不允许在所有结果完全获取之前关闭游标。

    参考链接: #2515

sqlite

  • [sqlite] [feature]

    为 SQLite 添加了对部分索引(例如,带有 WHERE 子句)的支持。Pull request 由 Kai Groner 提供。

    另请参阅

    部分索引

    此更改也向后移植到:0.9.9

  • [sqlite] [feature]

    为 SQLCipher 后端添加了一个新的 SQLite 后端。此后端为使用 pysqlcipher Python 驱动程序的加密 SQLite 数据库提供支持,该驱动程序与 pysqlite 驱动程序非常相似。

    另请参阅

    pysqlcipher

    此更改也向后移植到:0.9.9

  • [sqlite] [bug]

    当从使用附加数据库文件的 UNION 中选择时,pysqlite 驱动程序在 cursor.description 中将列名报告为 ‘dbname.tablename.colname’,而不是通常用于 UNION 的 ‘tablename.colname’(注意,对于两者,它都应该是 ‘colname’,但我们绕过了它)。此处的列转换逻辑已调整为检索最右边的标记,而不是第二个标记,因此它在两种情况下都有效。解决方法由 Tony Roberts 提供。

    此更改也向后移植到:0.9.8

    参考链接: #3211

  • [sqlite] [bug]

    修复了一个 SQLite join 重写问题,其中嵌入为标量子查询的子查询(例如在 IN 中)将从封闭查询接收不适当的替换,如果子查询内部存在与封闭查询中相同的表,例如在连接继承场景中。

    此更改也向后移植到:0.9.7

    参考链接: #3130

  • [sqlite] [bug]

    现在,SQLite 上完全反映了 UNIQUE 和 FOREIGN KEY 约束,无论是否命名。以前,外键名称被忽略,未命名的唯一约束被跳过。感谢 Jon Nelson 的协助。

    参考链接: #3244, #3261

  • [sqlite] [bug]

    SQLite 方言在使用 DATETIMEDATETIME 类型,并给定一个仅呈现数字的 storage_format 时,将在 DDL 中将类型呈现为 DATE_CHARTIME_CHARDATETIME_CHAR,以便尽管值中缺少字母字符,但列仍然会传递 “文本亲和性”。通常,这是不需要的,因为默认存储格式中的文本值已经暗示了文本。

    另请参阅

    日期和时间类型

    参考链接: #3257

  • [sqlite] [bug]

    SQLite 现在支持从临时表反射唯一约束;以前,这会因 TypeError 而失败。Pull request 由 Johannes Erdfelt 提供。

    另请参阅

    SQLite/Oracle 具有用于临时表/视图名称报告的不同方法 - 关于 SQLite 临时表和视图反射的更改。

    参考链接: #3203

  • [sqlite] [bug]

    添加了 Inspector.get_temp_table_names()Inspector.get_temp_view_names();目前,只有 SQLite 和 Oracle 方言支持这些方法。临时表和视图名称的返回已从 SQLite 和 Oracle 版本的 Inspector.get_table_names()Inspector.get_view_names()移除;其他数据库后端无法支持此信息(例如 MySQL),并且操作范围不同,因为表可以是会话本地的,并且通常在远程模式中不受支持。

    参考链接: #3204

mssql

  • [mssql] [feature]

    为 SQL Server 2008 启用了 “多值插入”。Pull request 由 Albert Cervin 提供。还扩展了对 “IDENTITY INSERT” 模式的检查,以包括标识键是否存在于语句的 VALUE 子句中。

    此更改也向后移植到:0.9.7

  • [mssql] [feature]

    SQL Server 2012 现在推荐使用 VARCHAR(max)、NVARCHAR(max)、VARBINARY(max) 用于大型文本/二进制类型。MSSQL 方言现在将基于版本检测以及新的 deprecate_large_types 标志来遵循此建议。

    参考链接: #3039

  • [mssql] [changed]

    当使用 pyodbc 时,基于主机名的 SQL Server 连接格式将不再指定默认的 “驱动程序名称”,如果缺少驱动程序名称,则会发出警告。SQL Server 的最佳驱动程序名称经常更改并且是特定于平台的,因此基于主机名的连接需要指定驱动程序名称。首选基于 DSN 的连接。

    参考链接: #3182

  • [mssql] [bug]

    为 “SET IDENTITY_INSERT” 语句添加了语句编码,这些语句在显式 INSERT 被插入到 IDENTITY 列中时操作,以支持在 pyodbc + unix + py2k 等不支持 unicode 语句的驱动程序上使用非 ASCII 表标识符。

    此更改也 backported 到: 0.9.7, 0.8.7

  • [mssql] [bug]

    在 SQL Server pyodbc 方言中,修复了 description_encoding 方言参数的实现,当未显式设置时,该参数会阻止在结果集中包含其他编码的名称的情况下正确解析 cursor.description。将来应该不需要此参数。

    此更改也 backported 到: 0.9.7, 0.8.7

    参考链接: #3091

  • [mssql] [bug]

    修复了 pymssql 方言中的版本字符串检测,以使其与 Microsoft SQL Azure 兼容,后者将 “SQL Server” 一词更改为 “SQL Azure”。

    此更改也向后移植到:0.9.8

    参考链接: #3151

  • [mssql] [bug]

    修改了用于确定当前默认模式名称的查询,以使用 database_principal_id() 函数与 sys.database_principals 视图结合使用,以便我们可以独立于正在进行的登录类型(例如,SQL Server、Windows 等)确定默认模式。

    此更改也向后移植到:0.9.5

    参考链接: #3025

oracle

  • [oracle] [feature]

    通过将 ?service_name=<name> 传递给 URL,添加了对 cx_oracle 连接到特定服务名称(而不是 tns 名称)的支持。Pull request 由 Sławomir Ehlert 提供。

  • [oracle] [feature]

    用于表和索引的新 Oracle DDL 功能:COMPRESS、BITMAP。补丁由 Gabor Gombas 提供。

  • [oracle] [feature]

    添加了对 Oracle 下 CTE 的支持。这包括对别名语法的一些调整,以及一个新的 CTE 功能 CTE.suffix_with(),这对于向 CTE 添加特定于 Oracle 的指令很有用。

    参考链接: #3220

  • [oracle] [feature]

    添加了对 Oracle 表选项 ON COMMIT 的支持。

  • [oracle] [bug]

    修复了 Oracle 方言中长期存在的错误,即以数字开头的绑定参数名称不会被引用,因为 Oracle 不喜欢绑定参数名称中的数字。

    此更改也向后移植到:0.9.8

    参考链接: #2138

  • [oracle] [bug] [tests]

    修复了 oracle 方言测试套件中的错误,其中在一个测试中,假定数据库 URL 中存在 ‘username’,即使情况可能并非如此。

    此更改也向后移植到:0.9.7

    参考链接: #3128

  • [oracle] [bug]

    当在 Select.with_hint() 方法中使用 %(name)s 令牌引用别名名称时,别名名称将被正确引用。以前,Oracle 后端没有实现此引用。

tests

  • [tests] [bug]

    修复了 “python setup.py test” 没有适当调用 distutils 的错误,并且会在测试套件结束时发出错误。

    此更改也向后移植到:0.9.7

  • [tests] [bug] [py3k]

    更正了一些涉及 imp 模块和 Python 3.3 或更高版本的弃用警告(在运行测试时)。Pull request 由 Matt Chisholm 提供。

    此更改也向后移植到:0.9.5

    参考链接: #2830

misc

  • [feature] [ext]

    添加了一个新的扩展套件 sqlalchemy.ext.baked。这个简单但不寻常的系统可以在构建和处理 orm Query 对象时,从查询构建到字符串 SQL 语句的呈现,显著节省 Python 开销。

    参考链接: #3054

  • [feature] [ext]

    sqlalchemy.ext.automap 扩展现在将在外键被检测为包含一个或多个非空列的一对多关系/反向引用上自动设置 cascade="all, delete-orphan"。此参数存在于传递给 generate_relationship() 的关键字中,并且仍然可以被覆盖。此外,如果 ForeignKeyConstraint 为非空列指定 ondelete="CASCADE" 或为空列集指定 ondelete="SET NULL",则参数 passive_deletes=True 也将添加到关系中。请注意,并非所有后端都支持 ondelete 的反射,但支持的后端包括 PostgreSQL 和 MySQL。

    参考链接: #3210

  • [bug] [declarative]

    __mapper_args__ 字典在访问时从声明性 mixin 或抽象类复制,以便声明性自身对此字典所做的修改不会与其他映射的修改冲突。字典针对 version_id_colpolymorphic_on 参数进行了修改,将其中的列替换为正式映射到本地类/表的列。

    此更改也向后移植到:0.9.5、0.8.7

    参考链接: #3062

  • [bug] [ext]

    修复了 mutable 扩展中的错误,其中 MutableDict 没有报告 setdefault() 字典操作的更改事件。

    此更改也向后移植到:0.9.5、0.8.7

    参考链接: #3051, #3093

  • [bug] [ext]

    修复了 MutableDict.setdefault() 没有返回现有值或新值的错误(此错误未在任何 0.8 版本中发布)。Pull request 由 Thomas Hervé 提供。

    此更改也向后移植到:0.9.5、0.8.7

    参考链接: #3051, #3093

  • [bug] [ext] [py3k]

    修复了关联代理列表类在 Py3K 下无法正确解释切片的错误。Pull request 由 Gilles Dartiguelongue 提供。

    此更改也向后移植到:0.9.9

  • [bug] [declarative]

    修复了在一些特殊的最终用户设置中观察到的不太可能的竞争条件,其中在声明性中尝试检查 “重复类名” 时,会遇到与正在删除的某些其他类相关的未完全清理的弱引用;此处的检查现在确保 weakref 在进一步调用之前仍然引用对象。

    此更改也向后移植到:0.9.8

    参考链接: #3208

  • [bug] [ext]

    修复了排序列表中的错误,如果在 reorder_on_append 标志设置为 True 的情况下,在集合替换事件期间,项目的顺序会被打乱。此修复确保排序列表仅影响与对象显式关联的列表。

    此更改也向后移植到:0.9.8

    参考链接: #3191

  • [bug] [ext]

    修复了 MutableDict 未能实现 update() 字典方法,因此未捕获更改的错误。Pull request 由 Matt Chisholm 提供。

    此更改也向后移植到:0.9.8

  • [bug] [ext]

    修复了 MutableDict 的自定义子类不会在 “coerce” 操作中显示,而是返回一个普通的 MutableDict 的错误。Pull request 由 Matt Chisholm 提供。

    此更改也向后移植到:0.9.8

  • [bug] [pool]

    修复了连接池日志记录中的错误,其中如果使用 logging.setLevel() 而不是使用 echo_pool 标志设置日志记录,则不会发出 “connection checked out”(连接已检出)调试日志消息。已添加测试以断言此日志记录。这是 0.9.0 中引入的回归。

    此更改也向后移植到:0.9.8

    参考链接: #3168

  • [bug] [declarative]

    修复了当声明性 __abstract__ 标志实际上是值 False 时未被区分的错误。__abstract__ 标志需要在被测试的级别实际评估为 True 值。

    此更改也向后移植到:0.9.7

    参考链接: #3097

  • [bug] [testsuite]

    在公共测试套件中,在 StringTest.test_literal_backslashes 中,将 Text 更改为使用支持较少的 String(40)。Pullreq 由 Jan 提供。

    此更改也向后移植到:0.9.5

  • [removed]

    Drizzle 方言已从 Core 中删除;现在可以作为独立的第三方方言 sqlalchemy-drizzle 使用。该方言仍然几乎完全基于 SQLAlchemy 中存在的 MySQL 方言。