SqlAlchemy 2.0 中文文档(六十)(2)https://developer.aliyun.com/article/1560729
1.3.22
发布日期:2020 年 12 月 18 日
oracle
- [oracle] [bug]
修复了由于#5755引起的回归,该回归实现了对 Oracle 的隔离级别支持。据报道,许多 Oracle 帐户实际上没有权限查询v$transaction视图,因此,当在数据库连接失败时,此功能已被修改为优雅地回退,其中方言将假定“READ COMMITTED”是默认的隔离级别,就像在 SQLAlchemy 1.3.21 之前的情况一样。但是,现在必须明确使用Connection.get_isolation_level()方法引发异常,因为具有此限制的 Oracle 数据库明确禁止用户读取当前隔离级别。
参考:#5784
oracle
- [oracle] [bug]
修复了由于#5755引起的回归,该回归实现了对 Oracle 的隔离级别支持。据报道,许多 Oracle 帐户实际上没有权限查询v$transaction视图,因此,当在数据库连接失败时,此功能已被修改为优雅地回退,其中方言将假定“READ COMMITTED”是默认的隔离级别,就像在 SQLAlchemy 1.3.21 之前的情况一样。但是,现在必须明确使用Connection.get_isolation_level()方法引发异常,因为具有此限制的 Oracle 数据库明确禁止用户读取当前隔离级别。
参考:#5784
1.3.21
发布日期:2020 年 12 月 17 日
orm
- [orm] [bug]
对于传递给relationship.secondary的映射类或字符串映射类名的情况,添加了全面的检查和信息丰富的错误消息。这是一个极其常见的错误,需要清晰的消息。
另外,针对relationship.secondary参数,添加了一个新的规则到类注册表解析中,如果一个映射类及其表的字符串名称相同,则优先考虑Table解析该参数。在所有其他情况下,如果类和表共享相同的名称,则仍然优先考虑类。
参考:#5774 - [orm] [bug]
修复了Query.update()中的一个 bug,即当_ormsession.Session中的对象已经过期时,通过“evaluate”同步策略刷新时会不必要地单独进行 SELECT 操作。
参考:#5664 - [orm] [bug]
修复了涉及 ORM 事件的restore_load_context选项(例如InstanceEvents.load())的 bug,使得标志不会传递给在首次建立事件处理程序之后映射的子类。
参考:#5737
sql
- [sql] [bug]
如果多次调用类似Insert.returning()的returning()方法,会发出警告,因为目前还不支持累加操作。版本 1.4 将支持此功能。此外,任何组合Insert.returning()和ValuesBase.return_defaults()方法现在会引发错误,因为这些方法是互斥的;之前的操作会悄无声息地失败。
参考:#5691 - [sql] [bug]
修复了结构编译器问题,其中一些构造(如 MySQL / PostgreSQL 的“on conflict / on duplicate key”)依赖于Compiler对象的状态固定为它们的语句作为顶层语句,这在这些语句从不同上下文分支出来的情况下会失败,比如与 SQL 语句相关联的 DDL 构造。
参考:#5656
postgresql
- [postgresql] [用例]
为ExcludeConstraint对象添加了新参数ExcludeConstraint.ops,以支持此约束的操作符类规范。感谢 Alon Menczer 的拉取请求。
参考:#5604 - [postgresql] [bug] [mysql]
修复了在 1.3.2 中引入的 PostgreSQL 方言的回归,也复制到了 1.3.18 中 MySQL 方言的功能,其中使用非Table构造(如text())作为Select.with_for_update.of参数时,将无法在 PostgreSQL 或 MySQL 编译器中正确处理。
参考:#5729
mysql
- [mysql] [bug] [reflection]
修复了在仅包含值中包含小数点的 MariaDB 上反映服务器默认值时出现问题的问题,导致反映的表缺少任何服务器默认值。
参考:#5744 - [mysql] [sql]
将缺失的关键字添加到 MySQL 方言的RESERVED_WORDS列表中:action,level,mode,status,text,time。感谢 Oscar Batori 的拉取请求。
参考:#5696
sqlite
- [sqlite] [usecase]
添加了sqlite_with_rowid=False方言关键字,以启用创建CREATE TABLE … WITHOUT ROWID表。感谢 Sean Anderson 的补丁。
参考:#5685
mssql
- [mssql] [bug]
修复了当同时指定mssql-include和mssql_where时,CREATE INDEX 语句呈现不正确的错误。感谢@Adiorz 的拉取请求。
参考:#5751 - [mssql] [bug]
将 SQL Server 代码“01000”添加到断开连接代码列表中。
参考:#5646 - [mssql] [reflection] [sqlite]
修复了复合主键列未按正确顺序报告的问题。感谢@fulpm 的补丁。
参考:#5661
oracle
- [oracle] [usecase]
实现了对 Oracle 数据库的 SERIALIZABLE 隔离级别的支持,以及对Connection.get_isolation_level()的真实实现。
另请参阅
事务隔离级别 / 自动提交
参考:#5755
orm
- [orm] [bug]
对于将映射类或字符串映射类名称传递给relationship.secondary的情况,添加了全面的检查和信息丰富的错误消息。这是一个极其常见的错误,需要清晰的消息。
另外,增加了一个新规则到类注册解析中,关于relationship.secondary参数,如果映射类及其表的字符串名称相同,则在解析此参数时将优先选择Table。在所有其他情况下,如果类和表共享相同的名称,则继续优先选择类。
参考:#5774 - [orm] [bug]
修复了Query.update()中的错误,当_ormsession.Session中的对象已过期时,会在刷新时不必要地单独进行 SELECT 查询。
参考:#5664 - [orm] [bug]
修复了关于 ORM 事件的restore_load_context选项(如InstanceEvents.load())的错误,使得标志不会被传递给在事件处理程序首次建立之后映射的子类。
参考:#5737
sql
- [sql] [bug]
当Insert.returning()等返回方法被多次调用时,会发出警告,因为目前不支持累加操作。版本 1.4 将支持此功能。此外,任何Insert.returning()和ValuesBase.return_defaults()方法的组合现在都会引发错误,因为这些方法是互斥的;以前这个操作会悄悄失败。
参考:#5691 - [sql] [bug]
修复了一些结构编译器问题,例如 MySQL / PostgreSQL 的 “on conflict / on duplicate key” 会依赖于Compiler对象的状态被固定为其语句的顶级语句,这在这些语句从不同上下文分支出来时会失败,比如与 SQL 语句链接到 DDL 构造。
参考:#5656
postgresql
- [postgresql] [usecase]
向ExcludeConstraint对象添加了新参数ExcludeConstraint.ops,以支持此约束的操作符类规范。感谢 Alon Menczer 的拉取请求。
参考:#5604 - [postgresql] [bug] [mysql]
修复了在 1.3.2 中引入的针对 PostgreSQL 方言的回归,也在 1.3.18 中复制到了 MySQL 方言的功能中,其中使用非Table构造(如text())作为Select.with_for_update.of参数将无法在 PostgreSQL 或 MySQL 编译器中正确处理。
参考:#5729
mysql
- [mysql] [bug] [reflection]
修复了在 MariaDB 上反射仅包含值中的小数点的服务器默认值时无法正确反映的问题,导致反映的表缺乏任何服务器默认值。
参考:#5744 - [mysql] [sql]
将缺少的关键字添加到 MySQL 方言的RESERVED_WORDS列表中:action、level、mode、status、text、time。感谢 Oscar Batori 的拉取请求。
参考:#5696
sqlite
- [sqlite] [usecase]
添加了sqlite_with_rowid=False方言关键字,以启用创建表为CREATE TABLE … WITHOUT ROWID。感谢 Sean Anderson 的补丁。
参考:#5685
mssql
- [mssql] [bug]
修复了当同时指定mssql-include和mssql_where时,CREATE INDEX 语句呈现不正确的 bug。感谢 @Adiorz 的拉取请求。
参考:#5751 - [mssql] [bug]
将 SQL Server 代码“01000”添加到断开连接代码列表中。
参考:#5646 - [mssql] [reflection] [sqlite]
修复了复合主键列未按正确顺序报告的问题。感谢 @fulpm 的补丁。
参考:#5661
oracle
- [oracle] [usecase]
实现了对 Oracle 数据库的 SERIALIZABLE 隔离级别的支持,以及对Connection.get_isolation_level()的真正实现。
另请参见
事务隔离级别 / 自动提交
参考:#5755
1.3.20
发布日期:2020 年 10 月 12 日
orm
- [orm] [bug]
如果Query.join()的目标参数设置为未映射对象,则现在会引发带有更多详细信息的ArgumentError。在此更改之前,会引发一个不太详细的AttributeError。感谢 Ramon Williams 提交的拉取请求。
参考:#4428 - [orm] [bug]
修复了针对实际上不是映射属性的字符串属性名称(例如普通的 Python 描述符)使用加载器选项会引发一个不具信息性的 AttributeError 的问题;现在会引发一个描述性错误。
参考:#4589
引擎
- [engine] [bug]
修复了将非字符串对象发送到SQLAlchemyError或其子类时(某些第三方方言会出现此情况),无法正确字符串化的问题。感谢 Andrzej Bartosiński 提交的拉取请求。
参考:#5599 - [engine] [bug]
修复了未在 sqlalchemy.exc 模块内使用 SQLAlchemy 的标准延迟导入系统的函数级别导入。
参考:#5632
sql
- [sql] [bug]
修复了针对Over构造执行pickle.dumps()操作会产生递归溢出的问题。
参考:#5644 - [sql] [bug]
修复了在将column()添加到多个table()时未引发错误的错误。对于Column和Table对象,现在正确引发错误。当发生这种情况时,现在会引发ArgumentError。
参考:#5618
postgresql
- [postgresql] [usecase]
psycopg2 方言现在支持通过将主机/端口组合传递给查询字符串来支持 PostgreSQL 多主机连接。感谢 Ramon Williams 提交的拉取请求。
另请参阅
指定多个备用主机
参考:#4392 - [postgresql] [bug]
调整了Comparator.any()和Comparator.all()方法,以实现直接的“NOT”操作进行否定,而不是否定比较运算符。
参考:#5518 - [postgresql] [bug]
修复了ENUM类型在测试期间在发出 CREATE TYPE 或 DROP TYPE 时不会查看模式转换映射是否存在该类型的问题。此外,修复了一个问题,即如果在单个 DDL 序列中多次遇到相同的枚举,则“check”查询将重复运行,而不是依赖于缓存值。
参考:#5520
mysql
- [mysql] [用例]
调整了 MySQL 方言,以正确地将函数索引表达式括在括号中,这是 MySQL 8 所接受的。感谢 Ramon Williams 的拉取请求。
参考:#5462 - [mysql] [更改]
添加了新的 MySQL 保留字:cube,lateral分别在 MySQL 8.0.1 和 8.0.14 中添加;这表示如果作为表或列标识符名称使用这些术语,它们将被引用。
参考:#5539 - [mysql] [bug]
使用with_for_update()中的“skip_locked”关键字在 MariaDB 后端上使用时会发出警告,然后将被忽略。这是一种已弃用的行为,在 SQLAlchemy 1.4 中将会引发错误,因为请求“skip locked”的应用程序正在寻找一个在这些后端上不可用的非阻塞操作。
参考:#5568 - [mysql] [bug]
修复了针对使用 MySQL 多表格式的 JOIN 的 UPDATE 语句的一个 bug,如果语句没有 WHERE 子句,那么目标表的表前缀将不会被包括在内,因为在那个特定点只有 WHERE 子句被扫描以检测“多表更新”。现在,如果目标是 JOIN,则也会被扫描,以获取最左边的表作为主表和其他条目作为额外的 FROM 条目。
参考:#5617
mssql
- [mssql] [bug]
修复了一个问题,即使用authentication=ActiveDirectoryIntegrated的 Azure DW 的 SQLAlchemy 连接 URI(没有用户名+密码)未以 Azure DW 实例可接受的方式构建 ODBC 连接字符串。
参考:#5592
测试
- [测试] [bug]
修复了针对 Pytest 6.x 运行时测试套件中的不兼容性。
参考:#5635
misc
- [bug] [池]
修复了在调用Engine.dispose()时,以下池参数未传播到新创建的池的问题:pre_ping,use_lifo。此外,recycle和reset_on_return参数现在也传播到AssertionPool类。
参考:#5582 - [bug] [associationproxy] [ext]
当尝试将一个关联代理元素用作要从中选择或在 SQL 函数中使用的普通列表达式时,现在会引发一个信息丰富的错误;目前不支持这种用例。
参考:#5541, #5542
orm
- [orm] [bug]
如果Query.join()的目标参数设置为未映射对象,则现在会引发带有更多详细信息的ArgumentError。在此更改之前,会引发一个不太详细的AttributeError。感谢 Ramon Williams 提供的拉取请求。
参考:#4428 - [orm] [bug]
修复了针对实际上不是映射属性的字符串属性名称(例如普通的 Python 描述符)使用加载器选项会引发一个不具描述性的 AttributeError 的问题;现在会引发一个描述性错误。
参考:#4589
引擎
- [engine] [bug]
修复了将非字符串对象发送到SQLAlchemyError或其子类时(某些第三方方言会发生这种情况),无法正确字符串化的问题。感谢 Andrzej Bartosiński 提供的拉取请求。
参考:#5599 - [engine] [bug]
修复了未在 sqlalchemy.exc 模块内使用 SQLAlchemy 标准的延迟导入系统的函数级别导入。
参考:#5632
sql
- [sql] [bug]
修复了针对Over构造的pickle.dumps()操作会导致递归溢出的问题。
参考:#5644 - [sql] [bug]
修复了一个 bug,在此 bug 中,当一个column()被同时添加到多个table()时,错误未被引发。现在对于Column和Table对象,此错误已正确引发。当这种情况发生时,现在会引发ArgumentError。
参考:#5618
postgresql
- [postgresql] [usecase]
psycopg2 方言现在支持 PostgreSQL 多主机连接,通过将主机/端口组合传递给查询字符串。拉取请求由拉蒙·威廉姆斯提供。
另请参阅
指定多个备用主机
参考:#4392 - [postgresql] [bug]
调整了Comparator.any()和Comparator.all()方法,以实现直接的“NOT”操作来进行否定,而不是对比运算符的否定。
参考:#5518 - [postgresql] [bug]
修复了一个问题,即当ENUM类型在发出 CREATE TYPE 或 DROP TYPE 期间不会查看模式转换映射时,问题仍然存在。另外,修复了一个问题,即如果在单个 DDL 序列中多次遇到相同的枚举,则“check”查询将重复运行,而不是依赖于缓存的值。
参考:#5520
mysql
- [mysql] [usecase]
调整了 MySQL 方言,以正确地将功能性索引表达式括在括号中,这符合 MySQL 8 的规范。拉取请求由拉蒙·威廉姆斯提供。
参考:#5462 - [mysql] [change]
添加了新的 MySQL 保留字:cube、lateral分别在 MySQL 8.0.1 和 8.0.14 中添加;这表示如果作为表或列标识符名称使用这些术语,它们将被引用。
参考:#5539 - [mysql] [bug]
当在 MariaDB 后端使用with_for_update()中的 “skip_locked” 关键字时,将发出警告,然后将被忽略。这是一种已弃用的行为,在 SQLAlchemy 1.4 中将会引发错误,因为请求“跳过锁定”表示的是一种不可用于这些后端的非阻塞操作。
参考:#5568 - [mysql] [bug]
修复了一个 bug,即针对使用 MySQL 多表格式的 JOIN 进行 UPDATE 语句时,如果语句没有 WHERE 子句,则目标表的表前缀将不会被包括,因为只有 WHERE 子句被扫描以检测“多表更新”在那个特定点。现在,如果目标是 JOIN,则也会被扫描,以获取最左边的表作为主表和其他条目作为额外的 FROM 条目。
参考:#5617
mssql
- [mssql] [bug]
修复了一个问题,即使用authentication=ActiveDirectoryIntegrated(没有用户名+密码)的 Azure DW 的 SQLAlchemy 连接 URI 未构建出可接受的 ODBC 连接字符串,无法被 Azure DW 实例接受。
参考:#5592
测试
- [tests] [bug]
修复了在针对 Pytest 6.x 运行时测试套件中的不兼容性。
参考:#5635
杂项
- [bug] [pool]
修复了当调用Engine.dispose()时,以下池参数未传播到新创建的池的问题:pre_ping,use_lifo。此外,recycle和reset_on_return参数现在也传播到AssertionPool类。
参考:#5582 - [bug] [associationproxy] [ext]
当尝试将关联代理元素用作要从中选择或在 SQL 函数中使用的普通列表达式时,现在会引发一个信息性错误;目前不支持这种用例。
参考:#5541, #5542
1.3.19
发布日期:2020 年 8 月 17 日
orm
- [orm] [usecase]
调整了Mapper.all_orm_descriptors()访问器的工作方式,以一种确定性的方式表示属性,假设使用 Python 3.6 或更高版本,它根据属性声明的方式维护类属性的排序顺序。然而,这种排序并不保证在所有情况下都与属性的声明顺序匹配;请参考方法文档以获取确切的方案。
参考:#5494
orm 声明
- [orm] [declarative] [usecase]
当使用AbstractConcreteBase和ConcreteBase类时,现在可以自定义虚拟列的名称,以允许具有实际命名为type的列的模型。拉取请求由 Jesse-Bakker 提供。
参考:#5513
sql
- [sql] [bug]
修复了一个问题,即“ORDER BY”子句渲染标签名称而不是完整表达式的问题,在某些情况下,如果表达式被括在括号分组中,将无法发生。此案例已添加到测试支持。此更改还调整了 ORM 查询中“在 DISTINCT 存在时自动添加 ORDER BY 列”的行为,1.4 中已弃用,以更准确地检测已存在的列表达式。
参考:#5470 - [sql] [bug] [datatypes]
LookupError消息现在将向用户提供通过Enum约束的列的最多四个可能值。超过 11 个字符的值将被截断并替换为省略号。拉取请求由 Ramon Williams 提供。
参考:#4733 - [sql] [bug]
修复了当使用Connection.execution_options.schema_translate_map功能时,当使用Sequence的Column.server_default参数中的Sequence.next_value()函数,并发出创建表 DDL 时,Connection.execution_options.schema_translate_map功能将不起作用的问题。
参考:#5500
postgresql
- [postgresql] [bug]
修复了各种 RANGE 比较运算符的返回类型本身将是相同的 RANGE 类型而不是 BOOLEAN 的问题,这将导致在使用定义了结果处理行为的TypeDecorator的情况下产生不良结果。拉取请求由 Jim Bosch 提供。
参考:#5476
mysql
- [mysql] [usecase]
MySQL 方言将为没有 FROM 子句但有 WHERE 子句的 SELECT 语句呈现 FROM DUAL。这允许像“SELECT 1 WHERE EXISTS (subquery)”这样的查询以及其他用例。
参考:#5481 - [mysql] [bug]
修复了一个问题,即 CREATE TABLE 语句未正确指定 COLLATE 关键字。
参考:#5411 - [mysql] [bug]
将 MariaDB 代码 1927 添加到“断开连接”代码列表中,因为最近的 MariaDB 版本显然在数据库服务器停止时使用此代码。
参考:#5493
sqlite
- [sqlite] [bug] [mssql] [reflection]
对所有包含的方言进行了一次扫描,以确保包含单引号或双引号的名称在查询系统表时得到正确转义,对于所有接受对象名称作为参数的Inspector方法(例如表名、视图名等)。修复了 SQLite 和 MSSQL 中存在的两个引号问题。
参考:#5456
mssql
- [mssql] [bug] [sql]
修复了一个 bug,即 mssql 方言错误地转义包含‘]’字符的对象名称。
参考:#5467
misc
- [usecase] [py3k]
向DeclarativeMeta.__init__()方法添加了一个**kw参数。这允许类支持PEP 487元类钩子__init_subclass__。感谢 Ewen Gillies 的拉取请求。
参考:##5357
orm
- [orm] [usecase]
调整了Mapper.all_orm_descriptors()访问器的工作方式,以一种确定性的方式表示属性,假设使用 Python 3.6 或更高版本,该版本基于声明的顺序维护类属性的排序顺序。但是,这种排序不能保证在所有情况下与属性的声明顺序匹配;请参阅方法文档以获取确切的方案。
参考:#5494
orm declarative
- [orm] [declarative] [usecase]
当使用AbstractConcreteBase和ConcreteBase类时,现在可以自定义虚拟列的名称,以允许具有实际命名为type的列的模型。感谢 Jesse-Bakker 的拉取请求。
参考:#5513
sql
- [sql] [bug]
修复了一个问题,即“ORDER BY”子句渲染标签名称而不是完整表达式,在某些情况下,如果表达式被括在括号分组中,将无法发生。此案例已添加到测试支持中。此更改还调整了 ORM 查询的“在 DISTINCT 存在时自动添加 ORDER BY 列”的行为,在 1.4 中已弃用,以更准确地检测已存在的列表达式。
参考:#5470 - [sql] [bug] [datatypes]
LookupError消息现在将向用户提供通过Enum约束的列的最多四个可能值。长度超过 11 个字符的值将被截断并替换为省略号。拉取请求由 Ramon Williams 提供。
参考:#4733 - [sql] [bug]
修复了Connection.execution_options.schema_translate_map功能在使用Sequence的Column.server_default参数中的Sequence.next_value()函数时不起作用,并且创建表 DDL 被发出。
参考:#5500
postgresql
- [postgresql] [bug]
修复了各种 RANGE 比较运算符的返回类型本身将是相同的 RANGE 类型而不是 BOOLEAN 的问题,这将导致在使用定义了结果处理行为的TypeDecorator时产生不良��果。拉取请求由 Jim Bosch 提供。
参考:#5476
mysql
- [mysql] [usecase]
MySQL 方言将为没有 FROM 子句但有 WHERE 子句的 SELECT 语句呈现 FROM DUAL。这允许像“SELECT 1 WHERE EXISTS (subquery)”这样的查询以及其他用例。
参考:#5481 - [mysql] [bug]
修复了 CREATE TABLE 语句未正确指定 COLLATE 关键字的问题。
参考:#5411 - [mysql] [bug]
将 MariaDB 代码 1927 添加到“断开连接”代码列表中,因为最近的 MariaDB 版本显然在数据库服务器停止时使用此代码。
参考:#5493
sqlite
- [sqlite] [错误] [mssql] [反射]
对所有包含的方言进行了一次扫描,以确保在查询系统表时,包含单引号或双引号的名称在所有接受对象名称作为参数的Inspector方法中得到正确转义(例如表名、视图名等)。修复了 SQLite 和 MSSQL 中存在的两个引号问题。
参考:#5456
mssql
- [mssql] [错误] [sql]
修复了 mssql 方言错误地转义包含‘]’字符的对象名称的错误。
参考:#5467
杂项
- [用例] [py3k]
向DeclarativeMeta.__init__()方法添加了一个**kw参数。这允许类支持PEP 487元类钩子__init_subclass__。感谢 Ewen Gillies 的拉取请求。
参考:##5357
1.3.18
发布日期:2020 年 6 月 25 日
orm
- [orm] [用例]
在查询中使用Query.filter_by()时,如果第一个实体不是映射类,则改进错误消息。
参考:#5326 - [orm] [用例]
向query_expression()构造添加了一个新参数query_expression.default_expr,如果未使用with_expression()选项,则将自动应用于查询。感谢 Haoyu Sun 的拉取请求。
参考:#5198
示例
- [示例] [更改]
在 examples.performance 套件中添加了新选项--raw,它将为任意数量的性能分析可视化工具提供原始配置文件测试。删除了“runsnake”选项,因为在这一点上很难构建 runsnake;
引擎
- [引擎] [错误]
进一步完善了对#5326中修复的“reset”代理的修复,现在在未正确调用时会发出警告并纠正行为。已经确定并修复了发出此警告的其他情况。
参考:#5326 - [引擎] [错误]
修复了URL对象中的问题,其中对对象进行字符串化不会对特殊字符进行 URL 编码,导致 URL 无法重新使用为真实 URL。感谢 Miguel Grinberg 的拉取请求。
参考:#5341
sql
- [sql] [使用案例]
在table()构造中添加了一个“.schema”参数,允许临时表达式也包括模式名称。拉取请求由 Dylan Modesitt 提供。
参考:#5309 - [sql] [更改] [sybase]
为 sybase 方言添加了.offset支持。拉取请求由 Alan D. Snow 提供。
参考:#5294 - [sql] [错误]
正确应用self_group在type_coerce元素中。
在表达式中使用时,类型转换元素未正确应用分组规则。
参考:#5344 - [sql] [错误]
将Select.with_hint()输出添加到在语句上调用str()时生成的通用 SQL 字符串中。以前,此子句将被省略,假定它是方言特定的。提示文本以括号表示,以指示此类提示的渲染在后端之间有所不同。
参考:#5353 - [sql] [模式]
引入IdentityOptions来存储序列和标识列的常见参数。
参考:#5324
模式
- [模式] [错误]
修复了在使用tometadata()复制数据库对象(例如Table)时省略dialect_options的问题。
参考:#5276
mysql
- [mysql] [使用案例]
为 mysql 实现了行级锁定支持。拉取请求由 Quentin Somerville 提供。
参考:#4860
sqlite
- [sqlite] [使用案例]
SQLite 3.31 添加了对计算列的支持。此更改在针对 SQLite 时启用了它们在 SQLAlchemy 中的支持。
参考:#5297 - [sqlite] [错误]
将“exists”添加到 SQLite 的保留字列表中,以便在将其用作标签或列名时将其引用。拉取请求由 Thodoris Sotiropoulos 提供。
参考:#5395
mssql
- [mssql] [更改]
将supports_sane_rowcount_returning = False的要求从PyODBCConnector级别移到MSDialect_pyodbc,因为在某些情况下 pyodbc 不正确工作。
参考:#5321 - [mssql] [错误]
优化了 SQL Server 方言用于解释包含许多点的多部分模式名称的逻辑,以便在名称不使用括号或引号时不会实际丢失任何点,并且还支持一个包含多个部分的“dbname”标记,包括它可能具有多个、独立括号的部分。
参考:#5364, #5366 - [mssql] [错误] [pyodbc]
修复了 pyodbc 连接器中的一个问题,即在使用完全空的 URL 时会发出关于 pyodbc“drivername”的警告。当生成非连接的方言对象或在使用“creator”参数创建引擎时,空 URL 是正常的。现在只有在缺少驱动程序名称但其他参数仍然存在时才会发出警告。
参考:#5346 - [mssql] [错误]
修复了为 pyodbc DBAPI 组装 ODBC 连接字符串时的问题。包含分号和/或大括号“{}”的标记没有被正确转义,导致 ODBC 驱动程序错误解释连接字符串属性。
参考:#5373 - [mssql] [错误]
修复了一个问题,其中datetime.time参数被转换为datetime.datetime,导致它们与实际的TIME列进行比较时不兼容。
参考:#5339 - [mssql] [错误]
修复了 SQL Server pyodbc 方言中is_disconnect函数在异常消息中包含与 SQL Server ODBC 错误代码匹配的子字符串时错误报告断开状态的问题。
参考:#5359
oracle
- [oracle] [错误] [反射]
修复了 Oracle 方言中的一个错误,其中包含完整主键列集的索引会被误认为是主键索引本身,即使存在多个也会被省略。检查已经被优化,以比较主键约束的名称与索引名称本身,而不是根据索引中存在的列来猜测。
参考:#5421
orm
- [orm] [用例]
在查询中使用Query.filter_by()时,如果第一个实体不是映射类,则改进错误消息。
参考:#5326 - [orm] [用例]
为query_expression()构造添加了一个新参数query_expression.default_expr,如果未使用with_expression()选项,则会自动应用于查询。感谢 Haoyu Sun 的拉取请求。
参考:#5198
examples
- [examples] [change]
为 examples.performance 套件添加了新选项--raw,该选项将原始配置文件测试转储以供任意数量的性能分析可视化工具使用。删除了“runsnake”选项,因为此时 runsnake 非常难以构建;
engine
- [engine] [bug]
进一步完善了在 #5326 中修复的“reset”代理的修复程序,现在在未正确调用时会发出警告并纠正其行为。已经确定并修复了额外的情景,在这些情况下会发出此警告。
参考:#5326 - [engine] [bug]
URL对象中的问题已经修复,该对象的字符串化不会对特殊字符进行 URL 编码,导致 URL 无法作为真实的 URL 重新使用。感谢 Miguel Grinberg 的拉取请求。
参考:#5341
sql
- [sql] [usecase]
向table()构造添加了一个“.schema”参数,允许临时表达式也包括模式名称。感谢 Dylan Modesitt 的拉取请求。
参考:#5309 - [sql] [change] [sybase]
向 sybase 方言添加了.offset支持。感谢 Alan D. Snow 的拉取请求。
参考:#5294 - [sql] [bug]
正确应用 self_group 在 type_coerce 元素中。
当在表达式中使用时,类型强制元素未正确应用分组规则
参考:#5344 - [sql] [bug]
在调用语句的str()时,现已将Select.with_hint()的输出添加到产生的通用 SQL 字符串中。先前,该子句会被省略,因为假设它是方言特定的。提示文本显示在括号内,以指示此类提示的呈现在后端之间变化。
参考:#5353 - [sql] [schema]
引入IdentityOptions以存储序列和标识列的常见参数。
参考:#5324
模式
- [模式] [错误]
修复了在使用tometadata()复制数据库对象(例如Table)时省略dialect_options的问题。
参考:#5276
mysql
- [mysql] [用例]
为 mysql 实现了行级锁定支持。感谢 Quentin Somerville 的拉取请求。
参考:#4860
sqlite
- [sqlite] [用例]
SQLite 3.31 添加了对计算列的支持。此更改在针对 SQLite 时启用了 SQLAlchemy 对其的支持。
参考:#5297 - [sqlite] [错误]
将“exists”添加到 SQLite 的保留字列表中,以便在用作标签或列名时将此单词引用。感谢 Thodoris Sotiropoulos 的拉取请求。
参考:#5395
mssql
- [mssql] [更改]
将supports_sane_rowcount_returning = False的要求从PyODBCConnector级别移至MSDialect_pyodbc,因为在某些情况下 pyodbc 可以正常工作。
参考:#5321 - [mssql] [错误]
优化了 SQL Server 方言用于解释包含许多点的多部分模式名称的逻辑,以便在名称未使用括号或引号时实际上不会丢失任何点,并且还支持具有许多部分的“dbname”标记,包括可能具有多个、独立括号的部分。
参考:#5364, #5366 - [mssql] [错误] [pyodbc]
修复了 pyodbc 连接器中的问题,当使用完全空的 URL 时会发出关于 pyodbc “drivername”的警告。在生成非连接的方言对象或在使用“creator”参数创建 create_engine() 时,空 URL 是正常的。现在只有在缺少驱动程序名称但其他参数仍然存在时才会发出警告。
参考:#5346 - [mssql] [错误]
修复了为 pyodbc DBAPI 组装 ODBC 连接字符串的问题。包含分号和/或大括号“{}”的标记未能正确转义,导致 ODBC 驱动程序错误解释连接字符串属性。
参考:#5373 - [mssql] [错误]
修复了将datetime.time参数转换为datetime.datetime的问题,使其与实际TIME列进行>=等比较时不兼容。
参考:#5339 - [mssql] [错误]
修复了 SQL Server pyodbc 方言中的一个问题,即当异常消息中包含与 SQL Server ODBC 错误代码匹配的子字符串时,is_disconnect函数会错误地报告断开状态。
参考:#5359
oracle
- [oracle] [bug] [reflection]
修复了 Oracle 方言中的一个 bug,即包含完整主键列集的索引会被误认为是主键索引本身,即使存在多个索引也会被省略。检查已经被细化为根据主键约束的名称与索引名称本身进行比较,而不是基于索引中存在的列来猜测。
参考:#5421
1.3.17
发布日期:2020 年 5 月 13 日
orm
- [orm] [usecase]
添加了一个访问器Comparator.expressions,它提供对在多列ColumnProperty属性下映射的列组的访问。
参考:#5262 - [orm] [usecase]
引入了relationship.sync_backref标志,用于控制在关系中添加用于同步修改 Python 属性的事件。这取代了先前的更改#5149,该更改警告称viewonly=True关系的 back_populates 或 backref 配置的目标将被禁止。
参考:#5237 - [orm] [bug]
修复了一个 bug,即在已经具有与请求的相同的基于子查询的 with_polymorphic 设置的映射器上,将with_polymorphic()用作通过RelationshipComparator.of_type()进行连接的目标时,ON 子句在连接中不会正确别名化的问题。
参考:#5288 - [orm] [bug]
修复了一个在加载器选项(如 selectinload())与烘焙查询系统交互的领域中的问题,即如果加载器选项本身具有当前不兼容缓存的元素(如 with_polymorphic()对象),则不应发生查询的缓存。在这些一些情况下,烘焙加载器有时无法完全使自身失效,导致错过了急切加载。
参考:#5303 - [orm] [bug]
修改了内部的“identity set”实现,该集合根据其 id()而不是其哈希值对对象进行哈希处理,以避免实际调用对象的__hash__()方法,这些对象通常是用户映射的对象。一些方法调用了这个方法作为实现的副作用。
参考:#5304 - [orm] [bug]
当尝试对不是实际映射实例的对象进行 ORM 多对一比较时,会引发一个信息性错误消息。不支持与标量子查询等比较;使用Comparator.has()更好地实现了与子查询的广义比较。
参考:#5269
引擎
- [engine] [bug]
修复了一个相当关键的问题,即在 DBAPI 连接仍处于未回滚状态时可能将其返回到连接池。负责回滚连接的重置代理可能在事务“关闭”而未回滚或提交的情况下出现损坏,在使用 ORM 会话并以涉及保存点的特定模式发出 .close() 时可能发生这种情况。修复确保重置代理始终处于活动状态。
参考:#5326
模式
- [schema] [bug]
修复了一个问题,即延迟与表关联的Index,例如当它包含一个尚未与任何Table关联的Column时,如果还包含非表导向表达式,则无法正确附加。
参考:#5298 - [schema] [bug]
当使用MetaData.sorted_tables属性以及sort_tables()函数时,如果由于外键约束之间存在循环依赖关系而无法正确排序给定的表,则会发出警告。在这种情况下,这些函数将不再按照外键对涉及的表进行排序,并将发出警告。不属于循环的其他表仍将按依赖顺序返回。以前,当检测到循环时,排序表例程将返回一个集合,该集合在检测到循环时将无条件省略所有外键,并且不会发出警告。
参考:#5316 - [schema]
在Column的__repr__方法中添加了comment属性。
参考:#4138
postgresql
- [postgresql] [用例]
在 PostgreSQL 中添加了对ARRAY、Enum、JSON或JSONB类型的列的支持。以前在这些情况下需要使用一种解决方法。
参考:#5265 - [postgresql] [用例]
在将配置为Enum.native_enum设置为False且Enum.create_constraint未设置为False时,向表添加具有ARRAY类型的列时引发明确的CompileError
参考:#5266
mssql
- [mssql] [bug] [reflection]
修复了在使用旧版 TDS 版本 4.2 时,在 MSSQL 中反射计算列引入的回归。如果无法检测到协议版本,方言将尝试检测首次连接的协议版本并在兼容模式下运行。
参考:#5255 - [mssql] [bug] [reflection]
修复了在使用不支持concat函数的 SQL Server 版本 2012 之前的 MSSQL 中反射计算列引入的回归。
参考:#5271
oracle
- [oracle] [性能] [bug]
更改了获取 CLOB 和 BLOB 对象的实现方式,使用了 cx_Oracle 的原生实现,将 CLOB/BLOB 对象与其他结果列一起获取,而不是执行单独的获取操作。如往常一样,可以通过将 auto_convert_lobs 设置为 False 来禁用此功能。
作为此更改的一部分,给定空字符串的 CLOB 现在在 INSERT 时返回 None,在 SELECT 时与 Oracle 上的 VARCHAR 一致。
参考:#5314 - [oracle] [bug]
对于 cx_oracle 方言如何为 LOB 和数字数据类型设置每列输出类型处理程序进行了一些修改,以适应可能在 cx_Oracle 8 中出现的潜在更改。
参考:#5246
杂项
- [change] [firebird]
调整了firebird://URI 的方言加载,如果已安装外部的 sqlalchemy-firebird 方言,则使用它,否则回退到(现在已弃用的)内部 Firebird 方言。
参考:#5278
orm
- [orm] [用例]
添加了一个访问器Comparator.expressions,它提供了对多列ColumnProperty属性下映射的列组的访问。
参考:#5262 - [orm] [用例]
引入了relationship.sync_backref标志,用于控制是否添加会改变 Python 属性的同步事件。这取代了先前的更改#5149,该更改警告说viewonly=True关系的目标 back_populates 或 backref 配置将被禁止。
参考:#5237 - [orm] [错误]
修复了一个 bug,即在已经具有与请求的等效的基于子查询的 with_polymorphic 设置的映射器上,通过RelationshipComparator.of_type()将with_polymorphic()用作连接的目标时,不会正确别名连接中的 ON 子句。
参考:#5288 - [orm] [错误]
修复了加载器选项(如 selectinload())与烘焙查询系统交互的问题,即如果加载器选项本身包含当前不兼容缓存的元素(如 with_polymorphic()对象),则不应该发生查询的缓存。在这些情况下,烘焙加载器有时无法完全使自身失效,导致错过了急切加载。
参考:#5303 - [orm] [错误]
修改了内部的“identity set”实现,它是一个根据对象的 id()而不是它们的哈希值进行哈希的集合,不再实际调用对象的__hash__()方法,这些对象通常是用户映射的对象。一些方法在实现的副作用中调用了这个方法。
参考:#5304 - [orm] [错误]
当尝试对一个不是实际映射实例的对象进行 ORM 多对一比较时,会引发一个信息丰富的错误消息。不支持与标量子查询之类的比较;使用子查询进行广义比较更好地通过Comparator.has()实现。
参考:#5269
引擎
- [引擎] [错误]
修复了一个相当关键的问题,即在仍处于未回滚状态时将 DBAPI 连接返回到连接池的情况。负责回滚连接的重置代理可能在事务“关闭”而没有被回滚或提交时被破坏,这在使用 ORM 会话并以某种模式发出.close()时可能发生。修复确保重置代理始终处于活动状态。
参考:#5326
模式
- [模式] [错误]
修复了一个问题,即当一个被延迟关联到表的Index,例如当它包含一个尚未与任何Table关联的Column时,如果它还包含一个非表导向的表达式,则无法正确附加。
参考:#5298 - [模式] [错误]
当使用MetaData.sorted_tables属性以及sort_tables()函数时,如果由于外键约束之间存在循环依赖而无法正确排序给定的表,则会发出警告。在这种情况下,函数将不再按外键对涉及的表进行排序,并将发出警告。其他不属于循环的表仍将按依赖顺序返回。以前,当检测到循环时,排序表例程将返回一个集合,该集合在检测到循环时将无条件省略所有外键,并且不会发出警告。
参考:#5316 - [模式]
在Column的__repr__方法中添加comment属性。
参考:#4138
postgresql
- [postgresql] [用例]
在 PostgreSQL 中添加了对Enum、JSON或JSONB类型的列��类型ARRAY的支持。在这些用例中以前需要使用一种解决方法。
参考:#5265 - [postgresql] [用例]
在添加具有配置为Enum.native_enum设置为False的Enum类型的列的表时,引发明确的CompileError,当Enum.create_constraint未设置为False时
参考:#5266
mssql
- [mssql] [错误] [反射]
修复了在使用传统 TDS 版本 4.2 时,通过 MSSQL 计算列的反射引入的回归。方言将尝试检测首次连接的协议版本,如果无法检测到,则运行在兼容模式下。
参考:#5255 - [mssql] [错误] [反射]
修复了在使用不支持concat函数的 SQL Server 版本(2012 年之前)时,通过 MSSQL 计算列的反射引入的回归。
参考:#5271
oracle
- [oracle] [性能] [错误]
更改了获取 CLOB 和 BLOB 对象的实现,以使用 cx_Oracle 的本机实现,该实现将 CLOB/BLOB 对象与其他结果列一起获取,而不是执行单独的获取。一如既往,可以通过将 auto_convert_lobs 设置为 False 来禁用此功能。
作为此更改的一部分,给定空字符串的 CLOB 现在在 INSERT 时返回 None 在 SELECT 时,这与 Oracle 上的 VARCHAR 的行为现在保持一致。
参考:#5314 - [oracle] [错误]
对 cx_oracle 方言如何为 LOB 和数字数据类型设置每列输出类型处理程序进行了一些修改,以调整为 cx_Oracle 8 中可能出现的潜在更改。
参考:#5246
杂项
- [变更] [firebird]
调整了firebird://URI 的方言加载,以便在安装了外部 sqlalchemy-firebird 方言时使用它,否则退回到(现在已弃用的)内部 Firebird 方言。
参考:#5278
1.3.16
发布日期:2020 年 4 月 7 日
orm
- [orm] [performance]
修改了子查询加载和选择加载使用的查询,不再按父实体的主键排序;这种排序是为了允许行按照它们进入的顺序直接复制到列表中,最小程度地进行 Python 端排序。然而,这些 ORDER BY 子句可能会对查询的性能产生负面影响,因为在许多情况下,这些列是从子查询派生的,或者以其他方式不是实际的主键列,以至于 SQL 规划器无法使用索引。Python 端排序使用本机 itertools.group_by()来整理传入的行,并已修改为允许将多个行组合到一起使用 list.extend(),这仍然可以实现相对快速的 Python 端性能。对于包含显式 order_by 参数的关系,仍将存在一个 ORDER BY,但这是查询中唯一添加的 ORDER BY,用于两种加载方式。
参考:#5162 - [orm] [bug]
修复了selectinload()加载选项中的错误,其中代表具有相同字符串键名称的不同关系的两个或更多加载器,从单个具有多个子类映射器的with_polymorphic()构造中引用时,将无法单独调用每个子查询加载器,而是使用单个基于字符串的插槽,这将阻止其他加载器被调用。
参考:#5228 - [orm] [bug]
修复了一个问题,即使用会话本地“get”对目标多对一关系进行惰性加载时,存在具有正确主键的对象,但它是同类的实例时,不会正确返回 None,就像惰性加载器实际发出该行的加载时一样。
参考:#5210
orm 声明式
- [orm] [declarative] [bug]
当使用声明式 API 时,relationship()函数接受的第一个位置参数作为字符串参数不再使用 Python 的eval()函数进行解释;相反,名称是点分隔的,并且名称直接在名称解析字典中查找,而不将值视为 Python 表达式。然而,将字符串参数传递给其他必须接受 Python 表达式的relationship()参数仍将使用eval();文档已经澄清,以确保没有任何歧义。
参见
评估关系参数 - 字符串评估的详细信息
参考:#5238
sql
- [sql] [类型]
在使用字符串方言进行调试时,添加了将DateTime、Date或Time文字编译的能力。此更改不影响保留其当前行为的真实方言实现。
参考:#5052
模式
- [模式] [反射]
添加了对“computed”列的反射支持,这些列现在作为Inspector.get_columns()返回的结构的一部分返回。在反射完整的Table对象时,计算列将使用Computed构造表示。
参考:#5063
postgresql
- [postgresql] [错误]
修复了“covering”索引的问题,例如具有 INCLUDE 子句的索引,将被反映为包含所有 INCLUDE 子句中的列的常规列。如果检测到这些额外列,则现在会发出警告,指示它们当前被忽略。请注意,“covering”索引的全面支持是#4458的一部分。感谢 Marat Sharafutdinov 的拉取请求。
参考:#5205
mysql
- [mysql] [错误]
修复了在连接到伪 MySQL 数据库(例如��ProxySQL 提供的数据库)时 MySQL 方言中的问题,当它返回没有行时对隔离级别进行的事先检查不会阻止方言继续连接。会发出警告,指示无法检测到隔离级别。
参考:#5239
sqlite
- [sqlite] [用例]
在使用 pysqlite 时为 SQLite 实现了 AUTOCOMMIT 隔离级别。
参考:#5164
mssql
- [mssql] [用例] [mysql] [oracle]
为 SQL Server、MySQL 和 Oracle 添加了对ColumnOperators.is_distinct_from()和ColumnOperators.isnot_distinct_from()的支持。
参考:#5137
oracle
- [oracle] [用例]
在使用 cx_Oracle 时为 Oracle 实现了 AUTOCOMMIT 隔离级别。此外,为 Oracle 添加了一个固定的默认隔离级别为 READ COMMITTED。
参考:#5200 - [Oracle] [错误] [反射]
修复了由于修复#5146引起的回归/不正确修复,其中 Oracle 方言从“all_tab_comments”视图读取表注释,但未考虑到请求的表的当前所有者,导致如果多个具有相同名称的表存在于多个模式中,则读取错误的注释。
参考:#5146
测试
- [测试] [错误]
修复了一个问题,该问题导致测试套件无法在最近发布的 py.test 5.4.0 上运行。
参考:#5201
杂项
- [枚举] [类型]
Enum类型现在支持参数Enum.length,用于指定在使用非本机枚举时创建 VARCHAR 列的长度,方法是将Enum.native_enum设置为False
参考:#5183 - [安装程序]
确保“pyproject.toml”文件不包含在构建中,因为此文件的存在会告诉 pip 应该使用 pep-517 安装过程。由于当前工具/发行版似乎不太支持这种操作模式,在 SQLAlchemy 安装范围内通过省略该文件来避免这些问题。
参考:#5207
orm
- [orm] [性能]
修改了子查询加载和选择加载使用的查询,不再按父实体的主键排序;这种排序是为了允许行按照它们进入的顺序直接复制到列表中,以最小的 Python 端排序级别。然而,这些 ORDER BY 子句可能会对查询的性能产生负面影响,因为在许多情况下,这些列是从子查询派生的或者以其他方式不是实际的主键列,以至于 SQL 规划器无法使用索引。Python 端排序使用本机 itertools.group_by()来整理传入的行,并已修改为允许使用 list.extend()将多个行组合到一起,这仍然可以实现相对快速的 Python 端性能。对于包含显式 order_by 参数的关系,仍将存在一个 ORDER BY,但这是唯一将添加到两种加载方式的查询中的 ORDER BY。
参考:#5162 - [orm] [错误]
修复了selectinload()加载选项中的错误,其中代表同一字符串键名称的不同关系的两个或多个加载器,从单个具有多个子类映射器的with_polymorphic()构造引用时,会失败地单独调用每个子查询加载,而是使用单个基于字符串的插槽,这会阻止其他加载器被调用。
参考:#5228 - [orm] [错误]
修复了一个问题,即在对目标多对一关系使用会话本地“get”时,存在具有正确主键的对象,但它是同级类的实例时,懒加载不会像懒加载实际发出该行的加载时那样正确返回 None。
参考:#5210
orm 声明式
- [orm] [声明式] [错误]
当使用声明式 API 时,relationship()函数的第一个位置参数接受的字符串参数不再使用 Python 的eval()函数进行解释;相反,名称是点分隔的,名称直接在名称解析字典中查找,而不将值视为 Python 表达式。然而,将字符串参数传递给其他必须接受 Python 表达式的relationship()参数仍然会使用eval();文档已经明确说明了这一点,以确保这一使用没有歧义。
另请参阅
关系参数的评估 - 字符串评估的详细信息
参考:#5238
sql
- [sql] [类型]
添加对在使用字符串方言进行调试时字面编译DateTime、Date或Time的功能。此更改不影响保留其当前行为的实际方言实现。
参考:#5052
模式
- [模式] [反射]
增加了对“计算”列的反射支持,现在这些列作为Inspector.get_columns()返回的结构的一部分返回。当反映完整的Table对象时,计算列将使用Computed构造表示。
参考:#5063
postgresql
- [postgresql] [bug]
修复了“覆盖”索引的问题,例如具有 INCLUDE 子句的索引,将被反映为包括所有 INCLUDE 子句中的列作为常规列。如果检测到这些附加列,则现在会发出警告,指示当前被忽略。请注意,对“覆盖”索引的完全支持是#4458的一部分。拉请求由 Marat Sharafutdinov 提供。
参考:#5205
mysql
- [mysql] [bug]
修复了连接到伪 MySQL 数据库时 MySQL 方言中的问题,例如由 ProxySQL 提供的数据库,当它返回零行时,隔离级别的前置检查将不会阻止方言继续连接。发出警告,指示无法检测到隔离级别。
参考:#5239
sqlite
- [sqlite] [usecase]
在使用 pysqlite 时,实现了 SQLite 的 AUTOCOMMIT 隔离级别。
参考:#5164
mssql
- [mssql] [usecase] [mysql] [oracle]
添加了对ColumnOperators.is_distinct_from()和ColumnOperators.isnot_distinct_from()在 SQL Server、MySQL 和 Oracle 中的支持。
参考:#5137
oracle
- [oracle] [usecase]
在使用 cx_Oracle 时,实现了 Oracle 的 AUTOCOMMIT 隔离级别。还为 Oracle 添加了固定的默认隔离级别为 READ COMMITTED。
参考:#5200 - [oracle] [bug] [reflection]
由于修复#5146而导致的回归/不正确的修复问题,其中 Oracle 方言从“all_tab_comments”视图中读取表注释,但未能适应请求的当前表的所有者,导致如果多个模式中存在同名表,则会读取错误的注释。
参考:#5146
测试
- [tests] [bug]
修复了一个问题,该问题阻止了最近发布的 py.test 5.4.0 运行测试套件。
参考:#5201
杂项
- [enum] [types]
Enum类型现在支持参数Enum.length来指定创建 VARCHAR 列时的长度,当使用非本地枚举时,通过将Enum.native_enum设置为False。
参考:#5183 - [installer]
确保“pyproject.toml”文件不包含在构建中,因为此文件的存在指示 pip 应使用 pep-517 安装过程。由于当前工具/发行版似乎不太支持这种操作模式,因此通过在 SQLAlchemy 安装范围内省略该文件来避免这些问题。
参考:#5207
1.3.15
发布日期:2020 年 3 月 11 日
orm
- [orm] [bug]
调整了Query.join()发出的错误消息,当无法找到左侧时,Query.select_from()方法是解决问题的最佳方法。此外,在 1.3 系列中,使用确定性排序确定从传递给Query的给定列实体确定 FROM 子句时,以便每次确定相同的表达式。
参考:#5194 - [orm] [bug]
由于#4849导致的 1.3.14 版本中的回归问题已修复,当发生刷新错误时,sys.exc_info() 调用未能正确调用。已为此异常情况添加了测试覆盖。
参考:#5196
orm
- [orm] [bug]
调整了Query.join()发出的错误消息,当无法找到左侧时,Query.select_from()方法是解决问题的最佳方法。此外,在 1.3 系列中,使用确定性排序确定从传递给Query的给定列实体确定 FROM 子句时,以便每次确定相同的表达式。
参考:#5194 - [orm] [bug]
由于#4849导致的 1.3.14 版本中的回归问题已修复,当发生刷新错误时,sys.exc_info() 调用未能正确调用。已为此异常情况添加了测试覆盖。
参考:#5196
1.3.14
发布日期:2020 年 3 月 10 日
通用
- [通用] [错误] [py3k]
对大多数或所有从内部异常捕获中引发的内部异常应用了明确的“原因”,以避免误导性的堆栈跟踪,表明异常处理中存在错误。虽然最好是通过__suppress_context__属性来抑制内部捕获的异常,但目前似乎还没有办法在不抑制包含的用户构造上下文的情况下做到这一点,因此暴露了内部捕获的异常作为原因,以便保持有关错误上下文的完整信息。
参考:#4849
orm
- [orm] [用例]
添加了一个新标志InstanceEvents.restore_load_context和SessionEvents.restore_load_context,适用于InstanceEvents.load()、InstanceEvents.refresh()和SessionEvents.loaded_as_persistent()事件,设置后将在调用事件钩子后恢复对象的“加载上下文”。这确保对象仍然处于已经进行的加载操作的“加载上下文”中,而不是由于事件中可能发生的刷新操作而将对象转移到新的加载上下文。当出现这种情况时,现在会发出警告,建议使用该标志解决此情况。该标志是“选择加入”的,因此不会对现有应用程序引入风险。
此更改还为会话生命周期事件添加了对raw=True标志的支持。
参考:#5129 - [orm] [错误]
修复了 1.3.13 版本中由#5056引起的回归,其中 ORM 路径注册表系统的重构使得路径不再能与空元组进行比较,这可能发生在特定类型的连接式贪婪加载路径中。已解决“空元组”用例,使得路径注册表在所有情况下与路径注册表进行比较;PathRegistry对象本身现在实现了__eq__()和__ne__()方法,这些方法将用于所有相等比较,并继续在未预期的情况下成功比较非PathRegistry对象时发出警告,指出此对象不应是比较的主体。
参考:#5110 - [orm] [bug]
将一个设定为 viewonly=True 的关系同时设置为 back_populates 或 backref 配置的目标现在会发出警告,并最终被禁止。back_populates 特指对属性或集合的变异,当属性受到 viewonly=True 时是不允许的。viewonly 属性不受持久性行为的影响,这意味着当它在本地变异时不会反映正确的结果。
参考:#5149 - [orm] [bug]
修复了与#5080中引入的 1.3.0b3 版本中相同区域的另一个回归问题,通过#4468。在这种情况下,通过with_polymorphic()创建跨越到与该 with_polymorphic 的基类关系的连接选项,然后进一步到常规映射关系会失败,因为基类组件不会以可以被加载策略定位的方式添加到加载路径中。在#5080中应用的更改已经进一步完善,以适应这种情况。
参考:#5121
engine
- [engine] [bug]
执行语句时扩展了游标/连接清理的范围,包括当结果对象无法构建时,或者 after_cursor_execute()事件引发错误,或者 autocommit/autoclose 失败。这允许在失败时清理 DBAPI 游标,并且对于无连接执行,允许关闭连接并将其返回到连接池,之前等待直到垃圾回收触发池返回。
参考:#5182
sql
- [sql] [bug] [postgresql]
修复了一个 bug,即一个 INSERT/UPDATE/DELETE 的 CTE 也使用 RETURNING,然后无法直接从中选择,因为编译器的内部状态会尝试将外部 SELECT 视为 DELETE 语句本身并访问不存在的状态。
参考:#5181
postgresql
- [postgresql] [bug]
修复了“schema_translate_map”功能与 PostgreSQL 本机枚举类型(即Enum,ENUM)不起作用的问题,即在发出“CREATE TYPE”语句时,枚举被引用的地方的 CREATE TABLE 语句中不会呈现正确的模式。
参考:#5158 - [postgresql] [bug] [reflection]
修复了 PostgreSQL 反射 CHECK 约束时无法解析约束的 bug,如果 SQL 文本包含换行符,则会失败。正则表达式已经调整以适应这种情况。感谢 Eric Borczuk 提供的拉取请求。
参考:#5170
mysql
- [mysql] [bug]
修复了 MySQLInsert.on_duplicate_key_update()构造中的问题,其中对于列参数使用 SQL 函数或其他组合表达式将不正确地渲染围绕列本身的VALUES关键字。
参考:#5173
mssql
- [mssql] [bug]
修复了DATETIMEOFFSET类型无法容纳None值的问题,该问题是为了修复此类型而首次引入的一系列修复之一,首次引入于#4983、#5045。此外,还增加了通过此类型传递后端特定日期格式字符串的支持,这通常允许在大多数其他 DBAPI 上的日期/时间类型上使用。
参考:#5132
oracle
- [oracle] [bug]
修复了一个反射 bug,表注释只能检索由用户拥有的表,而不能检索对用户可见但由其他人拥有的表。感谢 Dave Hirschfeld 提供的拉取请求。
参考:#5146
杂项
- [用例] [扩展]
为MutableList.sort()函数添加了关键字参数,以便提供键函数以及“reverse”关键字参数。
参考:#5114 - [性能] [bug]
修订了作为#5085结果添加到测试系统的内部更改,即在使用该方言时会无条件加载每个方言的与测试相关的模块,将 SQLAlchemy 的测试框架以及 ORM 引入模块导入空间。这只会对初始启动时间和内存产生一定影响,但最好这些附加模块不会反向依赖于直接的 Core 使用。
参考:#5180 - [bug] [安装]
将inspect.formatannotation函数放入sqlalchemy.util.compat中,这是inspect.formatargspec的版本化版本所需的。该函数在 cPython 中没有文档,并且不能保证在未来的 Python 版本中可用。
参考:#5138
一般
- [通用] [错误] [py3k]
对大多数,如果不是所有内部引发的异常应用了明确的“cause”,这些异常是从内部异常捕获中引发的,以避免误导性的堆栈跟踪,表明异常处理中存在错误。虽然最好是抑制内部捕获的异常,就像__suppress_context__属性那样,但目前似乎还没有一种方法可以在不抑制封闭的用户构造上下文的情况下做到这一点,因此它将内部捕获的异常公开为原因,以便保持有关错误上下文的完整信息。
参考:#4849
ORM
- [ORM] [用例]
添加了一个新标志InstanceEvents.restore_load_context和SessionEvents.restore_load_context,适用于InstanceEvents.load()、InstanceEvents.refresh()和SessionEvents.loaded_as_persistent()事件,设置后将在事件钩子调用后恢复对象的“加载上下文”。这确保对象仍然保持在已经进行的加载操作的“加载上下文”中,而不是由于刷新操作可能发生在事件中而将对象转移到新的加载上下文。当出现这种情况时,现在会发出警告,建议使用该标志解决此情况。该标志是“选择加入”的,因此不会对现有应用程序引入风险。
此更改还为会话生命周期事件添加了对raw=True标志的支持。
参考:#5129 - [ORM] [错误]
修复了 1.3.13 版本中由#5056引起的回归,其中对 ORM 路径注册系统进行的重构使得路径不再能与空元组进行比较,这可能发生在特定类型的连接式急加载路径中。已解决“空元组”使用情况,使得路径注册在所有情况下与路径注册进行比较;PathRegistry对象本身现在实现了__eq__()和__ne__()方法,这些方法将在所有相等比较中生效,并继续成功处理未预期的情况,即比较非PathRegistry对象时,同时发出警告,指出该对象不应是比较的主体。
参考:#5110 - [ORM] [错误]
将设置一个关系为 viewonly=True,而该关系也是 back_populates 或 backref 配置的目标时会发出警告,并最终不再支持。back_populates 特指属性或集合的变化,当属性设为 viewonly=True 时不允许变化。viewonly 属性不受持久性行为的影响,这意味着当它在本地变化时不会反映出正确的结果。
参考:#5149 - [orm] [bug]
修复了与 #5080 相同区域的另一个回归问题,在 1.3.0b3 中通过 #4468 引入,通过with_polymorphic()创建跨越关系到基类的 joined option,然后进一步到常规映射关系会失败,因为基类组件不会以可以被加载策略定位的方式添加到加载路径中。在 #5080 中应用的更改已进一步精细化,以适应此场景。
参考:#5121
引擎
- [engine] [bug]
扩展了在执行语句时游标/连接清理的范围,包括当无法构造结果对象时,或者 after_cursor_execute() 事件引发错误,或者自动提交 / 自动关闭失败时。这允许在失败时清理 DBAPI 游标,并且在无连接执行时允许连接关闭并返回到连接池,之前它等待垃圾回收触发连接池返回。
参考:#5182
sql
- [sql] [bug] [postgresql]
修复了一个问题,在 INSERT/UPDATE/DELETE 的 CTE 中同时使用 RETURNING 时,无法直接从中 SELECT 的 bug。因为编译器的内部状态会尝试将外部 SELECT 当作 DELETE 语句本身并访问不存在的状态。
参考:#5181
postgresql
- [postgresql] [bug]
修复了一个问题,即“schema_translate_map”功能无法与 PostgreSQL 原生枚举类型(即Enum,ENUM)一起工作,因为虽然“CREATE TYPE”语句会以正确的模式发出,但模式不会在引用枚举时在 CREATE TABLE 语句中呈现。
参考:#5158 - [postgresql] [bug] [reflection]
修复了 PostgreSQL 反射 CHECK 约束的 bug,如果 SQL 文本包含换行符,则解析约束会失败。正则表达式已经调整以适应这种情况。感谢 Eric Borczuk 提交的拉取请求。
参考:#5170
mysql
- [mysql] [bug]
修复了 MySQLInsert.on_duplicate_key_update()构造中的问题,其中对于列参数使用 SQL 函数或其他组合表达式时,不会正确渲染围绕列本身的VALUES关键字。
参考:#5173
mssql
- [mssql] [bug]
修复了DATETIMEOFFSET类型无法容纳None值的问题,这是为了修复此类型的一系列问题而引入的,首次在 #4983 中引入,#5045。此外,还增加了通过此类型传递后端特定日期格式字符串的支持,这通常允许在大多数其他 DBAPI 上的日期/时间类型上使用。
参考:#5132
oracle
- [oracle] [bug]
修复了一个反射 bug,表注释只能检索由用户拥有的表,而不能检索对用户可见但由其他人拥有的表。感谢 Dave Hirschfeld 提交的拉取请求。
参考:#5146
misc
- [usecase] [ext]
为MutableList.sort()函数添加了关键字参数,以便提供键函数以及“reverse”关键字参数。
参考:#5114 - [performance] [bug]
修订了由于 #5085 导致的测试系统的内部更改,其中对于每个方言的测试相关模块将在使用该方言时无条件加载,将 SQLAlchemy 的测试框架���及 ORM 引入模块导入空间。这只会对初始启动时间和内存产生一定影响,但最好这些额外模块不会反向依赖于直接的 Core 使用。
参考:#5180 - [bug] [installation]
在sqlalchemy.util.compat中添加了inspect.formatannotation函数的供应版本,这是inspect.formatargspec的供应版本所需的。该函数在 cPython 中没有文档,并且不能保证在未来的 Python 版本中可用。
参考:#5138
SqlAlchemy 2.0 中文文档(六十)(4)https://developer.aliyun.com/article/1560732