SqlAlchemy 2.0 中文文档(六十一)(3)https://developer.aliyun.com/article/1560911
1.2.0
发布日期:2017 年 12 月 27 日
ORM
- [ORM] [特性]
向 ORM 的标识键元组添加了一个新的数据成员,称为“identity_token”。此令牌默认为 None,但可以被数据库分片方案用来区分内存中具有相同主键但来自不同数据库的对象。水平分片扩展将此令牌与分片标识符应用,从而允许主键在水平分片后端之间重复。
另请参阅
支持分片的标识键增强
参考:#4137 - [ORM] [错误] [扩展]
修复了关联代理无意中将自身链接到AliasedClass
对象的错误,如果首先使用AliasedClass
作为父级调用,会导致后续使用时出错。
此更改也回溯到���1.1.15
参考:#4116 - [ORM] [错误]
修复了在contains_eager()
查询选项中的错误,其中使用PropComparator.of_type()
引用跨多个连接级别到子类的路径还需要提供“别名”参数,并且需要与同一子类型一起使用aliased()
对象;此外,对于使用aliased()
对象作为PropComparator.of_type()
参数的子类,使用contains_eager()
也将正确渲染。
参考:#4130 - [orm] [bug]
Query.exists()
方法现在将在查询被渲染时禁用急加载器。先前,连接的急加载连接将被不必要地渲染,以及不必要地生成子查询急加载查询。新行为与Query.subquery()
方法相匹配。
参考:#4032
orm 声明式
- [orm] [声明式] [bug]
修复了在刷新操作期间引用描述符时的错误,该描述符是基于AbstractConcreteBase
的层次结构中的映射列或其他位置的关系。由于该属性未映射为映射器属性,因此会导致错误。如果类未在其映射器中包含“concrete=True”,则还可能出现类似的问题,例如AbstractConcreteBase
添加的“type”列,但是此处的检查也应防止该方案引起问题。
此更改也回溯到:1.1.15
参考:#4124
引擎
- [engine] [feature]
URL
对象的“password”属性现在可以是任何用户定义或用户子类化的字符串对象,该对象对 Pythonstr()
内置函数做出响应。传递的对象将作为数据成员URL.password_original
维护,并在读取URL.password
属性以生成字符串值时进行查询。
参考:#4089
sql
- [sql] [bug]
修复了如果参数是元组,则ColumnDefault
的__repr__
会失败的错误。感谢 Nicolas Caniart 提供的拉取请求。
此更改也回溯到:1.1.15
参考:#4126 - [sql] [bug]
重新设计了在 1.2.0b2 中引入的 startswith(),endswith()的新“autoescape”选项中的新“autoescape”功能,使其完全自动化;转义字符现在默认为斜杠"/"
,并应用于百分号、下划线以及转义字符本身,以实现完全自动转义。也可以使用“escape”参数更改字符。
另请参阅
startswith(),endswith()的新“autoescape”选项
参考:#2694 - [sql] [bug]
修复了Table.tometadata()
方法无法正确适应不由简单列表达式组成的Index
对象的错误,例如针对text()
构造的索引,使用 SQL 表达式或func
的索引等。现在该程序将表达式完全复制到新的Index
对象中,同时将所有绑定到目标表的Column
对象替换为目标表的对象。
参考:#4147 - [sql] [bug]
将ColumnElement
的“visit name”从“column”更改为“column_element”,这样当此元素被用作用户定义的 SQL 元素的基础时,不会被各种 SQL 遍历工具(通常由 ORM 使用)处理时假定其行为类似于绑定到表的ColumnClause
。
参考:#4142 - [sql] [bug] [ext]
修复了ARRAY
数据类型中的问题,本质上与 #3832 的问题相同,只是不是一个回归,即在ARRAY
上的列附加事件不会正确触发,从而干扰依赖于此的系统。这个问题破坏的一个关键用例是使用 mixins 声明使用MutableList.as_mutable()
的列。
参考:#4141 - [sql] [bug]
修复了新的“扩展绑定参数”功能中的 bug,即如果一个语句中使用了多个参数,则正则表达式将无法正确匹配参数名。
参考:#4140 - [sql] [enhancement]
在 PostgreSQL、MySQL、MS SQL Server(以及不支持的 Sybase 方言中)实现了“DELETE…FROM”语法,类似于“UPDATE…FROM”的工作方式。引用多个表的 DELETE 语句将切换到“多表”模式,并呈现数据库理解的适当的“USING”或多表“FROM”子句。感谢 Pieter Mulder 的拉取请求。
另请参阅
DELETE 的多表条件支持
参考:#959
postgresql
- [postgresql] [feature]
添加了新的MONEY
数据类型。感谢 Cleber J Santos 的拉取请求。
mysql
- [mysql] [bug]
MySQL 5.7.20 现在警告使用 @tx_isolation 变量;现在执行版本检查并使用 @transaction_isolation 代替以防止此警告。
此更改也回溯到:1.1.15
参考:#4120 - [mysql] [bug]
修复了从问题 1.2.0b3 中的回归,其中“MariaDB”版本比较可能在某些特定的 MariaDB 版本字符串下在 Python 3 中失败。
参考:#4115
mssql
- [mssql] [bug]
修复了在 pyodbc 中 sqltypes.BINARY 和 sqltypes.VARBINARY 数据类型不包含正确的 bound-value 处理程序的 bug,这允许传递 pyodbc.NullParam 值以帮助 FreeTDS。
参考:#4121
oracle
- [oracle] [bug]
添加了一些额外规则,以完全处理使用asdecimal=True
时,cx_Oracle 数值中的Decimal('Infinity')
、Decimal('-Infinity')
值。
参考:#4064
杂项
- [misc] [feature]
在文档中添加了一个新的错误部分,其中包含关于常见错误消息的背景信息。SQLAlchemy 中的选定异常将在其字符串输出中包含指向此页面相关部分的链接。 - [enhancement] [ext]
添加了新方法Result.with_post_criteria()
到烘焙查询系统,允许在从缓存中提取查询后进行非 SQL 修改转换。此方法可以与ShardedQuery
一起使用,以设置分片标识符。ShardedQuery
也已经修改,使其ShardedQuery.get()
方法与Result
的方法正确交互。
参考:#4135
orm
- [orm] [功能]
向 ORM 的身份映射中使用的身份键元组添加了一个名为“identity_token”的新数据成员。此令牌默认为 None,但可以被数据库分片方案用来区分来自不同数据库的具有相同主键的内存对象。水平分片扩展将此令牌与分片标识符结合起来,从而允许主键在水平分片后端之间重复。
另请参见
支持分片的身份键增强
参考:#4137 - [orm] [错误] [扩展]
修复了关联代理在首次使用时会错误地将自身链接到AliasedClass
对象的错误,如果首先将AliasedClass
作为父级调用,将导致后续使用时出现错误。
此更改也已回溯到:1.1.15
参考:#4116 - [orm] [错误]
修复了contains_eager()
查询选项中的错误,其中使用路径使用PropComparator.of_type()
引用跨越多个级别的连接到子类的情况还需要提供“alias”参数,以避免向查询添加不需要的 FROM 子句;此外,跨子类使用aliased()
对象作为PropComparator.of_type()
参数使用contains_eager()
也将正确呈现。
参考:#4130 - [orm] [错误]
Query.exists()
方法现在在查询被渲染时会禁用急加载器。以前,连接急加载连接会被不必要地渲染,以及子查询急加载查询也会被不必要地生成。新行为与Query.subquery()
方法相匹配。
参考:#4032
orm declarative
- [orm] [declarative] [bug]
修复了一个 bug,其中描述符,在基于AbstractConcreteBase
的层次结构中的映射列或关系,在刷新操作期间会被引用,导致错误,因为该属性未映射为映射器属性。如果类未在其映射器中包含“concrete=True”,则类似问题也可能出现在其他属性上,比如AbstractConcreteBase
添加的“type” 列,但此处的检查也应防止该场景引起问题。
此更改也被 回溯 至:1.1.15
参考:#4124
engine
- [engine] [feature]
URL
对象的“password”属性现在可以是任何用户定义或用户子类化的字符串对象,该对象响应于 Python 的str()
内置函数。传递的对象将保持为数据成员URL.password_original
,并在读取URL.password
属性时进行查询以生成字符串值。
参考:#4089
sql
- [sql] [bug]
修复了__repr__
的ColumnDefault
在参数为元组时会失败的错误。感谢 Nicolas Caniart 提交的拉取请求。
此更改也被 回溯 至:1.1.15
参考:#4126 - [sql] [bug]
重新设计了在 1.2.0b2 中引入的 New “autoescape” option for startswith(), endswith() 中的新“autoescape”功能,现在完全自动化;转义字符现在默认为正斜杠"/"
,并应用于百分号、下划线,以及转义字符本身,实现完全自动转义。该字符也可以使用“escape”参数进行更改。
另请参阅
New “autoescape” option for startswith(), endswith()
参考:#2694 - [sql] [bug]
修复了Table.tometadata()
方法无法正确适应不仅由简单列表达式组成的Index
对象,例如针对text()
构造的索引,使用 SQL 表达式或func
的索引等。现在,该例程将完全复制表达式到新的Index
对象,同时将所有绑定到目标表的Column
对象替换为目标表的对象。
参考:#4147 - [sql] [bug]
将ColumnElement
的“visit name”从“column”更改为“column_element”,这样当此元素用作用户定义的 SQL 元素的基础时,不会被假定为在被各种 SQL 遍历工具处理时表现得像绑定到表的ColumnClause
,这些工具通常被 ORM 使用。
参考:#4142 - [sql] [bug] [ext]
修复了ARRAY
数据类型中的问题,本质上与 #3832 的问题相同,只是不是一个回归,即在ARRAY
上的列附加事件不会正确触发,从而干扰依赖此功能的系统。这一问题破坏的一个关键用例是使用 mixins 声明使用MutableList.as_mutable()
的列。
参考:#4141 - [sql] [bug]
修复了新的“扩展绑定参数”功能中的 bug,即如果一个语句中使用了多个参数,则正则表达式将无法正确匹配参数名称。
参考:#4140 - [sql] [enhancement]
实现了针对 PostgreSQL、MySQL、MS SQL Server(以及不支持的 Sybase 方言)的“DELETE…FROM”语法,类似于“UPDATE…FROM”工作方式。引用多个表的 DELETE 语句将切换到“多表”模式,并根据数据库理解的方式生成适当的“USING”或多表“FROM”子句。感谢 Pieter Mulder 的拉取请求。
另请参阅
支持多表条件的 DELETE
参考:#959
postgresql
- [postgresql] [feature]
添加了新的MONEY
数据类型。感谢 Cleber J Santos 的拉取请求。
mysql
- [mysql] [bug]
MySQL 5.7.20 现在警告使用@tx_isolation 变量;现在执行版本检查并使用@transaction_isolation 代替以防止此警告。
此更改也回溯到:1.1.15
参考:#4120 - [mysql] [bug]
修复了从问题 1.2.0b3 中的回归,其中“MariaDB”版本比较可能在某些特定 MariaDB 版本字符串下在 Python 3 下失败。
参考:#4115
mssql
- [mssql] [bug]
修复了一个 bug,其中 sqltypes.BINARY 和 sqltypes.VARBINARY 数据类型不会为 pyodbc 包括正确的绑定值处理程序,这允许传递 pyodbc.NullParam 值,有助于 FreeTDS。
参考:#4121
oracle
- [oracle] [bug]
添加了一些额外规则,以完全处理Decimal('Infinity')
,Decimal('-Infinity')
值与使用asdecimal=True
时的 cx_Oracle 数值。
参考:#4064
misc
- [misc] [feature]
在文档中添加了一个新的错误部分,介绍常见错误消息的背景。SQLAlchemy 中的选定异常将在其字符串输出中包含指向此页面相关部分的链接。 - [enhancement] [ext]
添加了新方法Result.with_post_criteria()
到烘焙查询系统,允许在查询从缓存中拉取后进行非 SQL 修改转换。除其他外,此方法可与ShardedQuery
一起使用以设置分片标识符。ShardedQuery
也已修改,使其ShardedQuery.get()
方法与Result
的方法正确交互。
参考:#4135
1.2.0b3
发布日期:2017 年 10 月 13 日
orm
- [orm] [bug]
修复了一个 bug,其中 ORM 关系会警告存在冲突的同步目标(例如,两个关系都将写入同一列)对于继承层次结构中的兄弟类,在这种情况下,两个关系实际上永远不会在写入时发生冲突。
此更改也回溯到:1.1.15
参考:#4078 - [orm] [bug]
修复了一个 bug,其中针对单表继承实体使用相关选择会导致外部查询无法正确呈现,因为调整单一继承鉴别器条件不适当地重新应用于外部查询。
此��改也回溯到:1.1.15
参考:#4103 - [orm] [bug]
在Session.merge()
中修复了一个错误,与#4030类似,其中对于标识映射中的目标对象的内部检查,如果在合并过程实际检索对象之前立即被垃圾回收,可能会导致错误。
此更改也回溯到:1.1.14
参考:#4069 - [orm] [bug]
修复了一个错误,即如果从使用连接式急加载加载的关系扩展,则不会识别undefer_group()
选项。此外,由于该错误导致执行过多的工作,因此在结果集列的初始计算中,Python 函数调用次数也提高了 20%,这与#3915的连接急加载改进相辅相成。
此更改也回溯到:1.1.14
参考:#4048 - [orm] [bug]
修复了一个错误,在Session.merge()
中,如果集合中的对象的主键属性设置为None
,而该属性通常是自动递增的键,则在内部去重过程的一部分中,这些对象将被视为数据库持久化键,导致实际上只有一个对象被插入到数据库中。
此更改也回溯到:1.1.14
参考:#4056 - [orm] [bug]
当针对不是针对MapperProperty
的属性(如关联代理)使用synonym()
时,会引发InvalidRequestError
。以前,尝试定位不存在的属性会导致递归溢出。
此更改也回溯到:1.1.14
参考:#4067 - [orm] [bug]
修复了 1.2.0b1 中引入的回归问题,由于#3934,如果回滚失败(目标问题是当 MySQL 丢失 SAVEPOINT 时),Session
将无法“停用”事务。这将导致随后对Session.rollback()
的调用再次引发错误,而不是完成并将Session
恢复为活动状态。
参考:#4050 - [orm] [bug]
修复了make_transient_to_detached()
函数会使目标对象上的所有属性过期的问题,包括“延迟加载”属性,这会导致下一次刷新时属性被取消延迟加载,从而导致属性意外加载。
参考:#4084 - [orm] [bug]
修复了涉及 delete-orphan 级联的 bug,其中相关项目在父对象成为会话的一部分之前成为孤儿,仍然被跟踪为进入孤儿状态,导致其从会话中被清除而不是被刷新。
注意
这个修复在 1.2.0b3 发布期间被错误地合并,并且没有被添加到更改日志中。这个更改日志注释是作为版本 1.2.13 的一部分事后添加的。
参考:#4040 - [orm] [bug]
修复了“selectin”多态加载,使用单独的 IN 查询加载子类中的错误,该错误阻止了多级类层次结构中“selectin”和“inline”设置按预期交互。
参考:#4026 - [orm] [bug]
移除了当映射器和加载策略使用的 LRU 缓存达到阈值时发出的警告;最初这个警告的目的是防止生成过多的缓存键,但后来基本上成为“创建许多引擎”反模式的检查。虽然这仍然是一个反模式,但测试套件中既为每个测试创建一个引擎又在所有警告上引发的存在将是一个不便;对于这个警告,这些测试套件改变其架构并不是必要的(尽管每个测试一个引擎的套件总是更好)。
参考:#4071 - [orm] [bug]
修复了一个回归问题,即在与延迟加载关系选项一起使用undefer_group()
选项时,由于 1.2 版本中作为#3954的一部分添加的 SQL 缓存键生成中的错误,会导致属性错误。
参考:#4049 - [orm] [bug]
修改了在#3366中对 ORM 更新/删除评估器所做的更改,如果更新或删除中存在未映射的列表达式,并且评估器可以将其名称与目标类的映射列匹配,将发出警告,而不是引发 UnevaluatableError。这本质上是 1.2 版本之前的行为,目的是允许正在依赖此模式的应用程序进行迁移。但是,如果给定的属性名称无法与映射器的列匹配,仍会引发 UnevaluatableError,这是在#3366中修复的问题。
参考:#4073
orm declarative
- [orm] [declarative] [bug]
如果子类尝试覆盖在父类上声明的属性,并使用@declared_attr.cascading
,则会发出警告,指出覆盖的属性将被忽略。这种用例无法在更深层次的子类中得到完全支持,因此为了一致性,无论覆盖属性如何,“级联”都会一直被遵守。
参考:#4091 - [orm] [declarative] [bug]
如果使用@declared_attr.cascading
属性与特殊的声明名称(如__tablename__
)一起使用,则会发出警告,因为这没有效果。
参考:#4092
engine
- [engine] [feature]
向ResultProxy
添加了__next__()
和next()
方法,以便直接在对象上使用next()
内置函数。ResultProxy
长期以来已经有一个__iter__()
方法,允许它响应iter()
内置函数。__iter__()
的实现未更改,因为性能测试表明,使用带有StopIteration
的__next__()
方法进行迭代在 Python 2.7 和 3.6 中都要慢大约 20%。
参考:#4077 - [engine] [bug]
对Pool
和Connection
进行了一些调整,使得在pool.Empty
、AttributeError
异常捕获下不会运行恢复逻辑,因为当恢复操作本身失败时,Python 3 会创建一个误导性的堆栈跟踪,将Empty
/AttributeError
作为原因,而实际上这些异常捕获是控制流的一部分。
参考文献:#4028
sql
- [sql] [bug]
修复了最近添加的ColumnOperators.any_()
和ColumnOperators.all_()
方法在作为方法调用时不起作用的错误,与使用独立函数any_()
和all_()
相对,还为这些相对不直观的 SQL 运算符添加了文档示例。
此更改还 反向移植 至:1.1.15
参考文献:#4093 - [sql] [bug]
添加了一个新方法DefaultExecutionContext.get_current_parameters()
,该方法在函数型默认值生成器中使用,以便检索传递给语句的当前参数。新函数与DefaultExecutionContext.current_parameters
属性不同之处在于,它还提供了参数的可选分组,这些参数对应于多值“插入”构造。以前无法识别与函数调用相关的参数子集。
请参阅
用于具有上下文默认生成器的多值插入的参数辅助程序
上下文敏感的默认函数
参考文献:#4075 - [sql] [bug]
修复了新的 SQL 注释功能中的错误,当使用Table.tometadata()
时,表和列注释不会被复制。
参考文献:#4087 - [sql] [bug]
在版本 1.1 中,Boolean
类型存在问题,即通过bool()
进行布尔强制转换会发生在不支持“原生布尔”的后端,但不会发生在原生布尔后端,这意味着字符串"0"
现在表现不一致。经过一次投票,达成共识,即非布尔值应该引发错误,特别是在字符串"0"
的模棱两可情况下;因此,如果传入值不在范围None, True, False, 1, 0
内,Boolean
数据类型现在将引发ValueError
。
参见
布尔数据类型现在强制执行严格的 True/False/None 值
参考:#4102 - [sql] [bug]
优化了Operators.op()
的行为,使得在所有情况下,如果Operators.op.is_comparison
标志设置为 True,则生成表达式的返回类型将是Boolean
,如果标志为 False,则生成表达式的返回类型将与左侧表达式的类型相同,这是其他运算符的典型默认行为。还添加了一个新参数Operators.op.return_type
以及一个辅助方法Operators.bool_op()
。
参见
自定义运算符的类型行为已经保持一致
参考:#4063 - [sql] [bug]
对Enum
、Interval
和Boolean
类型进行了内部优化,现在它们都扩展了一个通用的 mixinEmulated
,表示提供了对数据库本地类型的 Python 端模拟,在使用支持的后端时切换到数据库本地类型。直接使用 PostgreSQLINTERVAL
类型现在将包括正确的类型强制转换规则,对于也适用于Interval
的 SQL 表达式(例如将日期添加到间隔会产生日期时间)。
参考:#4088
postgresql
- [postgresql] [feature]
向 psycopg2 方言添加了一个新标志use_batch_mode
。当Engine
调用cursor.executemany()
时,此标志启用了 psycopg2 的psycopg2.extras.execute_batch
扩展。此扩展在批量运行 INSERT 语句时提供了关键的性能提升,性能提升超过一个数量级。该标志默认为 False,因为目前被认为是实验性的。
另请参阅
批处理模式/快速执行助手的支持
参考:#4109 - [postgresql] [bug]
针对与 COLLATE 一起的ARRAY
类进行了进一步修复,因为在#4006中进行的修复未能适应多维数组。
此更改也回溯至:1.1.15
参考:#4006 - [postgresql] [bug]
修复了array_agg
函数中的错误,其中传递一个已经是ARRAY
类型的参数,例如 PostgreSQLarray
构造,将产生ValueError
,因为函数尝试嵌套数组。
此更改也回溯至:1.1.15
参考:#4107 - [postgresql] [bug]
修复了 PostgreSQLInsert.on_conflict_do_update()
中的错误,该错误将阻止将插入语句用作 CTE,例如通过Insert.cte()
在另一个语句中使用。
此更改也回溯至:1.1.15
参考:#4074 - [postgresql] [bug]
修复了 pg8000 驱动程序在使用带有模式名称的MetaData.reflect()
时会失败的错误,因为模式名称将作为“quoted_name”对象发送,该对象是一个字符串子类,pg8000 不识别。连接时将 quoted_name 类型添加到 pg8000 的 py_types 集合中。
参考:#4041 - [postgresql] [bug]
为 pg8000 驱动程序启用了 UUID 支持,支持此数据类型的本机 Python uuid 往返。但是仍不���持 UUID 数组。
参考:#4016
mysql
- [mysql] [bug]
当检测到 MariaDB 10.2.8 或更早版本的 10.2 系列时,会发出警告,因为这些版本中的 CHECK 约束存在重大问题,这些问题在 10.2.9 中已解决。
请注意,此更改日志消息并未随 SQLAlchemy 1.2.0b3 发布,而是事后添加的。
此更改也被回溯到:1.1.15
参考:#4097 - [mysql] [bug]
修复了在 MariaDB 10.2 系列中,由于语法更改,导致 CURRENT_TIMESTAMP 无法正确反映的问题,现在该函数表示为current_timestamp()
。
此更改也被回溯到:1.1.15
参考:#4096 - [mysql] [bug]
MariaDB 10.2 现在支持 CHECK 约束(警告:由于上游问题,请使用版本 10.2.9 或更高版本,详见 #4097)。反射现在在SHOW CREATE TABLE
输出中考虑这些 CHECK 约束。
此更改也被回溯到:1.1.15
参考:#4098 - [mysql] [bug]
将新的 MySQL INSERT…ON DUPLICATE KEY UPDATE 结构的.values
属性更名为.inserted
,因为Insert
已经有一个名为Insert.values()
的方法。.inserted
属性最终呈现 MySQL 的VALUES()
函数。
参考:#4072
sqlite
- [sqlite] [bug]
修复了 SQLite CHECK 约束反射失败的 bug,如果引用的表位于远程模式中,例如 SQLite 中由 ATTACH 引用的远程数据库。
此更改也被回溯到:1.1.15
参考:#4099
mssql
- [mssql] [feature]
添加了一个新的TIMESTAMP
数据类型,对 SQL Server 而言,它正确地像二进制数据类型而不是 datetime 类型,因为 SQL Server 在这里违反了 SQL 标准。还添加了ROWVERSION
,因为 SQL Server 中的TIMESTAMP
类型已被弃用,改用 ROWVERSION。
参考:#4086 - [mssql] [feature]
为 PyODBC 和 pymssql 方言添加了对“AUTOCOMMIT”隔离级别的支持,通过Connection.execution_options()
来建立,这个隔离级别在底层连接对象上设置适当的 DBAPI 特定标志。
参考:#4058 - [mssql] [bug]
为 SQL Server 的 PyODBC 方言添加了一整套“连接关闭”异常代码,包括‘08S01’、‘01002’、‘08003’、‘08007’、‘08S02’、‘08001’、‘HYT00’、‘HY010’。以前只覆盖了‘08S01’。
此更改也被回溯到:1.1.15
参考:#4095 - [mssql] [bug]
SQL Server 支持 SQLAlchemy 称之为“本地布尔”的 BIT 类型,因为此类型仅接受 0 或 1,而 DBAPI 将其值返回为 True/False。因此,SQL Server 方言现在启用了“本地布尔”支持,即不为Boolean
数据类型生成 CHECK 约束。与其他本地布尔的唯一区别是没有“true” / “false”常量,因此这里仍然呈现为“1”和“0”。
参考:#4061 - [mssql] [bug]
修复了 pymssql 方言中 SQL 文本中的百分号,例如在模数表达式或文字值中使用的情况,不会加倍,这似乎是 pymssql 所期望的。尽管 pymssql DBAPI 使用“pyformat”参数样式,该样式认为百分号是重要的。
参考:#4057 - [mssql] [bug]
修复了 SQL Server 方言在反射自引用外键约束时可能从多个模式中提取列的错误,如果多个模式包含相同名称的约束针对相同名称的表。
参考:#4060 - [mssql] [bug] [orm]
对于特定于“RETURNING”的方言的“rowcount 支持”添加了一个新类,当在使用时,例如在 SQL Server 上看起来像“OUTPUT inserted”时,PyODBC 后端无法在 OUTPUT 生效时给我们提供 UPDATE 或 DELETE 语句的 rowcount。这主要影响 ORM,当刷新正在更新包含服务器计算值的行时,如果后端未返回预期的行数,则会引发错误。PyODBC 现在声明支持 rowcount,除非存在 OUTPUT.inserted,ORM 在刷新期间会考虑是否寻找 rowcount。
参考:#4062 - [mssql] [bug] [orm]
为 pymssql 方言启用了“sane_rowcount”标志,表示 DBAPI 现在从 UPDATE 或 DELETE 语句中报告受影响的行数。这主要影响 ORM 版本功能,因为现在它可以验证目标版本上受影响的行数。 - [mssql] [bug]
添加了一个规则到 SQL Server 索引反射中,忽略所谓的在未指定聚集索引的表上隐式存在的“堆”索引。
参考:#4059
oracle
- [oracle] [性能] [bug] [py2k]
由于修复#3937导致的性能回归已修复,因为 cx_Oracle 从版本 5.3 开始从其命名空间中删除了.UNICODE
符号,这被解释为 cx_Oracle 的“WITH_UNICODE”模式被无条件打开,从而在 SQLAlchemy 端调用函数将所有字符串无条件转换为 unicode 并导致性能影响。实际上,根据 cx_Oracle 的作者,“WITH_UNICODE”模式自 5.1 起已被完全移除,因此如果在 Python 2 下检测到 cx_Oracle 5.1 或更高版本,则不再需要昂贵的 unicode 转换函数,并且如果检测到 cx_Oracle 5.1 或更高版本,则会禁用这些函数。在#3937中删除的针对“WITH_UNICODE”模式的警告也已恢复。
此更改也回溯到:1.1.13,1.0.19
参考:#4035 - [oracle] [bug]
使用 cx_Oracle 实现了对 Oracle 值“无穷大”的部分支持,仅使用 Python 浮点值,例如float("inf")
。目前,cx_Oracle DBAPI 驱动程序尚未实现对 Decimal 的��持。
参考:#4064 - [oracle] [bug]
cx_Oracle 方言已经重构和现代化,以利用在旧的 4.x 系列 cx_Oracle 中不存在的新模式。其中最重要的变化涉及类型转换,主要是关于数字/浮点和 LOB 数据类型,更有效地利用 cx_Oracle 类型处理挂钩简化了绑定参数和结果数据的处理方式。
另请参阅
cx_Oracle 方言,类型系统的重大重构 - [oracle] [bug]
对于所有版本的 cx_Oracle,cx_Oracle 的两阶段支持已完全移除,而在 1.2.0b1 中,此更改仅对 cx_Oracle 的 6.x 系列生效。这个功能在任何版本的 cx_Oracle 中都从未正常工作过,在 cx_Oracle 6.x 中,SQLAlchemy 依赖的 API 被移除。
另请参阅
cx_Oracle 方言,类型系统的重大重构
参考:#3997 - [oracle] [bug]
当使用Insert.returning()
与 cx_Oracle 后端时,结果集中的列键现在使用正确的列名/标签,与所有其他方言一样。以前,这些列名为ret_nnn
。
另请参阅
cx_Oracle 方言,类型系统的重大重构 - [oracle] [bug]
cx_Oracle 方言的几个参数现在已被弃用且不会产生任何效果:auto_setinputsizes
,exclude_setinputsizes
,allow_twophase
。
另请参阅
对 cx_Oracle 方言、类型系统进行了重大重构 - [oracle] [bug]
修复了在 Oracle 下反映出的带有“column DESC”表达式的索引不会返回的 bug,如果表也没有主键,这是由于逻辑尝试过滤掉 Oracle 隐式添加到主键列上的索引所导致的。
参考:#4042 - [oracle] [bug]
修复了由 cx_Oracle 6.0 引起的更多回归问题;目前,用户唯一的行为变化是断开连接检测现在除了检测 cx_Oracle.InterfaceError 外还检测 cx_Oracle.DatabaseError,因为这种行为似乎已经改变。关于数值精度和无法关闭连接的其他问题仍在上游 cx_Oracle 问题跟踪器中等待处理。
参考:#4045 - [oracle] [bug]
修复了 Oracle 8 中“非 ANSI”连接模式不会向使用=
运算符以外的运算符的表达式添加(+)
运算符的 bug。(+)
需要添加到右侧的所有列。
参考:#4076
orm
- [orm] [bug]
修复了 ORM 关系在继承层次结构中的兄弟类中可能会发出警告,提示存在同步目标冲突的 bug(例如,两个关系都写入同一列),而这两个关系实际上在写入时永远不会发生冲突。
此更改也回溯到:1.1.15
参考:#4078 - [orm] [bug]
修复了针对单表继承实体使用的相关查询在外部查询中无法正确呈现的 bug,因为单一继承鉴别器条件的调整不当地重新应用到外部查询中。
此更改也回溯到:1.1.15
参考:#4103 - [orm] [bug]
修复了Session.merge()
中的 bug,与#4030类似,其中对于标识映射中的目标对象的内部检查,如果在合并过程实际检索对象之前立即被垃圾回收,可能会导致错误。
此更改也回溯到:1.1.14
参考:#4069 - [orm] [bug]
修复了一个 bug,当undefer_group()
选项不被识别时,如果它是从使用联合急加载加载的关系扩展的。此外,由于该错误导致额外的工作被执行,Python 函数调用计数也在结果集列的初始计算中提高了 20%,这与#3915的联合急加载改进相辅相成。
这个改变也被回溯到了:1.1.14
参考文献:#4048 - [orm] [bug]
修复了Session.merge()
中的一个 bug,当集合中的对象的主键属性设置为None
时,通常是自动增量的键,则会将其视为数据库持久化键的一部分,用于内部去重处理过程,导致只有一个对象实际上被插入数据库。
这个改变也被回溯到了:1.1.14
参考文献:#4056 - [orm] [bug]
当对一个不是针对MapperProperty
的属性(例如关联代理)使用synonym()
时,会引发InvalidRequestError
。以前,尝试定位不存在的属性时会导致递归溢出。
这个改变也被回溯到了:1.1.14
参考文献:#4067 - [orm] [bug]
由于#3934引入的 1.2.0b1 中的回归已修复,即使回滚失败(目标问题是当 MySQL 丢失 SAVEPOINT 时),Session
也不会“停用”事务。这将导致对Session.rollback()
的后续调用再次引发错误,而不是完成并将Session
带回 ACTIVE 状态。
参考文献:#4050 - [orm] [bug]
修复了make_transient_to_detached()
函数的问题,该函数会使目标对象上的所有属性过期,包括“延迟加载”属性,导致属性在下一次刷新时被取消延迟加载,从而导致属性意外加载。
参考文献:#4084 - [orm] [bug]
修复了涉及删除孤立级联的错误,其中相关项目在父对象成为会话的一部分之前变为孤立状态,但仍然被跟踪为进入孤立状态,结果是它被从会话中删除而不是被刷新。
注意
这个修复在 1.2.0b3 版本中被无意中合并,并且在那个时候没有被添加到更改日志中。这个更改日志记录是作为 1.2.13 版本的一部分进行了补充的。
参考:#4040 - [orm] [bug]
修复了“selectin”多态加载,使用单独的 IN 查询加载子类中的错误,该错误阻止了多级类层次结构中的“selectin”和“inline”设置按预期进行交互。
参考:#4026 - [orm] [bug]
移除了当映射器和加载器策略所使用的 LRU 缓存达到阈值时发出的警告;最初该警告的目的是防止生成过多的缓存键,但后来基本上成为了对“创建许多引擎”反模式的检查。尽管这仍然是一个反模式,但存在同时为每个测试创建一个引擎并且在所有警告上引发的测试套件将是一个不便;这种测试套件不应该因为这个警告而改变它们的架构(尽管每个测试一个引擎的套件总是更好)。
参考:#4071 - [orm] [bug]
修复了一个回归,其中在与延迟加载关系选项结合使用undefer_group()
选项时,由于在 1.2 中作为#3954的一部分添加的 SQL 缓存键生成中存在错误,导致属性错误。
参考:#4049 - [orm] [bug]
修改了在#3366中对 ORM 更新/删除评估器所做的更改,以便如果更新或删除中存在未映射的列表达式,并且评估器可以将其名称与目标类的映射列相匹配,则发出警告,而不是引发 UnevaluatableError。这基本上是 1.2 版本之前的行为,目的是允许正在依赖此模式的应用程序进行迁移。然而,如果给定的属性名称无法与映射器的列匹配,则仍然会引发 UnevaluatableError,这是在#3366中修复的问题。
参考:#4073
orm 声明性
- [orm] [declarative] [bug]
如果子类试图覆盖在父类上使用@declared_attr.cascading
声明的属性,则会发出警告,表明覆盖的属性将被忽略。这种用法不能完全支持到更进一步的子类,需要更复杂的开发工作,因此为了一致性,无论覆盖属性如何,都会一直遵循“级联”一直下去。
参考:#4091 - [orm] [declarative] [bug]
如果@declared_attr.cascading
属性与特殊的声明性名称(例如__tablename__
)一起使用,则会发出警告,因为这没有效果。
参考:#4092
engine
- [engine] [feature]
为ResultProxy
添加了__next__()
和next()
方法,以便直接在对象上使用next()
内置函数。ResultProxy
长期以来已经有了__iter__()
方法,它已经允许它响应iter()
内置函数。__iter__()
的实现没有改变,因为性能测试表明,使用带有StopIteration
的__next__()
方法进行迭代在 Python 2.7 和 3.6 中都慢约 20%。
参考:#4077 - [engine] [bug]
对Pool
和Connection
进行了一些调整,以便在pool.Empty
、AttributeError
的异常捕获下不运行恢复逻辑,因为当恢复操作本身失败时,Python 3 会创建一个误导性的堆栈跟踪,将Empty
/AttributeError
误认为是原因,而实际上这些异常捕获是控制流的一部分。
参考:#4028
sql
- [sql] [bug]
修复了最近添加的ColumnOperators.any_()
和ColumnOperators.all_()
方法在被调用为方法时不起作用的错误,与使用独立函数any_()
和all_()
相反。还为这些相对不直观的 SQL 操作添加了文档示例。
这个更改也回溯到:1.1.15
参考:#4093 - [sql] [bug]
添加了一个新的方法DefaultExecutionContext.get_current_parameters()
,用于在基于函数的默认值生成器中检索传递给语句的当前参数。新函数与DefaultExecutionContext.current_parameters
属性不同之处在于,它还提供了对与多值“插入”构造相对应的参数的可选分组。以前不可能确定与函数调用相关的参数子集。
另请参阅
多值插入的参数辅助工具带有上下文默认生成器
上下文敏感的默认函数
参考:#4075 - [sql] [bug]
修复了新 SQL 注释功能中的错误,其中在使用Table.tometadata()
时,表和列注释不会被复制。
参考:#4087 - [sql] [bug]
在 1.1 版本中,Boolean
类型存在问题,即在没有“本地布尔值”的后端中,通过bool()
进行布尔强制转换,但在本地布尔后端中不会发生,这意味着字符串"0"
现在的行为不一致。经过投票,达成共识,即非布尔值应该引发错误,特别是在字符串"0"
的模糊情况下;因此,如果传入值不在None, True, False, 1, 0
范围内,Boolean
数据类型现在会引发ValueError
。
另请参阅
布尔数据类型现在强制使用严格的 True/False/None 值
参考:#4102 - [sql] [bug]
优化了Operators.op()
的行为,使得在所有情况下,如果Operators.op.is_comparison
标志设置为 True,则结果表达式的返回类型将是Boolean
,如果标志为 False,则结果表达式的返回类型将与左侧表达式的类型相同,这是其他运算符的典型默认行为。还添加了一个新参数Operators.op.return_type
以及一个辅助方法Operators.bool_op()
。
参见
自定义运算符的类型行为已经变得一致
参考:#4063 - [sql] [错误]
对Enum
、Interval
和Boolean
类型进行内部优化,现在它们都扩展了一个名为Emulated
的通用混合类型,表示提供了对数据库原生类型的 Python 端模拟,在使用支持的后端时切换到数据库原生类型。直接使用 PostgreSQL 的INTERVAL
类型现在将包括正确的类型强制转换规则,这些规则也适用于Interval
(例如将日期添加到间隔会产生日期时间)。
参考:#4088
postgresql
- [postgresql] [功能]
向 psycopg2 方言添加了一个新标志use_batch_mode
。当Engine
调用cursor.executemany()
时,此标志启用了 psycopg2 的psycopg2.extras.execute_batch
扩展。这个扩展在批量运行 INSERT 语句时提供了关键的性能提升,性能提升超过一个数量级。该标志默认为 False,因为目前被认为是实验性的。
参见
批处理模式/快速执行助手的支持
参考:#4109 - [postgresql] [错误]
进一步修复了与 COLLATE 结合使用的ARRAY
类中的问题,因为在 #4006 中进行的修复未能适应多维数组。
这个更改也被回溯到:1.1.15
参考:#4006 - [postgresql] [bug]
修复了array_agg
函数中的错误,其中传递一个已经是ARRAY
类型的参数,例如 PostgreSQLarray
构造,会产生ValueError
,因为函数尝试嵌套数组。
这个更改也被回溯到:1.1.15
参考:#4107 - [postgresql] [bug]
修复了 PostgreSQLInsert.on_conflict_do_update()
中的错误,该错误将阻止将插入语句用作 CTE,例如通过Insert.cte()
,在另一个语句中。
这个更改也被回溯到:1.1.15
参考:#4074 - [postgresql] [bug]
修复了 pg8000 驱动程序在使用带有模式名称的MetaData.reflect()
时会失败的错误,因为模式名称将作为“quoted_name”对象发送,该对象是一个字符串子类,pg8000 不识别。在连接时,quoted_name 类型被添加到 pg8000 的 py_types 集合中。
参考:#4041 - [postgresql] [bug]
为 pg8000 驱动程序启用了 UUID 支持,支持此数据类型的本机 Python uuid 往返。但是仍然不支持 UUID 数组。
参考:#4016
mysql
- [mysql] [bug]
当检测到 MariaDB 10.2.8 或更早版本的 10.2 系列时发出警告,因为这些版本中的 CHECK 约束存在重大问题,这些问题在 10.2.9 中已解决。
请注意,此更改日志消息未随 SQLAlchemy 1.2.0b3 一起发布,而是事后添加的。
这个更改也被回溯到:1.1.15
参考:#4097 - [mysql] [bug]
修复了在 MariaDB 10.2 系列中 CURRENT_TIMESTAMP 由于语法更改而无法正确反映的问题,其中该函数现在表示为current_timestamp()
。
这个更改也被回溯到:1.1.15
参考:#4096 - [mysql] [bug]
MariaDB 10.2 现在支持 CHECK 约束(警告:由于上游问题,请使用版本 10.2.9 或更高版本,详见#4097)。反射现在在存在时考虑这些 CHECK 约束,当它们出现在SHOW CREATE TABLE
输出中时。
此更改也被回溯到:1.1.15
参考:#4098 - [mysql] [bug]
将新的 MySQL INSERT…ON DUPLICATE KEY UPDATE 构造的.values
属性的名称更改为.inserted
,因为Insert
已经有一个名为Insert.values()
的方法。.inserted
属性最终呈现 MySQL 的VALUES()
函数。
参考:#4072
sqlite
- [sqlite] [bug]
修复了一个 bug,当 SQLite 的 CHECK 约束反射失败时,如果引用的表在远程模式下,例如在 SQLite 中由 ATTACH 引用的远程数据库,则会失败。
此更改也被回溯到:1.1.15
参考:#4099
mssql
- [mssql] [feature]
添加了一个新的TIMESTAMP
数据类型,它在 SQL Server 中正确地像二进制数据类型一样工作,而不是一个 datetime 类型,因为 SQL Server 在这里违反了 SQL 标准。还添加了ROWVERSION
,因为 SQL Server 中的TIMESTAMP
类型已被弃用,改用 ROWVERSION。
参考:#4086 - [mssql] [feature]
添加了对“AUTOCOMMIT”隔离级别的支持,通过Connection.execution_options()
在 PyODBC 和 pymssql 方言中建立。此隔离级别在底层连接对象上设置适当的 DBAPI 特定标志。
参考:#4058 - [mssql] [bug]
为 SQL Server 的 PyODBC 方言添加了完整的“连接关闭”异常代码范围,包括‘08S01’、‘01002’、‘08003’、‘08007’、‘08S02’、‘08001’、‘HYT00’、‘HY010’。以前只覆盖了‘08S01’。
此更改也被回溯到:1.1.15
参考:#4095 - [mssql] [bug]
SQL Server 支持 SQLAlchemy 称为“本地布尔”的 BIT 类型,因为该类型只接受 0 或 1,而 DBAPI 将其值返回为 True/False。因此,SQL Server 方言现在启用了“本地布尔”支持,即不为Boolean
数据类型生成 CHECK 约束。与其他本地布尔的唯一区别是没有“true” / “false”常量,因此这里仍然呈现为“1”和“0”。
参考:#4061 - [mssql] [bug]
修复了 pymssql 方言中 SQL 文本中的百分号,例如在模数表达式或文字值中使用的情况,不会加倍,这似乎是 pymssql 所期望的。尽管 pymssql DBAPI 使用“pyformat”参数样式,该样式认为百分号是重要的。
参考:#4057 - [mssql] [bug]
修复了 SQL Server 方言在反射自引用外键约束时可能从多个模式中提取列的错误,如果多个模式包含相同名称的约束针对相同名称的表。
参考:#4060 - [mssql] [bug] [orm]
为特定于“RETURNING”的方言添加了一个新类别的“rowcount 支持”,在 SQL Server 上看起来像“OUTPUT inserted”,因为 PyODBC 后端在 OUTPUT 生效时无法给我们 UPDATE 或 DELETE 语句的 rowcount。这主要影响 ORM,当 flush 更新包含服务器计算值的行时,如果后端没有返回预期的行数,会引发错误。PyODBC 现在声明支持 rowcount,除非存在 OUTPUT.inserted,ORM 在 flush 期间会考虑是否寻找 rowcount。
参考:#4062 - [mssql] [bug] [orm]
为 pymssql 方言启用了“sane_rowcount”标志,表示 DBAPI 现在报告 UPDATE 或 DELETE 语句受影响的正确行数。这主要影响 ORM 版本功能,因为它现在可以验证目标版本受影响的行数。 - [mssql] [bug]
添加了一个规则到 SQL Server 索引反射中,忽略了在未指定聚集索引的表上隐式存在的所谓“堆”索引。
参考:#4059
oracle
- [oracle] [performance] [bug] [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”模式警告。
此更改也被回溯到:1.1.13,1.0.19
参考:#4035 - [oracle] [bug]
使用 cx_Oracle 实现对 Oracle 值“infinity”的部分支持,仅使用 Python 浮点值,例如float("inf")
。cx_Oracle DBAPI 驱动程序尚未实现十进制支持。
参考:#4064 - [oracle] [bug]
cx_Oracle 方言已经重新设计和现代化,以利用旧的 4.x 系列 cx_Oracle 中不存在的新模式。其中包括最小的 cx_Oracle 版本是 5.x 系列,cx_Oracle 6.x 现在已经完全测试。最重要的变化涉及类型转换,主要是关于数字/浮点和 LOB 数据类型,更有效地利用 cx_Oracle 类型处理挂钩简化了绑定参数和结果数据的处理方式。
参见
cx_Oracle 方言,类型系统的重大重构 - [oracle] [bug]
对于所有版本的 cx_Oracle,两阶段支持已完全移除,而在 1.2.0b1 中,此更改仅对 cx_Oracle 的 6.x 系列生效。这个功能在任何版本的 cx_Oracle 中都从未正确工作,在 cx_Oracle 6.x 中,SQLAlchemy 依赖的 API 已被移除。
参见
cx_Oracle 方言,类型系统的重大重构
参考:#3997 - [oracle] [bug]
当使用 cx_Oracle 后端的Insert.returning()
时,结果集中的列键现在使用正确的列/标签名称,与所有其他方言一样。以前,这些列键会显示为ret_nnn
。
参见
cx_Oracle 方言,类型系统的重大重构 - [oracle] [bug]
cx_Oracle 方言的几个参数现在已被弃用且不再起作用:auto_setinputsizes
,exclude_setinputsizes
,allow_twophase
。
参见
对 cx_Oracle 方言、类型系统的重大重构 - [oracle] [bug]
修复了在 Oracle 下反映出一个类似“column DESC”的表达式的索引不会被返回的错误,如果表也没有主键,这是由于尝试过滤掉 Oracle 隐式添加到主键列上的索引的逻辑导致的。
参考:#4042 - [oracle] [bug]
修复了由 cx_Oracle 6.0 引起的更多回归问题;目前,用户唯一的行为变化是断开检测现在除了 cx_Oracle.InterfaceError 外还检测 cx_Oracle.DatabaseError,因为这种行为似乎已经改变。其他关于数字精度和无法关闭连接的问题仍在上游 cx_Oracle 问题跟踪器中挂起。
参考:#4045 - [oracle] [bug]
修复了 Oracle 8“非 ansi”连接模式不会向使用与=
操作符不同的操作符的表达式添加(+)
运算符的错误。(+)
需要添加到右侧的所有列。
参考:#4076
1.2.0b2
发布日期:2017 年 7 月 24 日
orm
- [orm] [bug]
修复了从 1.1.11 开始的回归,其中向包含具有子查询加载关系的实体的查询添加额外的非实体列会失败,这是由于 1.1.11 中添加的检查导致的,这是由于#4011。
这个更改也被回溯到:1.1.12
参考:#4033 - [orm] [bug]
修复了在 1.1 中添加的涉及 JSON NULL 评估逻辑的错误,其中逻辑不会适应与Column
不同命名的 ORM 映射属性。
这个更改也被回溯到:1.1.12
参考:#4031 - [orm] [bug]
在WeakInstanceDict
中的所有方法中添加了KeyError
检查,其中在检查key in dict
后紧接着对该键进行索引访问,以防止在负载下垃圾收集导致的竞争中,代码假定键存在后,键从字典中被移除,导致非常罕见的KeyError
引发。
这个更改也被回溯到:1.1.12
参考:#4030
测试
- [tests] [bug] [py3k]
修复了与 Python 3.6.2 的更改不兼容的测试固定装置中的问题,涉及上下文管理器。
这个更改也被回溯到:1.1.12, 1.0.18
参考:#4034
orm
- [orm] [bug]
修复了从 1.1.11 开始的回归,其中向包含具有子查询加载关系的实体的查询添加额外的非实体列将失败,原因是 1.1.11 中添加的检查作为#4011的结果。
此更改还回溯到:1.1.12
参考:#4033 - [orm] [错误]
修复了在 1.1 中添加的涉及 JSON NULL 评估逻辑的错误,该逻辑不会适应与Column
不同命名的 ORM 映射属性的情况。
此更改还回溯到:1.1.12
参考:#4031 - [orm] [错误]
在WeakInstanceDict
中的所有方法中添加了KeyError
检查,其中检查key in dict
后跟随对该键的索引访问,以防止在负载下垃圾收集导致的竞争中,代码假设其存在后,将键从字典中移除,导致非常罕见的KeyError
引发。
此更改还回溯到:1.1.12
参考:#4030
测试
- [测试] [错误] [py3k]
修复了与 Python 3.6.2 的更改不兼容的测试固定装置中的问题,涉及上下文管理器的更改。
此更改还回溯到:1.1.12, 1.0.18
参考:#4034
SqlAlchemy 2.0 中文文档(六十一)(5)https://developer.aliyun.com/article/1560913