1.0 变更日志
1.0.19
发布日期:2017 年 8 月 3 日
oracle
- [oracle] [performance] [bug] [py2k]
修复了由于修复了#3937引起的性能回退,其中 cx_Oracle 在 5.3 版本中从其命名空间中删除了.UNICODE
符号,这被解释为 cx_Oracle 的“WITH_UNICODE”模式被无条件地打开,从而在 SQLAlchemy 端调用函数将所有字符串无条件地转换为 unicode 并导致性能影响。实际上,根据 cx_Oracle 的作者,自 5.1 起,“WITH_UNICODE”模式已经被完全删除,因此不再需要昂贵的 unicode 转换函数,并且如果在 Python 2 下检测到 cx_Oracle 5.1 或更高版本,则会禁用它们。还恢复了在#3937中删除的有关“WITH_UNICODE”模式的警告。
引用:#4035
1.0.18
发布日期:2017 年 7 月 24 日
oracle
- [oracle] [bug]
通过发现 cx_Oracle 5.3 现在似乎在构建中硬编码了此标志,从而暴露了 cx_Oracle 的 WITH_UNICODE 模式的修复;使用此模式的内部方法未使用正确的签名。
引用:#3937
tests
- [tests] [bug] [py3k]
修复了与 Python 3.6.2 更改不兼容的测试装置中的问题,涉及到上下文管理器。
引用:#4034
1.0.17
发布日期:2017 年 1 月 17 日
orm
- [orm] [bug]
修复了针对多态继承也在使用的情况下对多个实体进行连接贪婪加载时会抛出“'NoneType’对象没有’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]
修复了对多态加载映射器的连接贪婪加载将失败的错误,其中多态性设置为未映射表达式(如 CASE 表达式)的情况。
引用:#3800 - [orm] [bug]
修复了一个 bug,当通过Session.bind_mapper()
、Session.bind_table()
或构造函数发送给 Session 的无效绑定时,引发的 ArgumentError 未能正确引发。
参考:#3798 - [orm] [错误]
修复了Session.bulk_save()
中的 bug,其中 UPDATE 与实现版本 id 计数器的映射结合使用时无法正常工作。
参考:#3781 - [orm] [错误]
修复了当首次调用 mapper 属性或其他 ORM 构造添加到 mapper/class 后,Mapper.attrs
、Mapper.all_orm_descriptors
和其他派生属性无法刷新的 bug。
参考:#3778
mssql
- [mssql] [错误]
更改了用于获取“默认模式名称”的查询,从查询数据库主体表的查询到使用“schema_name()”函数,因为已报告在 Azure Data Warehouse 版本上前一系统不可用的问题。希望这将最终在所有 SQL Server 版本和认证样式上正常工作。
参考:#3810 - [mssql] [错误]
更新了 pyodbc 的服务器版本信息方案,使用 SQL Server SERVERPROPERTY(),而不是依赖于 pyodbc.SQL_DBMS_VER,后者在 FreeTDS 中仍然不可靠。
参考:#3814 - [mssql] [错误]
将错误代码 20017“服务器意外的 EOF”添加到导致连接池重置的断开异常列表中。感谢 Ken Robbins 的拉取请求。
参考:#3791 - [mssql] [错误]
修复了 pyodbc 方言中的 bug(以及大部分不起作用的 adodbapi 方言中的 bug),其中密码或用户名字段中存在的分号可能被解释为另一个标记的分隔符;当分号存在时,现在对值进行引用。
参考:#3762
杂项
- [错误] [orm.declarative]
修复了设置单表继承子类的 bug,该子类包括额外列,会破坏映射表的外键集合,从而干扰关系的初始化。
参考:#3797
1.0.15
发布日期:2016 年 9 月 1 日
orm
- [orm] [错误]
修复了子查询加载中的错误,其中对“of_type()”对象的子查询加载链接到第二个普通映射类的子查询加载,或者几个“of_type()”属性的较长链,将无法正确链接连接。
参考:#3773, #3774
sql
- [sql] [错误]
修复了Table
中的错误,其中内部方法_reset_exported()
会破坏对象的状态。此方法用于可选择对象,并在某些情况下由 ORM 调用;错误的映射配置可能导致 ORM 在Table
对象上调用此方法。
参考:#3755
mysql
- [mysql] [错误]
增加了对解析 MySQL/Connector 中布尔值和整数参数的支持,这些参数位于 URL 查询字符串中: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
杂项
- [错误] [扩展]
修复了sqlalchemy.ext.baked
中的错误,其中由于变量作用域问题,在涉及多个子查询加载器时,解开子查询加载器查询的失败。感谢 Mark Hahnenberg 提交的拉取请求。
参考:#3743
1.0.14
发布日期:2016 年 7 月 6 日
示例
- [示例] [错误]
修复了在 examples/vertical/dictlike-polymorphic.py 示例中发生的回归,导致无法运行。
参考:#3704
引擎
- [引擎] [错误] [postgresql]
修复了跨模式外键反射与MetaData.schema
参数结合使用时的错误,其中在“默认”模式中存在的引用表将失败,因为没有办法指示具有“空白”模式的Table
。特殊符号sqlalchemy.schema.BLANK_SCHEMA
已添加为Table.schema
和Sequence.schema
的可用值,指示应强制模式名称为None
,即���指定了MetaData.schema
。
参考:#3716
sql
- [sql] [错误]
修复了 SQL 数学否定运算符中的问题,表达式的类型不再是原始表达式的数值类型。这会导致确定结果集行为的类型问题。
参考:#3735 - [sql] [bug]
修复了一个 bug,即由于 1.0 系列向__slots__
的过渡,导致 sqlalchemy.util.Properties 的__getstate__
/__setstate__
方法无法正常工作。该问题可能影响一些第三方应用程序。感谢 Pieter Mulder 提交的拉取请求。
参考:#3728 - [sql] [bug]
FromClause.count()
将在 1.1 版本��被弃用。该函数使用表中的任意列,不可靠;对于 Core 使用,应优先使用func.count()
。
参考:#3724 - [sql] [bug]
修复了CTE
结构中的一个 bug,当使用 union 时会导致它无法正确克隆,这在递归 CTE 中很常见。不正确的克隆会导致在各种 ORM 上下文中使用 CTE 时出现错误,比如column_property()
。
参考:#3722 - [sql] [bug]
修复了一个 bug,即Table.tometadata()
会为每个具有unique=True
参数的Column
对象创建重复的UniqueConstraint
。
参考:#3721
postgresql
- [postgresql] [bug]
修复了一个 bug,即 PostgreSQL 方言未深入检查TypeDecorator
和Variant
类型,以确定是否应该渲染 SMALLSERIAL 或 BIGSERIAL 而不是 SERIAL。
参考:#3739
oracle
- [oracle] [bug]
修复了Select.with_for_update.of
中的一个 bug,在 Oracle 的“rownum”方法中,LIMIT/OFFSET 无法适应“OF”子句中的表达式,这些表达式必须在顶层引用子查询中的表达式。如果需要,这些表达式现在将添加到子查询中。
参考:#3741
1.0.13
发布日期:2016 年 5 月 16 日
orm
- [orm] [bug]
修复了Query.update()
和Query.delete()
中“evaluate”策略中的 bug,该 bug 无法适应具有“callable”值的绑定参数,当通过关系沿着 many-to-one 等式表达式进行过滤时会发生这种情况。
参考:#3700 - [orm] [bug]
修复了一个 bug,即在使用深层类继承层次结构与多个映射器配置步骤同时使用时,用于反向引用的事件侦听器可能会被错误地应用多次。
参考:#3710 - [orm] [bug]
修复了一个 bug,即将text()
构造传递给Query.group_by()
方法会引发错误,而不是将对象解释为 SQL 片段。
参考:#3706 - [orm] [bug]
匿名标签应用于传递给column_property()
的func
构造,因此如果同一属性被引用两次作为列表达式,则名称将被去重,从而避免“模糊列”错误。以前,需要应用.label(None)
才能去除匿名化的名称。
参考:#3663 - [orm] [bug]
修复了在 1.0 系列中出现的 ORM 加载中的回归,其中对于缺少的预期列引发的异常将错误地是NoneType
错误,而不是预期的NoSuchColumnError
。
参考:#3658
示例
- [examples] [bug]
将“有向图”示例更改为不再将节点的整数标识符视为重要;“更高”/“更低”引用现在允许双向的相互边。
参考:#3698
sql
- [sql] [bug]
修复了在使用Engine
时,当case_sensitive=False
时,结果集无法正确处理结果集中的重复列名的错误,导致在 1.0 版本中执行语句时出错,并阻止 1.1 版本中“模糊列”异常的功能。
参考:#3690 - [sql] [bug]
修复了 EXISTS 表达式的否定在结果中未正确类型化为布尔值的 bug,并且在 SELECT 列表中也无法匿名别名,就像对非否定的 EXISTS 结构一样。
引用:#3682 - [sql] [bug]
修复了当Insert.values()
调用时使用参数映射列表而不是单个参数映射时,“未使用的列名”异常未能被引发的 bug。感谢 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 条件重叠的普通列的 bug。
引用:#3711 - [mssql] [bug] [oracle]
修复了 1.0 系列中出现的回归问题,该问题会导致 Oracle 和 SQL Server 方言在将 SELECT 包装在子查询中以提供 LIMIT/OFFSET 行为时不正确地计算结果集列,原始的 SELECT 语句引用了同一列多次,例如一个列和该列的一个标签。这个问题与 #3658 相关,在发生错误时,它也会导致一个NoneType
错误,而不是报告无法定位列。
引用:#3657
oracle
- [oracle] [bug]
修复了 cx_Oracle 连接过程中的一个 bug,当用户、密码或 dsn 中有一个为空时,会导致 TypeError。这阻止了对 Oracle 数据库的外部认证,并阻止连接到默认的 dsn。现在,连接字符串 oracle:// 将使用操作系统用户名登录到默认的 dsn,相当于使用 sqlplus 进行连接时使用 ‘/’。
引用:#3705 - [oracle] [bug]
修复了主要由 Oracle 使用的结果代理中的一个 bug,当二进制和其他 LOB 类型参与时,如果使用了查询/语句缓存,类型级别的结果处理器,特别是二进制类型本身所需的处理器以及任何其他处理器,在第一次运行语句后会丢失,因为它被从缓存的结果元数据中删除了。
引用:#3699
杂项
- [bug] [py3k]
修复了“to_list”转换中的错误,其中单个字节对象将转换为单个字符的列表。这将影响到使用Query.get()
方法的主键是字节对象的情况。
参考:#3660
1.0.12
发布日期:2016 年 2 月 15 日
orm
- [orm] [bug]
在Session.merge()
中修复了一个错误,其中具有复合主键的对象,其中一些但不是所有 PK 字段的值,将发出一个 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 后端发生,与意外丢失的保存点相结合,然后在尝试回滚时引发“没有这样的保存点”错误,模糊了原始条件。
此方法已推广到 Core“安全重新引发”功能,该功能在任何出现事务因试图提交而产生错误而回滚的地方在 ORM 和 Core 中都会发生,包括由Session
和Connection
提供的上下文管理器,并且对“RELEASE SAVEPOINT”等操作也进行了处理。以前,此修复仅适用于 ORM 刷新/提交过程中的特定路径;现在它也适用于所有事务上下文管理器。
参考:#2696
sql
- [sql] [bug]
修复了在将insert()
、update()
或delete()
构造编译为字符串 SQL 时,“literal_binds”标志未传播的问题。感谢 Tim Tate 的拉取请求。
参考:#3643 - [sql] [bug]
修复了在意外使用 Python__contains__
覆盖与列表达式(例如通过'x' in col
使用)会导致 ARRAY 类型无限循环的问题,因为 Python 将此推迟到__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 上针对日期时间值使用extract()
函数的语法;关键字周围的引号被移除。感谢 Guillaume Doumenc 的拉取请求。
参考:#3624 - [mssql] [bug] [firebird]
修复了 1.0 版本中的回归问题,即对通过纯文本或通过text()
构造发出的 UPDATE 或 DELETE 语句的 cursor.rowcount 的急切获取不再调用,影响那些在关闭游标后擦除 cursor.rowcount 的驱动程序,例如 SQL Server ODBC 和 Firebird 驱动程序。
参考:#3622
oracle
- [oracle] [bug] [jython]
修复了 Jython Oracle 编译器中的一个小问题,涉及“RETURNING”的呈现,这允许这个当前不受支持/未经测试的方言在 1.0 系列中基本工作。感谢 Carlos Rivas 的拉取请求。
参考:#3621
杂项
- [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 语句要发出的情况下不会被正确执行,无论是作为刷新的一部分还是作为批量更新操作的一部分。此外,在更新语句中不必要地发出 RETURNING。
参考:#3609 - [orm] [bug]
修复了使用Query.select_from()
方法会导致后续调用Query.with_parent()
方法失败的错误。
参考:#3606
sql
- [sql] [bug]
修复了Update.return_defaults()
中的错误,该错误会导致所有未包含在 SET 子句中(例如主键列)的插入默认列被渲染到 RETURNING 中,尽管这是一个 UPDATE。
参考:#3609
mysql
- [mysql] [bug]
调整了用于解析 MySQL 视图的正则表达式,不再假设反射视图源中存在“ALGORITHM”关键字,因为一些用户报告在某些 Amazon RDS 环境中不存在该关键字。
参考:#3613 - [mysql] [bug]
为 MySQL 5.7 的 MySQL 方言添加了新的保留字,包括‘generated’、‘optimizer_costs’、‘stored’、‘virtual’。感谢 Hanno Schlichting 的 Pull 请求。
杂项
- [bug] [ext]
进一步修复了#3605,在MutableDict
上的 pop 方法,其中未包含“default”参数。
参考:#3605 - [bug] [ext]
修复了烘焙加载器系统中的 bug,该系统范围的 monkeypatch 用于设置烘焙懒加载器会干扰依赖于懒加载作为后备的其他加载器策略,例如连接和子查询急加载器,在映射器配置时导致IndexError
异常。
参考:#3612
1.0.10
发布日期:2015 年 12 月 11 日
orm
- [orm] [bug]
修复了一个问题,即在一对多关系上的 post_update 在属性设置为 None 且之前未加载时会失败发出 UPDATE 的情况。
参考:#3599 - [orm] [bug]
修复了一个 bug,实际上是在版本 0.8.0 和 0.8.1 之间发生的回归,由于#2714。当“with_polymorphic”也被使用时,需要通过子类绑定关系进行连接的连接急加载会无法从正确的实体进行连接。
参考:#3593 - [orm] [bug]
修复了 joinedload bug,该 bug 会在以下情况下发生:a. 查询包含强制子查询的 limit/offset 条件 b. 关系使用“secondary” c. 关系的 primaryjoin 引用的列不是主键的一部分,或者是一个不同属性名称下的 joined-inheritance 子类表的 PK 列 d. 查询推迟了在 primaryjoin 中出现的列,通常通过不包含在 load_only()中;必要的列不会出现在子查询中,从而产生无效的 SQL。
参考:#3592 - [orm] [bug]
在一些 MySQL SAVEPOINT 案例中观察到的一种罕见情况,当Session.rollback()
在Session.flush()
操作的范围内失败并引发异常时,会阻止在 flush 期间发出的原始数据库异常被观察到,但仅在 Py2K 上,因为 Py2K 不支持异常链接;在 Py3K 上,原始异常会被链接。作为一种解决方法,在这种特定情况下会发出警告,至少显示原始数据库错误的字符串消息,然后我们继续引发导致回滚的异常。
参考:#2696
orm 声明
- [orm] [declarative] [bug]
修复了一个 bug,在 Py2K 中,unicode 文字不能作为声明中使用relationship()
上的backref()
的类或其他参数的字符串名称。感谢 Nils Philippsen 的拉取请求。
sql
- [sql] [feature]
增加了对 UPDATE 语句中参数顺序化 SET 子句的支持。通过将update.preserve_parameter_order
标志传递给核心Update
构造,或者将其添加到 ORM 级别的Query.update.update_args
字典中,同时将参数本身作为 2 元组列表传递。感谢 Gorka Eguileor 的实现和测试。
另请参见
参数顺序化更新 - [sql] [bug]
修复了Insert.from_select()
构造中的问题,当目标Table
具有 Python 端默认值时,Select
构造的._raw_columns
集合会在编译Insert
构造时被就地修改。Select
构造在编译后会独立存在,错误的列会在编译Insert
后出现,Insert
语句本身在第二次编译尝试时会因重复的绑定参数而失败。
参考:#3603 - [sql] [bug] [postgresql]
修复了一个 bug,当使用 CREATE TABLE 创建一个没有列但有约束(如 CHECK 约束)的表时,会在定义中出现错误的逗号;这种情况可能发生在具有自己没有列的 PostgreSQL INHERITS 表中。
参考:#3598
postgresql
- [postgresql] [bug]
修复了一个问题,当“FOR UPDATE OF” PostgreSQL 特定的 SELECT 修饰符引用的表具有模式限定符时,如果省略模式名称,PG 会失败。感谢 Diana Clarke 的拉取请求。
参考:#3573 - [postgresql] [bug]
修复了一个 bug,当将某些类型的 SQL 表达式传递给ExcludeConstraint
的“where”子句时,无法正确接受。感谢 aisch 的拉取请求。 - [postgresql] [bug]
修复了INTERVAL
的.python_type
属性,使其像python_type
一样返回datetime.timedelta
,而不是引发NotImplementedError
。
参考:#3571
mysql
- [mysql] [bug]
修复了 MySQL 反射中的错误,其中DATETIME
、TIMESTAMP
和TIME
类型的“小数部分”会被错误地放入未被 MySQL 使用的timezone
属性中而不是fsp
属性。
参考:#3602
mssql
- [mssql] [bug]
将“20006: 写入服务器失败”错误添加到 pymssql 驱动程序的断开错误列表中,因为观察到这会使连接无法使用。
参考:#3585 - [mssql] [bug]
现在,如果 SQL 服务器从 DATE 或 TIME 列返回无效的日期或时间格式,将引发描述性的 ValueError,而不是出现 NoneType 错误。感谢 Ed Avis 的贡献。 - [mssql] [bug]
修复了对于 MSSQL 类型 DATETIME2、TIME 和 DATETIMEOFFSET 的 DDL 生成中,精度为“零”时不会生成精度字段的问题。感谢 Jacobo de Vera 的贡献。
测试
- [tests] [change]
ORM 和 Core 教程一直以 doctest 格式存在,现在在 Python 2 和 Python 3 中都在正常的单元测试套件中执行。
杂项
- [bug] [ext]
为MutableDict
类添加了对dict.pop()
和dict.popitem()
方法的支持。
参考:#3605 - [bug] [py3k]
对内部getargspec()
调用进行更新,一些与 py36 相关的 fixture 更新,以及对两个迭代器进行修改,使其“返回”而不是引发 StopIteration,以便在 Py3.5、Py3.6 上通过测试而不出现错误或警告,感谢 Jacob MacDonald、Luri de Silvio 和 Phil Jones 的贡献。 - [bug] [ext]
修复了烘焙查询中的问题,其中.get()
方法,无论是直接使用还是在惰性加载中使用,都没有将映射器的“获取子句”视为缓存键的一部分,导致如果子句重新生成,则绑定参数不匹配。这个子句会被映射器动态缓存,但在高并发场景下,当首次访问时可能会生成多次。
参考:#3597
1.0.9
发布日期:2015 年 10 月 20 日
orm
- [orm] [feature]
添加了新方法Query.one_or_none()
;与Query.one()
相同,但如果未找到行,则返回 None。感谢 esiegerman 的贡献。 - [orm] [bug] [postgresql]
修复了 1.0 版本中的回归,即在 ORM 中使用“executemany”进行 UPDATE 语句的新功能(例如 UPDATE statements are now batched with executemany() in a flush)在 PostgreSQL 和其他 RETURNING 后端上会出现问题,当使用服务器端版本生成方案时,由于服务器端值是通过 RETURNING 检索的,而在使用 executemany 时不支持。
参考:#3556 - [orm] [bug]
修复了在内部日志记录中对某些类型的内部列加载器选项进行字符串化时可能出现的罕见 TypeError。
参考:#3539 - [orm] [bug]
修复了Session.bulk_save_objects()
中的错误,其中具有某种“更新时获取”值的映射列,且在给定对象中不存在本地时,会导致操作中的 AttributeError。
参考:#3525 - [orm] [bug]
修复了 1.0 版本中的回归,即“noload”加载策略在一对多关系中无法正常工作的问题。加载器使用 API 将“None”放入字典中,但实际上不再写入值;这是#3061的副作用。
参考:#3510
examples
- [examples] [bug]
修复了“history_meta”示例中的两个问题,其中历史跟踪可能遇到空历史,以及键入替代属性名称的列无法正确跟踪的问题。修复由 Alex Fraser 提供。
sql
- [sql] [bug]
修复了 1.0 版本中发布的默认处理器对多值插入语句的回归,#3288,其中默认保存列的列类型不会传播到编译后的语句中,在使用默认值时,导致绑定级别类型处理程序不被调用。
参考:#3520
postgresql
- [postgresql] [bug]
对 1.0.6 中发布的反映存储选项和#3455的 PostgreSQL 新功能进行了调整,以禁用 PostgreSQL 版本< 8.2 的功能,其中未提供reloptions
列;这允许 Amazon Redshift 再次正常工作,因为它基于 8.0.x 版本的 PostgreSQL。修复由 Pete Hollobon 提供。
oracle
- [oracle] [bug] [py3k]
修复了 cx_Oracle 版本 5.2 的支持,该版本在 Python 3 下触发了 SQLAlchemy 的版本检测,并且意外地未使用正确的 Unicode 模式进行 Python 3。这会导致问题,例如绑定变量被误解为 NULL,以及行被静默地未返回。
此更改也回溯到:0.7.0b1
参考:#3491 - [oracle] [bug]
修复了 Oracle 方言中的一个错误,即对使用引号强制转换为全小写的表和其他符号的反射在反射查询中无法正确识别。现在,对于在“名称规范化”过程中被强制转换为全小写的传入符号名称,将应用quoted_name
构造。
参考:#3548
杂项
- [feature] [ext]
在AssociationProxy
构造函数中添加了AssociationProxy.info
参数,以适应在#2971中添加的AssociationProxy.info
访问器。这是因为AssociationProxy
是显式构造的,不像通过装饰器语法隐式构造的混合体。
参考:#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 方言中的一个错误,即包含非字母字符(如点或空格)的唯一约束的反射不会反映其名称。
此更改也回溯至:0.9.10
参考:#3495
杂项
- [misc] [bug]
修复了一个问题,即 utils 中的特定基类未实现__slots__
,因此该类的所有子类也未实现,这使得使用__slots__
没有意义。除了在 IronPython 上可能会出现问题外,其他地方都没有问题,因为 IronPython 显然不兼容 cPython 的__slots__
行为。
参考:#3494
1.0.7
发布日期:2015 年 7 月 20 日
orm
- [orm] [bug]
修复了 1.0 版本中的一个回归问题,即覆盖__eq__()
以返回非布尔类型对象的值对象,在工作单元更新操作期间会被测试为bool()
,而在 0.9 版本中,__eq__()
的返回值会与“is True”进行测试,以防止出现此问题。
参考:#3469 - [orm] [bug]
修复了 1.0 版本中的一个回归问题,即“延迟”属性在“优化继承加载”中无法正确填充的情况,这是在使用联接表继承时发出的特殊 SELECT 语句,用于填充已过期或未加载的属性,而不加载基本表。这与 SQLA 1.0 不再猜测加载延迟列的事实有关,必须明确指示。
参考:#3468 - [orm] [bug]
修复了 1.0 版本中的一个回归问题,即在aliased()
对象上的同义词映射属性的“父实体”将解析为原始映射器,而不是其aliased()
版本,从而导致依赖于此属性的Query
出现问题(例如,在构造函数中只给出了代表性属性,以确定查询的正确 FROM 子句)。
参考:#3466
orm declarative
- [orm] [declarative] [bug]
修复了AbstractConcreteBase
扩展中的错误,即在 ABC 基类上设置了一个具有不同属性名和列名的列,最终基类上不会正确映射该列。在 0.9 版本上失败是静默的,而在 1.0 版本上会引发 ArgumentError,因此在 1.0 版本之前可能不会注意到。
参考:#3480
engine
- [engine] [bug]
修复了 ORMQuery
对象中使用的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_()
结合使用文字True
或False
常量时,会因为 AttributeError 而失败的错误。
参考:#3490 - [sql] [bug]
修复了自定义FunctionElement
或其他列元素的子类错误地将‘None’或任何其他无效对象声明为.type
属性时,会报告此异常而不是递归溢出的潜在问题。
参考:#3485 - [sql] [bug]
修复了模数 SQL 运算符由于缺少__rmod__
方法而无法反向工作的错误。感谢 dan-gittik 的拉取请求。
模式
- [schema] [feature]
增加了对 CREATE SEQUENCE 的 MINVALUE、MAXVALUE、NO MINVALUE、NO MAXVALUE 和 CYCLE 参数的支持,这些参数受 PostgreSQL 和 Oracle 支持。感谢 jakeogh 的拉取请求。
1.0.6
发布日期:2015 年 6 月 25 日
orm
- [orm] [bug]
修复了 1.0 系列中的一个重大回归问题,即 version_id_counter 功能会导致对象的版本计数器在对象的行没有净变化时被增加,而是通过关系(例如通常是一对多)与其关联或取消关联的对象,导致更新语句更新对象的版本计数器而不更新其他内容。在相对较新的“服务器端”和/或“程序化/条件化”版本计数器功能被使用的用例中(例如将 version_id_generator 设置为 False),这个错误可能导致发出没有有效 SET 子句的 UPDATE。
参考:#3465 - [orm] [bug]
修复了 1.0 版本中的一个回归问题,即增强的单继承连接的行为#3222不适当地发生在沿着显式连接条件进行 JOIN 时,其中单继承子类不使用任何鉴别器,导致额外的“AND NULL”子句。
参考:#3462 - [orm] [bug]
修复了新的Session.bulk_update_mappings()
功能中的错误,其中用于定位行的 WHERE 子句中使用的主键列也会包含在 SET 子句中,将它们的值不必要地设置为它们自己。感谢 Patrick Hayes 的拉取请求。
参考:#3451 - [orm] [bug]
修复了一个意外使用回归问题,即自定义Comparator
对象使用__clause_element__()
方法并返回一个 ORM 映射的InstrumentedAttribute
对象而不是显式的ColumnElement
时,当作为表达式传递给Session.query()
时无法正确处理。0.9 版本的逻辑恰好成功,因此现在支持这种用例。
参考:#3448
sql
- [sql] [bug]
修复了一个 bug,即应用于Label
对象的子句适应在所有情况下都会失败,这样任何使用Label.self_group()
的 SQL 操作都会使用原始未适应的表达式。其中一个影响是 ORMaliased()
构造将无法完全适应由column_property
映射的属性,因此在某些类型的 SQL 比较中,未别名化的表可能会泄漏出来。
参考:#3445
postgresql
- [postgresql] [feature]
增加了对在 CREATE INDEX 下使用存储参数的支持,使用了一个新的关键字参数postgresql_with
。还增加了反射支持,以支持postgresql_with
标志和postgresql_using
标志,这些标志现在将设置在被反射的Index
对象上,并且在Inspector.get_indexes()
的结果中还存在一个新的“dialect_options”字典中。感谢 Pete Hollobon 的 Pull 请求。
另请参阅
索引存储参数
参考:#3455 - [postgresql] [feature]
增加了新的执行选项max_row_buffer
,当使用stream_results
选项时,由 psycopg2 方言解释,它设置了可以分配的行缓冲区的大小限制。这个值也是基于发送给Query.yield_per()
的整数值提供的。感谢 mcclurem 的 Pull 请求。 - [postgresql] [bug] [pypy]
重新修复了在 1.0.5 中首次发布的问题,以再次修复 psycopg2cffi 对 JSONB 支持,因为他们突然在 2.7.1 版本中切换到了对 JSONB 类型的无条件解码。版本检测现在指定 2.7.1 是我们应该期望 DBAPI 为我们进行 json 编码的地方。
参考:#3439 - [postgresql] [bug]
修复了ExcludeConstraint
构造,以支持其他对象(如Index
)现在支持的常见功能,即列表达式可以指定为任意的 SQL 表达式,如cast
或text
。
参考:#3454
mssql
- [mssql] [bug]
修复了在使用VARBINARY
类型与插入 NULL + pyodbc 时出现的问题;pyodbc 需要传递一个特殊对象以保留 NULL。由于由于#3039,VARBINARY
类型现在通常是LargeBinary
的默认值,因此这个问题在 1.0 中部分是一个退化。pymssql 驱动程序似乎不受影响。
参考:#3464
杂项
- [bug] [documentation]
修复了内部的“记忆化”方法类型,不再使用 Python 描述符;修复了这些方法的可检查性,包括对 Sphinx 文档的支持。
参考:#2077
1.0.5
发布日期:2015 年 6 月 7 日
orm
- [orm] [feature]
添加了新的事件InstanceEvents.refresh_flush()
,在刷新过程中通过 RETURNING 或 Python-side 默认值获取的 INSERT 或 UPDATE 级别默认值时调用。这是为了提供一个钩子,因为由于#3167的结果,属性和验证事件不再在刷新过程中调用。
参考:#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]
修复了一个 bug,当使用池检出事件处理程序并在处理程序本身中进行连接尝试并失败时,拥有连接记录直到连接错误的堆栈跟踪被释放之前不会被释放。对于仅使用单个连接的测试池的情况,这意味着池将完全被检出,直到该堆栈跟踪被释放。这主要影响非常特定的调试场景,不太可能在任何生产应用程序中引起注意。修复方法是在重新引发捕获的异常之前显式检入记录。
参考:#3419
sql
- [sql] [feature]
官方支持了Insert.from_select()
内部 SELECT 中使用的 CTE。此行为直到 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 Server 无法在所有情况下解析多部分标识符名称的旧问题,以使更复杂的语句能够正确工作,包括使用提示的语句以及嵌入相关 SELECT 语句的 CRUD 语句。与其继续修复该特性以使其能够与更复杂的语句一起工作,不如直接禁用它,因为对于任何现代 SQL Server 版本,它应该不再需要。该标志在 1.0.x 系列中默认为 True,保持当前版本系列的行为不变。在 1.1 系列中,它将默认为 False。对于 1.0 系列,当未显式设置为任一值时,在语句中首次使用模式限定的表时会发出警告,建议将该标志设置为 False 以适用于所有现代 SQL Server 版本。
另请参阅
传统架构模式
参考:#3424,#3430
杂项
- [功能] [扩展]
添加了对*args
传递给烘焙查询初始可调用的支持,方式与BakedQuery.add_criteria()
和BakedQuery.with_criteria()
方法支持*args
的方式相同。初始 PR 由 Naoki INADA 提供。 - [功能] [扩展]
添加了一个新的半公共方法MutableBase
MutableBase._get_listen_keys()
。在拦截InstanceEvents.refresh()
或InstanceEvents.refresh_flush()
事件时,需要重写此方法,以便在MutableBase
子类需要事件传播到与可变类型关联的键之外的属性键时。目前的示例是使用MutableComposite
的复合体。
参考:#3427 - [错误] [扩展]
修复了sqlalchemy.ext.mutable
扩展中的回归问题,这是由于对#3167的错误修复导致的,其中属性和验证事件不再在刷新过程中调用。在列级别的 Python 端默认值负责生成 INSERT 或 UPDATE 的新值,或者在“eager defaults”模式下从 RETURNING 子句中获取值的情况下,可变扩展依赖于此行为。当填充新值时,新值不会受到任何事件的影响,可变扩展无法建立适当的强制转换或历史监听。添加了一个新事件InstanceEvents.refresh_flush()
,可变扩展现在使用这个事件来处理这种情况。
参考:#3427
1.0.4
发布日期:2015 年 5 月 7 日
orm
- [orm] [错误]
修复了一个意外使用回归问题,即在关系的主连接涉及与不可哈希类型(如 HSTORE)的比较的奇怪情况下,由于语句参数上的哈希导向检查,在 1.0 中修改为使用哈希,并在#3368中修改为在比“挂起加载”更常见的情况下发生。现在会事先检查值是否具有__hash__
属性。
参考:#3416 - [ORM] [错误]
放宽了一个断言,该断言是作为#3347的一部分添加的,以防止在使用innerjoin=True
在连接的急切加载中拼接内部连接时出现未知条件;如果一些连接使用“secondary”表,则需要进一步展开连接以通过。
参考:#3347, #3412 - [ORM] [错误]
修复/添加了更多表达式的测试,这些表达式被报告为在新的‘entity’键值添加到Query.column_descriptions
中失败,重新设计了发现“from”子句的逻辑,以适应来自别名类的列,以及在这些情况下报告“aliased”标志的正确值。
参考:#3320, #3409
模式
- [模式] [错误]
修复了在增强的约束附加逻辑中引入的错误,该错误在罕见情况下,约束同时引用Column
对象和字符串列名称时,将跳过自动附加到列附加逻辑;对于约束在这种情况下自动附加,必须提前将所有列组装到目标表上。在迁移文档中添加了关于原始功能以及此更改的新部分。
另请参阅
引用未附加列的约束可以在其引用的列附加时自动附加到表格
参考:#3411
测试
- [测试] [错误] [pypy]
修复了一个导入问题,导致“pypy setup.py test”无法正常工作。
此更改也回溯到:0.9.10
参考:#3406
杂项
- [错误] [扩展]
修复了使用扩展属性仪器系统时的错误,当使用class_mapper()
调用无效输入(也恰好不是弱引用)时,不会引发正确的异常。
此更改也回溯到:0.9.10
参考:#3408
1.0.3
发布日期:2015 年 4 月 30 日
orm
- [orm] [bug] [pypy]
由于#3349导致的发布之前的回归问题,即在Query.update()
或Query.delete()
上检查查询状态时,使用is
将空元组与自身进行比较,在 PyPy 上失败,导致在这种情况下产生True
;这将在 0.9 中错误地发出警告,并在 1.0 中引发异常。
参考:#3405 - [orm] [bug]
修复了在发布之前从 0.9.10 版本开始的回归问题,即将entity
添加到Query.column_descriptions
访问器时,如果目标实体是从核心可选择对象(如Table
或CTE
对象)生成的,则会失败。
参考:#3320, #3403 - [orm] [bug]
修复了在刷新过程中的回归问题,当属性设置为 UPDATE 的 SQL 表达式时,与属性的先前值进行比较时,如果 SQL 表达式产生的 SQL 比较不是==
或!=
,则会引发异常“此子句的布尔值未定义”。修复确保工作单元不会以这种方式解释 SQL 表达式。
参考:#3402 - [orm] [bug]
修复了由于#2992导致的意外使用回归问题,其中在与连接的急加载一起放置到Query.order_by()
子句中的文本元素会被添加到内部查询的列子句中,以一种被假定为表绑定列名的方式,这种情况下,连接的急加载需要将查询包装在子查询中以适应限制/偏移量。
最初,这里的行为是有意的,例如query(User).order_by('name').limit(1)
这样的查询将按user.name
排序,即使查询被连接式急加载修改为在子查询中,因为'name'
将被解释为一个符号,应该在 FROM 子句中定位,此处为User.name
,然后将其复制到列子句中以确保它在 ORDER BY 中存在。然而,该功能未能预料到order_by("name")
指的是本地列子句中已经存在的特定标签名称,而不是绑定到 FROM 子句中的名称。
此外,该功能在像order_by("name desc")
这样的已弃用情况下也会失败,尽管它会发出警告,指出应该在这里使用text()
(请注意,该问题不会影响显式使用text()
的情况),但仍会产生与以前不同的查询,其中“name desc”表达式被不当地复制到列子句中。解决方案是,该功能的“连接式急加载”方面将在增强内部列子句时跳过这些所谓的“标签引用”表达式,就好像它们已经是text()
构造一样。
参考:#3392 - [orm] [bug]
修复了关于MapperEvents.instrument_class()
事件的回归,其中其调用被移动到类管理器对类进行仪器化之后,这与事件文档明确说明的相反。切换的理由是由于 Declarative 在将类映射为新的@declared_attr
功能描述的目的之前设置了完整的“仪器管理器”,但也为了与经典使用Mapper
的一致性而进行了更改。然而,SQLSoup 依赖于在任何经典映射下的任何仪器化之前发生的仪器化事件。在经典和声明性映射的情况下,行为被恢复,后者通过简单的记忆化实现,而不使用类管理器。
参考:#3388 - [orm] [bug]
在新的QueryEvents.before_compile()
事件中修复了问题,在事件中对要加载的实体集合进行更改后,这些更改会反映在 SQL 中,但在加载过程中不会反映出来。
参考:#3387
引擎
- [引擎] [功能]
新功能已添加以支持具有高级功能的引擎/池插件。在检出连接包装器的连接池级别以及_ConnectionRecord
中添加了一个新的“软失效”功能。这类似于现代池失效,因为连接不会被主动关闭,但只有在下次检出时才会被回收;这本质上是该功能的每个连接版本。一个新的事件PoolEvents.soft_invalidate()
被添加以补充它。
还添加了新的标志ExceptionContext.invalidate_pool_on_disconnect
。允许ConnectionEvents.handle_error()
中的错误处理程序维护“断开连接”条件,但在事件中以特定方式调用单个连接的失效处理。
参考:#3379 - [引擎] [功能]
添加了新的事件do_connect
,它允许拦截/替换调用Dialect.connect()
钩子以创建 DBAPI 连接的时机。还添加了方言插件钩子Dialect.get_dialect_cls()
和Dialect.engine_created()
,它们允许外部插件使用入口点向现有方言添加事件。
参考:#3355
sql
- [sql] [功能]
添加了一个占位符方法TypeEngine.compare_against_backend()
,它现在在 Alembic 迁移中被消耗为 0.7.6. 用户定义的类型可以实现此方法以协助比较来自数据库的类型与反射的类型。 - [sql] [错误]
修复了 SQL 中长标签的截断可能会产生与未截断的另一个标签重叠的 bug;这是因为截断的长度阈值大于截断后剩余标签的部分。现在这两个值已经调整为相同;label_length - 6
。这里的效果是,较短的列标签在以前不会被截断的情况下现在将被“截断”。
参考:#3396 - [sql] [bug]
由于 #3282 导致的回归已修复,此处关于tables
集合作为关键字参数传递给DDLEvents.before_create()
、DDLEvents.after_create()
、DDLEvents.before_drop()
和DDLEvents.after_drop()
事件的tables
集合不再是一个表的列表,而是一个包含第二个条目的元组列表,其中包含要添加或删除的外键。由于tables
集合,虽然被文档化为不一定稳定,但已经被依赖,因此这个变化被认为是一个回归。此外,在某些情况下,“drop” 对于这个集合将是一个迭代器,如果过早迭代将导致操作失败。现在,这个集合在所有情况下都是一个表对象的列表,并且现在已经为该集合的格式添加了测试覆盖。
参考:#3391
其他
- [bug] [ext]
修复了关联代理中的一个 bug,在关系-标量非对象属性比较上执行any()
/has()
操作会失败,例如filter(Parent.some_collection_to_attribute.any(Child.attr == 'foo'))
。
参考:#3397
1.0.2
发布日期:2015 年 4 月 24 日
orm 声明性
- [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,如 Label constructs can now render as their name alone in an ORDER BY 中所述,即使 1.0 版本包括对此逻辑的重写作为#2992的一部分。至于对简单标签进行 GROUP BY,即使 PostgreSQL 也有情况会引发错误,尽管应该明显可以看出要分组的标签,因此清楚地表明 GROUP BY 不应该自动以这种方式呈现。
在 1.0.2 版本中,当传递一个Label
构造到 SQL Server、Firebird 等数据库时,简单标签名称将再次发出 ORDER BY。此外,当传递一个Label
构造时,任何后端都不会只对简单标签名称发出 GROUP BY。
参考:#3338, #3385
1.0.1
发布日期:2015 年 4 月 23 日
orm
- [orm] [bug]
修复了一个问题,即形式为query(B).filter(B.a != A(id=7))
的查询将渲染出NEVER_SET
符号,当给定一个瞬态对象时。对于持久对象,它将始终使用持久化的数据库值而不是当前设置的值。假设自动刷新已打开,对于持久值,这通常对于持久值不会明显,因为任何待处理的更改都将首先被刷新。然而,这与用于非否定比较的逻辑不一致,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
符号,但许多这些查询从未得到正确支持,并且在不使用 IS 运算符的情况下产生与 NULL 的比较。因此,对于当前不提供IS NULL
的关系查询子集,还添加了警告。
另请参阅
比较具有 None 值的对象与关系时发出的警告
参考:#3371 - [orm] [bug]
修复了由#3061引起的回归问题,其中 NEVER_SET 符号可能会泄漏到延迟加载查询中,在挂起对象刷新后。这通常会发生在不使用简单“get”策略的多对一关系中。好消息是,这个修复提高了效率,因为我们现在可以在检测到参数中存在 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 查询无法将正确的布尔结果类型分配给结果映射的问题,而是会从查询中泄漏列类型到结果映射中。这个问题在 0.9 版本及之前版本中也存在,但在那些版本中影响较小。在 1.0 版本中,由于#918,这成为一个回归问题,因为我们现在依赖于结果映射非常准确,否则我们可能会将结果类型处理器分配给错误的列。在所有版本中,这个问题还会导致简单的 EXISTS 不适用布尔类型处理程序,导致后端没有原生布尔值而是简单的 1/0 值而不是 True/False。修复包括 EXISTS 列参数将像其他列表达式一样匿名标记;类似的修复也针对纯布尔表达式如not_(True())
实现。
参考:#3372
sqlite
- [sqlite] [bug]
由于 #3282 导致的一个回归,由于我们在创建/删除模式时尝试假设 ALTER 可用,因此在 SQLite 的情况下,我们简单地说根本不用担心外键,因为在创建和删除表时 ALTER 不可用。这意味着在 SQLite 的情况下基本上跳过了表的排序,对于绝大多数 SQLite 使用情况,这并不是问题。
然而,对于在 SQLite 上执行包含数据的表的 DROP 操作并且启用了引用完整性的用户,他们会遇到错误,因为在具有数据的表的 DROP 操作中,依赖排序确实很重要(SQLite 仍然可以让您创建对不存在表的外键并删除引用存在表的表,只要没有引用数据)。
为了在仍允许 SQLite DROP 操作保持排序的同时保持 #3282 的新功能,我们现在考虑完整的外键进行排序,如果遇到无法解决的循环,那么我们放弃尝试对表进行排序;我们会发出警告并使用未排序的列表。如果一个环境需要有序的 DROP 操作 并且 存在外键循环,那么警告指出他们需要将use_alter
标志恢复到他们的ForeignKey
和ForeignKeyConstraint
对象中,以便仅跳过这些对象的依赖排序。
另请参阅
ForeignKeyConstraint 上的 use_alter 标志(通常)不再需要 - 包含有关 SQLite 的更新说明。
引用:#3378
misc
- [bug] [firebird]
由于 #3034 导致的一个回归,Firebird 方言未能正确解释 limit/offset 子句。感谢 effem-git 提交的拉取请求。
引用:#3380 - [bug] [firebird]
修复了在使用 Firebird 时“literal_binds”模式与 limit/offset 结合时的支持,因此当选择此模式时,值再次以内联方式呈现。与 #3034 相关。
引用:#3381
1.0.0
发布日期:2015 年 4 月 16 日
orm
- [orm] [feature]
添加了新参数Query.update.update_args
,允许传递诸如mysql_limit
之类的关键字参数到底层的Update
构造。感谢 Amir Sadoughi 的拉取请求。 - [orm] [bug]
在处理多次对同一目标进行Query.join()
时发现了一个不一致性;它只在关系连接的情况下隐式去重,由于#3233,在 1.0 中对同一表进行两次连接的行为与 0.9 不同,不再错误地别名。为了帮助记录这一变化,迁移说明中关于#3233的措辞已经泛化,并在多次调用Query.join()
时添加了警告,针对相同目标关系连接。
参考:#3367 - [orm] [bug]
在确定半自引用关系的远程端时,对关系的启发式进行了小的改进(例如,两个连接的继承子类相互引用),非简单的连接条件将考虑到父实体,并且可以减少使用remote()
注释的需要;这可以恢复一些在 0.9.4 之前可能在没有注释的情况下工作的情况,通过#2948。
参考:#3364
sql
- [sql] [feature]
用于对Table
对象进行排序的拓扑排序,并通过MetaData.sorted_tables
集合提供,现在将产生一个确定性的排序;也就是说,给定一组具有特定名称和依赖关系的表,每次都会产生相同的排序。这有助于比较 DDL 脚本和其他用例。表按名称排序发送到拓扑排序,拓扑排序本身将以有序的方式处理传入的数据。感谢 Sebastian Bank 的拉取请求。
参见
MetaData.sorted_tables accessor is “deterministic”
参考:#3084 - [sql] [bug]
修复了一个问题,即使用命名约定的MetaData
对象不会正确地与 pickle 一起工作。该属性被跳过,导致如果使用了 unpickled 的MetaData
对象来基于其他表,就会出现不一致和失败。
此更改也已回溯到:0.9.10
参考:#3362
postgresql
- [postgresql] [bug]
修复了一个长期存在的 bug,即在使用 psycopg2 方言与非 ASCII 值和native_enum=False
结合使用时,Enum
类型无法正确解码返回结果。这源自于 PGENUM
类型过去是一个独立的类型,没有“非本机”选项。
此更改也已回溯到:0.9.10
参考:#3354
mssql
- [mssql] [bug]
修复了一个回归,即“最后插入的 id”机制在 MSSQL 上的 INSERT 中失败,其中主键值在执行之前出现在插入参数中,以及在来自 SELECT 的 INSERT 中,会将目标列声明为列对象,而不是字符串键的情况下,将无法存储正确的值。
参考:#3360 - [mssql] [bug]
现在使用 pymssql 中现有的Binary
构造函数,而不是进行补丁。感谢 Ramiro Morales 提供的拉取请求。
tests
- [tests] [bug]
修复了测试运行时使用的路径;对于 sqla_nose.py 和 py.test,再次在 sys.path 的开头插入“./lib”前缀,但仅当 sys.flags.no_user_site 没有设置时;这使其的行为就像 Python 默认将“.”放在当前路径中一样。对于 tox,我们现在设置了 PYTHONNOUSERSITE 标志。
参考:#3356
1.0.0b5
发布日期:2015 年 4 月 3 日
orm
- [orm] [bug]
修复了一个错误,在多个嵌套Session.begin_nested()
操作内的状态跟踪会失败,如果在内部保存点内更新了对象,则该对象的“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() 调用,如果没有它,如果垃圾收集与进程交互,可能会导致“迭代过程中字典大小发生变化”的错误。此更改由 #3139 引入。 - [orm] [bug]
修复了与“嵌套”内连接贪婪加载相关的错误,该错误在 0.9 中也存在,但由于 #3008 的原因,在 1.0 中更像是退化,默认情况下“嵌套”被启用,这样一个跨越共同祖先的兄弟路径的连接贪婪加载使用 innerjoin=True 将正确地将每个“innerjoin”兄弟插入连接的适当部分,当一系列内部/外部连接混合在一起时。
参考:#3347
sql
- [sql] [bug]
对于非 Unicode 类型的 unicode 类型发出的警告已经放宽,警告适用于甚至不是字符串值的值,比如整数;之前,1.0 的更新警告系统使用字符串格式化操作,这将引发内部 TypeError。虽然理想情况下,这些情况应该完全引发错误,但某些后端如 SQLite 和 MySQL 确实接受它们,并且可能被遗留代码使用,更不用说如果目标后端的 unicode 转换关闭,它们将始终通过。
参考:#3346
postgresql
- [postgresql] [bug]
修复了更新 PG 索引反射的 bug,这是 #3184 的结果,在 PostgreSQL 版本 8.4 及更早版本上将导致索引操作失败。在使用旧版本的 PostgreSQL 时,这些增强功能现已禁用。
参考:#3343
1.0.0b4
Released: March 29, 2015
sql
- [sql] [bug]
修复了新“标签解析”功能中的错误#2992,其中一个匿名标签,然后再次用名称标记,将无法通过文本标签定位。 当在查询中为映射的column_property()
给定一个显式标签时,会自然发生这种情况。
参考:#3340 - [sql] [bug]
修复了新“标签解析”功能中的错误#2992,其中在语句的 order_by()或 group_by()中放置的字符串标签会更优先地放在 FROM 子句内找到的名称上,而不是更本地可用的列子句内的名称。
参考:#3335
模式
- [schema] [feature]
诸如UniqueConstraint
和CheckConstraint
等约束的“自动附加”功能已进一步增强,以便当约束与非绑定到表的Column
对象相关联时,约束将与列本身设置事件侦听器,以便约束在与表关联的同时自动附加列。 这特别有助于一些声明性的边缘情况,但也是一般用途
另请参阅
引用未附加列的约束可以在其引用的列附加时自动附加到表
参考:#3341
mysql
- [mysql] [bug] [pymysql]
修复了 PyMySQL 在使用“executemany”操作时对 Unicode 的支持。 SQLAlchemy 现在将语句和绑定参数都作为 Unicode 对象传递,因为 PyMySQL 通常在内部使用字符串插值来生成最终语句,并且在 executemany 的情况下仅在最终语句上执行“encode”步骤。
此更改也回溯到:0.9.10
参考:#3337
mssql
- [mssql] [bug] [firebird] [oracle] [sybase]
关闭了 MSSQL、Oracle 方言上的“简单排序”标志;这是根据#2992的要求,导致 order by 或 group by 表达式也在列子句中时被复制为标签,即使作为表达式对象引用。 MSSQL 现在的行为是默认情况下复制整个表达式,因为 MSSQL 在这些特别是在 GROUP BY 表达式中可能会挑剔。 为 Firebird 和 Sybase 方言也防御性地关闭了该标志。
注意
此解决方案是错误的,请查看版本 1.0.2 以重新制定此解决方案。
参考:#3338
1.0.0b3
发布日期:2015 年 3 月 20 日
mysql
- [mysql] [错误]
修复了无意中注释掉的问题#2771 的提交。
参考:#2771
1.0.0b2
发布日期:2015 年 3 月 20 日
ORM
- [ORM] [错误]
修复了从 pullreq github:137 中的意外使用回归,其中 Py2K unicode 文字(例如u""
)将不被relationship.cascade
选项接受。拉取请求由 Julien Castets 提供。
参考:#3327
ORM 声明
- [ORM] [声明] [更改]
放宽了对@declared_attr
对象添加的一些限制,以防止它们在声明过程之外被调用;这与#3150 的增强相关,允许@declared_attr
返回一个根据当前类缓存的值,因为它正在被配置。已删除异常引发,并更改了行为,以便在声明过程之外,由@declared_attr
装饰的函数每次都像常规@property
一样被调用,而不使用任何缓存,因为在此阶段没有可用的缓存。
参考:#3331
引擎
- [引擎] [错误]
“自动关闭”ResultProxy
现在是“软”关闭。也就是说,在使用提取方法耗尽所有行后,DBAPI 游标会像以前一样被释放,对象可以安全丢弃,但是提取方法仍然可以继续调用,它们将返回结果结束对象(对于 fetchone 为 None,对于 fetchmany 和 fetchall 为空列表)。只有显式调用ResultProxy.close()
时,这些方法才会引发“结果已关闭”错误。
另请参阅
ResultProxy“自动关闭”现在是“软”关闭
参考:#3329, #3330
mysql
- [mysql] [错误] [py3k]
修复了 Py3K 上未正确使用ord()
函数的BIT
类型。拉取请求由 David Marin 提供。
此更改也回溯到:0.9.10
参考:#3333 - [mysql] [错误]
修复了完全支持使用 MySQL 方言的'utf8mb4'
MySQL 特定字符集的问题,特别是 MySQL-Python 和 PyMySQL。此外,报告更不寻常字符集(如‘koi8u’或‘eucjpms’)的 MySQL 数据库也将正常工作。拉取请求由 Thomas Grainger 提供。
参考:#2771
SqlAlchemy 2.0 中文文档(六十三)(2)https://developer.aliyun.com/article/1560861