SqlAlchemy 2.0 中文文档(六十一)(1)https://developer.aliyun.com/article/1560909
1.2.0b1
发布日期:2017 年 7 月 10 日
orm
- [orm] [feature]
现在可以将一个aliased()
构造传递给Query.select_entity_from()
方法。实体将从由aliased()
构造表示的可选择项中提取。这允许与Query.select_entity_from()
一起使用aliased()
的特殊选项,如aliased.adapt_on_names
。
此更改也回溯到:1.1.7
参考:#3933 - [orm] [feature]
向scoped_session
添加了.autocommit
属性,代理了当前分配给线程的底层Session
的.autocommit
属性。感谢 Ben Fagin 的拉取请求。 - [orm] [feature]
添加了一个新功能with_expression()
,允许在结果时间将一个临时 SQL 表达式添加到查询中的特定实体。这是 SQL 表达式作为结果元组中的一个单独元素传递的替代方法。
另请参阅
可以接收临时 SQL 表达式的 ORM 属性
参考:#3058 - [orm] [feature]
添加了一种新的映射器级继承加载样式“多态 selectin”。这种加载方式在加载基本对象类型后,为继承层次结构中的每个子类发出查询,使用 IN 来指定所需的主键值。
另请参阅
“selectin”多态加载,使用单独的 IN 查询加载子类
参考:#3948 - [orm] [feature]
添加了一种新的急切加载方式称为“selectin”加载。这种加载方式与“subquery”急切加载非常相似,只是它使用了一个 IN 表达式,给出了加载的父对象的主键值列表,而不是重新陈述原始查询。这产生了一个更有效的查询,是“烘烤的”(例如,SQL 字符串被缓存),并且也适用于Query.yield_per()
的上下文中。
另请参阅
新的“selectin”急切加载,使用 IN 一次加载所有集合
参考:#3944 - [orm] [feature]
lazy="select"
加载策略现在在所有情况下都使用BakedQuery
查询缓存系统。这消除了生成Query
对象并将其运行到select()
中,然后从懒加载相关集合和对象的过程中生成字符串 SQL 语句的大部分开销。 “烘焙”懒加载器也已经改进,现在在大多数情况下可以缓存使用查询加载选项的情况。
另请参阅
“烘焙”加载现在是懒加载的默认值
参考:#3954 - [orm] [feature] [ext]
Query.update()
方法现在可以同时适应混合属性和复合属性作为放置在 SET 子句中的键的来源。对于混合属性,用户提供一个返回元组的函数,还提供了额外的装饰器hybrid_property.update_expression()
。
另请参阅
支持混合属性、复合属性的批量更新
参考:#3229 - [orm] [feature]
添加了新的属性事件AttributeEvents.bulk_replace()
。当将集合分配给关系时,触发此事件,在将传入集合与现有集合进行比较之前。这个早期事件还允许转换传入的非 ORM 对象。该事件与@validates
装饰器集成。
另请参阅
新的 bulk_replace 事件
参考:#3896 - [orm] [feature]
添加了新的事件处理程序AttributeEvents.modified()
,当调用 func:.attributes.flag_modified 函数时触发,这在使用sqlalchemy.ext.mutable
扩展模块时很常见。
另请参阅
sqlalchemy.ext.mutable 的新“modified”事件处理程序
参考:#3303 - [orm] [bug]
修复了与子查询急切加载相关的问题,这是从#2699、#3106、#3893修复的一系列问题中继续的。涉及到“子查询”包含正确的 FROM 子句,当从一个连接的继承子类开始,然后对基类的关系进行子查询急切加载时,同时查询还包括针对子类的条件。之前票据中的修复没有考虑到加载更深层次的额外子查询加载操作,因此修复已进一步泛化。
此更改也被回溯到:1.1.11
参考:#4011 - [orm] [bug]
修复了一个错误,即像“delete-orphan”(以及其他一些)这样的级联操作将无法定位到与继承关系中的子类本地关系相链接的对象,从而导致操作无法执行。
此更改也被回溯到:1.1.10
参考:#3986 - [orm] [bug]
修复了在多线程环境下可能发生的竞争条件,这是通过#3915添加的缓存导致的。内部的Column
对象集合可能会在别名对象上不当地重新生成,使得连接的急切加载器在尝试渲染 SQL 并收集结果时混淆,并导致属性错误。现在在别名对象被缓存和在线程之间共享之前,集合会提前生成。
此更改也被回溯到:1.1.7
参考:#3947 - [orm] [bug]
作为relationship.post_update
功能的结果发出的 UPDATE 现在将与版本控制功能集成,以提升行的版本 ID,并断言现有版本号已匹配。
另请参阅
post_update 与 ORM 版本控制集成
参考:#3496 - [orm] [bug]
修复了几个情况,这些情况涉及到与具有“onupdate”值的列一起使用时的relationship.post_update
功能。当 UPDATE 发出时,相应的对象属性现在会过期或刷新,以便新生成的“onupdate”值可以填充到对象中;以前的陈旧值将保留。另外,如果 Python 中设置了对象的 INSERT 的目标属性,则该值现在将在 UPDATE 期间重新发送,以便“onupdate”不会覆盖它(请注意,这对于服务器生成的 onupdates 同样有效)。最后,在刷新时,这些属性现在会发出SessionEvents.refresh_flush()
事件。
另请参阅
改进与 onupdate 结合使用的 post_update
参考:#3471,#3472 - [orm] [bug]
修复了一个错误,即在程序化版本 ID 计数器与连接表继承结合使用时,如果版本 ID 计数器实际上未增加,并且基表上没有修改其他值,则 UPDATE 将具有空的 SET 子句时会失败。由于程序化版本 ID 在版本计数器未增加时是一个记录的用例,因此现在会检测到这种特定条件,并且 UPDATE 现在将版本 ID 值设置为自身,以便仍然进行并发检查。
参考:#3996 - [orm] [bug]
版本功能不支持版本计数器为 NULL。如果版本 ID 是程序化的,并且在 UPDATE 中将其设置为 NULL,则现在会引发异常。拉取请求由 Diana Clarke 提供。
参考:#3673 - [orm] [bug]
从scoped_session
中删除了一个非常古老的关键字参数,称为scope
。这个关键字从未被记录,并且是早期尝试允许变量范围的一种尝试。
另请参阅
从 scoped_session 中删除“scope”关键字
参考:#3796 - [orm] [bug]
修复了一个错误,即将“with_polymorphic”加载与指定了 innerjoin=True 的子类链接关系结合使用时,将无法将这些“innerjoins”降级为“outerjoins”以适应不支持该关系的其他多态类。这适用于单个和连接继承多态加载。
参考:#3988 - [orm] [bug]
为Session.refresh()
方法添加了新参数with_for_update
。当Query.with_lockmode()
方法被弃用,改用Query.with_for_update()
时,Session.refresh()
方法从未更新以反映新选项。
参见
为Session.refresh
添加了“for update”参数
参考:#3991 - [orm] [bug]
修复了一个 bug,即一个同时标记为“延迟加载”的column_property()
在刷新时会被标记为“过期”,导致它与常规属性一起加载,即使从未访问过该属性。
参考:#3984 - [orm] [bug]
修复了子查询急加载中的错误,其中自引用关系的“join_depth”参数不会被正确遵守,而是加载所有可用的深度,而不是正确计算急加载的指定级别数。
参考:#3967 - [orm] [bug]
在Mapper
中添加了对 LRU“编译缓存”的警告(最终也会用于其他基于 ORM 的 LRU 缓存),当缓存开始达到大小限制时,应用程序将发出警告,指出这是一个可能需要关注的性能下降情况。LRU 缓存主要会达到大小限制,如果应用程序使用了无限数量的Engine
对象,这是一个反模式。否则,这可能表明存在一个问题,应该引起 SQLAlchemy 开发人员的注意。 - [orm] [bug]
修复了一个 bug,以提高在延迟加载相关实体后生效的加载器选项的特异性,使得加载器选项将更具体地匹配到一个别名或非别名实体,如果这些选项包括实体信息。
参考:#3963 - [orm] [bug]
flag_modified()
函数现在在对象中未找到指定属性键时会引发InvalidRequestError
,因为在刷新过程中假定该属性键是存在的。要在不涉及任何特定属性的情况下标记对象为“脏”以进行刷新,可以使用flag_dirty()
函数。
另请参阅
使用 flag_dirty() 将对象标记为“脏”而不更改任何属性
参考:#3753 - [orm] [bug]
Query.update()
和Query.delete()
使用的“evaluate”策略现在可以在主键/外键列的属性名称与实际列名称不匹配时,从多对一关系到实例进行简单对象比较。以前,这将进行简单的基于名称的匹配,并因 AttributeError 失败。
参考:#3366 - [orm] [bug]
@validates
装饰器现在允许装饰的方法接收尚未与现有集合进行比较的“批量集合设置”操作中的对象。这允许传入值转换为兼容的 ORM 对象,就像从“追加”事件中已经允许的那样。请注意,这意味着在集合分配期间 所有 值都会调用@validates
方法,而不仅仅是新值。
另请参阅
在比较之前,@validates 方法在批量集合设置上接收所有值
参考:#3896 - [orm] [bug]
修复了单表继承中 select_from() 参数在限制行到子类时不会被考虑的 bug。以前,只有请求的列中的表达式会被考虑。
另请参阅
修复了与 select_from() 一起使用的单表继承的问题
参考:#3891 - [orm] [bug]
当将集合分配给由关系映射的属性时,以前的集合不再发生变化。以前,旧集合会随着触发的“项删除”事件而清空;现在事件会触发,但不会影响旧集合。
另请参阅
替换时不再改变先前的集合
参考:#3913 - [orm] [bug]
当SessionEvents.after_rollback()
事件被触发时,Session
的状态现在是存在的,即对象在过期之前的属性状态。这与SessionEvents.after_commit()
事件的行为一致,该事件在对象的属性状态过期之前也会被触发。
另请参阅
在对象过期之前,after_rollback() Session 事件现在会被触发
参考:#3934 - [orm] [错误]
修复了一个 bug,Query.with_parent()
在针对aliased()
构造而不是常规映射类时无法正常工作。还为独立的with_parent()
函数以及Query.with_parent()
添加了一个新参数with_parent.from_entity
。
参考:#3607
声明式 orm
- [orm] [声明式] [错误]
修复了一个 bug,在AbstractConcreteBase
上使用declared_attr
时,如果特定返回值是一些非映射符号,包括None
,会导致属性只被硬评估一次并将值存储到对象字典中,不允许它为子类调用。当declared_attr
在映射类上时,这种行为是正常的,在混合类或抽象类上不会发生。由于AbstractConcreteBase
既是“抽象”的又是实际“映射”的,因此在这里做了一个特殊的例外情况,以便“抽象”行为优先于declared_attr
。
参考:#3848
引擎
- [引擎] [特性]
在Pool
对象中添加了本机“悲观断开”处理。新参数Pool.pre_ping
,可从引擎中作为create_engine.pool_pre_ping
使用,应用了池文档中特色的“预检测”配方的高效形式,每次连接检出时,发出一个简单的语句,通常是“SELECT 1”,以测试连接的活动性。如果现有连接不再能响应命令,则连接将被透明地回收,并且在当前时间戳之前进行的所有其他连接将被作废。
另请参阅
断开处理 - 悲观
连接池中添加了悲观断开检测
参考:#3919 - [engine] [bug]
添加了一个异常处理程序,当Connection
的“autorollback”功能本身引发异常时,将对 Py2K 上的“cause”异常发出警告。在 Py3K 中,两个异常自然地由解释器报告为一个发生在处理另一个时。这是继续处理回滚失败处理的一系列更改的一部分,上次在 1.0.12 中作为#2696的一部分访问。
此更改也回溯到:1.1.7
参考:#3946 - [engine] [bug]
修复了一个错误,即在将Compiled
对象直接传递给Connection.execute()
的不寻常情况下,生成Compiled
对象的方言未被咨询以获取字符串语句的 paramstyle,而是假定它将匹配方言级别的 paramstyle,导致不匹配发生。
参考:#3938
sql
- [sql] [feature]
添加了一种名为“expanding”的新类型bindparam()
。这用于在IN
表达式中,元素列表在语句执行时被渲染为单独的绑定参数,而不是在语句编译时。这允许将单个绑定参数名称链接到包含多个元素的 IN 表达式,同时还允许在 IN 表达式中使用查询缓存。这一新功能允许“select in”加载和“polymorphic in”加载使用烘焙查询扩展来减少调用开销。这一功能应被视为实验性的 1.2 版本。
另请参阅
延迟扩展的 IN 参数集允许使用缓存语句的 IN 表达式
参考:#3953 - [sql] [feature] [mysql] [oracle] [postgresql]
对Table
和Column
对象添加了对 SQL 注释的支持,通过新的Table.comment
和Column.comment
参数。这些注释将作为表创建时的 DDL 的一部分包含在内,可以通过内联或适当的 ALTER 语句进行反映,并且也会在表反射中反映出来,以及通过Inspector
进行反映。目前支持的后端包括 MySQL、PostgreSQL 和 Oracle。非常感谢 Frazer McLean 在这方面付出的大量努力。
另请参阅
对 Table、Column 支持 SQL 注释,包括 DDL、反射
参考:#1546 - [sql] [feature]
ColumnOperators.in_()
和ColumnOperators.notin_()
操作符的长期行为已经修订,当右侧条件为空序列时,会发出警告;现在默认情况下会呈现一个简单的“静态”表达式“1 != 1”或“1 = 1”,而不是引入原始的左侧表达式。这导致对空集合进行 NULL 列比较的结果从 NULL 更改为 true/false。此行为是可配置的,旧行为可以通过create_engine()
的create_engine.empty_in_strategy
参数启用。
另请参阅
IN / NOT IN 运算符的空集合行为现在可配置;默认表达式简化
参考:#3907 - [sql] [feature]
为比较器的“startswith”和“endswith”类添加了一个新选项autoescape
;这个选项提供了一个转义字符,并自动将其应用于所有通配符“%”和“_”的出现。感谢 Diana Clarke 的拉取请求。
注意
该功能已于 1.2.0 版本中从其在 1.2.0b2 中的初始实现中更改,现在 autoescape 被传递为布尔值,而不是用作转义字符的特定字符。
另请参阅
新的“autoescape”选项用于 startswith(),endswith()
参考:#2694 - [sql] [bug]
修复了在结构迭代期间可能发生的WithinGroup
构造中的 AttributeError。
此更改也回溯到:1.1.11
参考:#4012 - [sql] [bug]
修复了在 1.1.5 版本中由于 #3859 导致的回归问题,其中基于Variant
的“右侧”表达式评估的调整,以遵守底层类型的“右侧”规则,导致在那些我们确实希望左侧类型直接传递到右侧,以便将绑定级规则应用于表达式参数时,Variant
类型被不适当地丢失。
此更改也回溯到:1.1.9
参考:#3952 - [sql] [bug] [postgresql]
更改了ResultProxy
的机制,无条件延迟“autoclose”步骤,直到Connection
完成对象的使用;在 PostgreSQL ON CONFLICT 与 RETURNING 返回零行的情况下,autoclose 会发生在这种以前不存在的用例中,导致在 INSERT/UPDATE/DELETE 上无条件发生的通常自动提交行为失败。
此更改也回溯到:1.1.9
参考:#3955 - [sql] [bug]
现在,Numeric
、Integer
和与日期相关的类型之间的类型强制转换规则现在包括额外的逻辑,将尝试保留“resolved”类型的传入类型的设置。目前,这个目标是asdecimal
标志,因此在Numeric
或Float
与Integer
之间的数学操作将保留asdecimal
标志,以及类型是否应该是Float
子类。
另请参阅
对“float”数据类型进行更强的类型转换
参考:#4018 - [sql] [bug] [mysql]
现在,Float
类型的结果处理器现在无条件地通过float()
处理器运行值,如果方言指定它也支持“本地十进制”模式。虽然大多数后端将为浮点数据类型提供 Pythonfloat
对象,但 MySQL 后端在某些情况下缺乏类型信息以提供此功能,并且除非进行浮点转换,否则将返回Decimal
。
另请参阅
对“float”数据类型进行更强的类型转换
参考:#4020 - [sql] [bug]
对于传递给 SQL 语句的 Python“float”值,增加了一些额外的严格性。现在,“float”值将与Float
数据类型相关联,而不是以前的 Decimal 强制转换Numeric
数据类型,消除了在 SQLite 上发出的令人困惑的警告以及对 Decimal 的不必要强制转换。
另请参阅
对“float”数据类型进行更强的类型转换
参考:#4017 - [sql] [bug]
所有比较运算符(如 LIKE、IS、IN、MATCH、等于、大于、小于等)的操作优先级已经合并为一个级别,因此对这些运算符进行相互比较的表达式将在它们之间产生括号。这适用于像 Oracle、MySQL 等数据库的操作符优先级,这些数据库将所有这些运算符视为相等优先级,以及 PostgreSQL 9.5 版本之后也已经扁平化了其操作符优先级。
另请参阅
比较运算符的扁平化操作优先级
参考:#3999 - [sql] [bug]
修复了使用ColumnOperators.is_()
或类似操作符的表达式类型不会是“boolean”类型的问题,而是类型将是“nulltype”,以及当使用自定义比较运算符对未类型化表达式进行比较时。这种类型化可能会影响表达式在更大上下文中以及在结果行处理中的行为。
参考:#3873 - [sql] [bug]
修复了对Label
构造的否定,使得当应用not_()
修饰符到标记表达式时,内部元素被正确否定。
参考:#3969 - [sql] [bug]
SQL 语句中百分号“双倍”用于转义目的的系统已经得到改进。与literal_column
构造以及ColumnOperators.contains()
等操作符相关的百分号“双倍”现在基于正在使用的 DBAPI 的声明的参数样式而发生;对于像 PostgreSQL 和 MySQL 驱动程序常见的百分号敏感参数样式,将会发生双倍,对于 SQLite 等其他参数样式则不会。这使得更多数据库通用的使用literal_column
构造成为可能。
另请参阅
literal_column()中的百分号现在有条件转义
参考:#3740 - [sql] [bug]
修复了一个 bug,在这个 bug 中,列级CheckConstraint
在编译使用底层方言编译器的 SQL 表达式时会失败,并且无法应用正确的标志以生成内联的字面值,如果 sqltext 是一个 Core 表达式而不仅仅是一个普通字符串。这在 0.9 版本中作为#2742的一部分长时间以来已经修复,更常见的是在表级别的检查约束中使用 Core SQL 表达式而不是普通字符串表达式。
参考:#3957 - [sql] [bug]
修复了一个 bug,在这个 bug 中,SQL 导向的 Python 端列默认值在“pre-execute”代码路径中可能无法在 INSERT 时正确执行,如果 SQL 本身是一个未类型化的表达式,比如纯文本。然而,“pre-execute”代码路径相当不常见,但当不使用 RETURNING 时,它可以应用于具有 SQL 默认值的非整数主键列。
参考:#3923 - [sql] [bug]
通过列级collate()
和ColumnOperators.collate()
渲染的用于 COLLATE 的表达式现在在名称区分大小写时被引用为标识符。请注意,这不会影响类型级别的排序规则,因为它已经被引用。
另请参见
列级 COLLATE 关键字现在引用排序规则名称
参考:#3785 - [sql] [bug]
修复了在列上下文中使用Alias
对象会在尝试将自身分组到括号表达式中时引发参数错误的 bug。目前还不完全支持以这种方式使用Alias
的 API,但它适用于一些最终用户的示例,并且可能在支持某些未来 PostgreSQL 功能时发挥更重要的作用。
参考:#3939
模式
- [schema] [bug]
如果创建一个具有不匹配的“本地”和“远程”列数量的ForeignKeyConstraint
对象,则现在会引发一个ArgumentError
,否则会导致约束的内部状态不正确。请注意,这也会影响方言的反射过程产生不匹配的列集合用于外键约束的情况。
此更改也被回溯到:1.1.10
参考:#3949
postgresql
- [postgresql] [bug]
继续修复正确处理 PostgreSQL 版本字符串“10devel”的问题,该问题在 1.1.8 中发布,另外增加了一个正则表达式版本以处理形式为“10beta1”的版本字符串。虽然 PostgreSQL 现在提供了更好的获取此信息的方法,但我们至少在 1.1.x 中仍然坚持使用正则表达式,以减少与旧版或替代 PostgreSQL 数据库的兼容性风险。
此更改也被回溯到:1.1.11
参考:#4005 - [postgresql] [bug]
修复了使用带有排序规则的字符串类型的ARRAY
会在 CREATE TABLE 中产生正确语法的错误。
此更改也被回溯到:1.1.11
参考:#4006 - [postgresql] [bug]
为 GRANT、REVOKE 关键字增加了“autocommit”支持。感谢 Jacob Hayes 提交的拉取请求。
此更改也被回溯到:1.1.10 - [postgresql] [bug]
增加了解析 PostgreSQL 版本字符串的支持,例如“PostgreSQL 10devel”。感谢 Sean McCully 提交的拉取请求。
此更改也被回溯到:1.1.8 - [postgresql] [bug]
修复了基本ARRAY
数据类型不会调用ARRAY
的绑定/结果处理器的错误。
参考:#3964 - [postgresql] [bug]
在反射 PostgreSQLINTERVAL
数据类型时,现在支持所有可能的“fields”标识符,例如“YEAR”、“MONTH”、“DAY TO MINUTE”等。此外,INTERVAL
数据类型本身现在包括一个新参数INTERVAL.fields
,可以在其中指定这些限定符;在反射/检查时,限定符也会反映到生成的数据类型中。
另请参阅
支持 INTERVAL 中的字段规范,包括完整反射
参考:#3959
mysql
- [mysql] [feature]
增加了对 MySQL 的 ON DUPLICATE KEY UPDATE MySQL 特定Insert
对象的支持。感谢 Michael Doronin 提交的拉取请求。
另请参阅
支持 INSERT…ON DUPLICATE KEY UPDATE
参考:#4009 - [mysql] [bug]
MySQL 5.7 引入了对“SHOW VARIABLES”命令的权限限制;MySQL 方言现在将处理 SHOW 返回没有行的情况,特别是对于 SQL_MODE 的初始获取,并发出警告,指出用户权限应该被修改以允许行存在。
这个更改也回溯到:1.1.11
参考:#4007 - [mysql] [bug]
移除了对 UTC_TIMESTAMP MySQL 函数的古老且不必要的拦截,这个拦截影响了使用带参数的情况。
这个更改也回溯到:1.1.10
参考:#3966 - [mysql] [bug]
修复了 MySQL 方言中关于在渲染 CREATE TABLE 时渲染表选项与 PARTITION 选项同时出现时表选项的渲染问题。PARTITION 相关的选项需要跟在表选项后面,而以前没有强制执行这个顺序。
这个更改也回溯到:1.1.10
参考:#3961 - [mysql] [bug]
添加了对由于陈旧的表定义而无法反射的视图的支持,在调用MetaData.reflect()
时,对于无法响应DESCRIBE
的表,会发出警告,但操作会成功。
参考:#3871
mssql
- [mssql] [bug]
修复了在使用 Azure 数据仓库时必须从不同视图中获取 SQL Server 事务隔离的错误,现在会尝试针对两个视图执行查询,然后如果持续失败将无条件地引发一个 NotImplemented,以提供对未来新的 SQL Server 版本中任意 API 更改的最佳恢复能力。
这个更改也回溯到:1.1.11
参考:#3994 - [mssql] [bug]
添加了一个占位符类型XML
到 SQL Server 方言中,以便包含此类型的反射表可以重新渲染为 CREATE TABLE。该类型没有特殊的往返行为,也不支持额外的限定参数。
这个更改也回溯到:1.1.11
参考:#3973 - [mssql] [bug]
现在,SQL Server 方言允许在字符串中明确使用括号来表示带有点的数据库和/或所有者名称,围绕所有者和可选的数据库名称。此外,发送quoted_name
构造用于模式名称将不会在点上拆分,并将提供完整字符串作为“所有者”。quoted_name
现在也可以从sqlalchemy.sql
导入空间中使用。
另请参阅
支持带有嵌入点的 SQL Server 模式名称
参考:#2626
oracle
- [oracle] [feature] [postgresql]
向Sequence
添加了新关键字Sequence.cache
和Sequence.order
,以允许渲染 Oracle 和 PostgreSQL 理解的 CACHE 参数以及 Oracle 理解的 ORDER 参数。拉取请求由 David Moore 提供。
此更改也回溯到:1.1.12 - [oracle] [feature]
当使用Inspector.get_unique_constraints()
、Inspector.get_check_constraints()
时,Oracle 方言现在会检查唯一约束和检查约束。由于 Oracle 没有与唯一Index
分开的唯一约束,因此反射的Table
仍将继续不具有与之关联的UniqueConstraint
对象。拉取请求由 Eloy Felix 提供。
另请参阅
Oracle 唯一约束,检查约束现在反映
参考:#4003 - [oracle] [bug]
当使用版本为 6.0b1 或更高版本的 DBAPI 时,cx_Oracle 完全删除了对两阶段事务的支持。在任何情况下,cx_Oracle 5.x 历史上从未能够使用两阶段功能,而 cx_Oracle 6.x 已经删除了此功能所依赖的连接级“twophase”标志。
此更改也回溯到:1.1.11
参考:#3997 - [oracle] [bug]
修复了 cx_Oracle 方言中版本字符串解析失败的 bug,因为 cx_Oracle 版本 6.0b1 中的“b”字符。现在版本字符串解析使用正则表达式而不是简单的分割。
此更改也回溯到:1.1.10
参考:#3975 - [oracle] [错误]
cx_Oracle 方言现在支持“合理的多行数”,即,当通过 DBAPIcursor.executemany()
执行一系列参数集时,我们可以利用cursor.rowcount
来验证匹配的行数。这在 ORM 中检测并发修改场景时产生影响,即使 ORM 正在批量处理语句时,也可以检测到一些简单条件,以及在使用更严格的版本功能时,ORM 仍然可以使用语句批处理。该标志针对 cx_Oracle 默认为至少版本 5.0,这在现在已经很普遍。
参考:#3932 - [oracle] [错误]
Oracle 反射现在“标准化”了外键约束的名称,即,返回不区分大小写的名称。这已经是对索引和主键约束以及所有表和列名称的行为。当 Alembic 自动生成脚本比较和渲染外键约束名称时,初始指定为不区分大小写时,这将允许正确地进行比较。
另请参阅
Oracle 外键约束名称现在“名字标准化”了
参考:#3276
杂项
- [特性] [扩展]
添加了新标志Session.enable_baked_queries
到Session
,允许全局禁用烘焙查询,从而减少内存使用。还添加了新的Bakery
包装器,以便检查由BakedQuery.bakery
返回的烘焙。 - [错误] [扩展]
在自动映射准备()操作同时进行的情况下,保护了测试“None”作为一个类的情况,非常少数情况下可能会在垃圾回收时清除声明性类,并且新的 automap 准备()操作正在进行。
此更改也回溯到:1.1.10
参考:#3980 - [错误] [扩展]
修复了sqlalchemy.ext.mutable
中的错误,在使用TypeEngine.copy()
复制类型后,Mutable.as_mutable()
方法将不会跟踪已复制的类型。这在 1.1 版本相对于 1.0 变得更加退化,因为TypeDecorator
类现在是SchemaEventTarget
的子类,其中之一的功能是指示父Column
在Column
被复制时应该被复制。在使用具有混合类或抽象类的声明时,这些复制是常见的。
此更改也被回溯到:1.1.8
参考:#3950 - [错误] [扩展]
添加了对绑定参数的支持,例如通常通过Query.params()
设置的参数,到Result.count()
方法。之前省略了对参数的支持。感谢 Pat Deegan 提供的拉取请求。
此更改也被回溯到:1.1.8 - [错误] [扩展]
现在AssociationProxy.any()
,AssociationProxy.has()
和AssociationProxy.contains()
比较方法支持链接到一个属性,该属性本身也是一个AssociationProxy
,递归地。
另请参阅
关联代理 any(), has(), contains() 可与链式关联代理一起使用
参考:#3769 - [错误] [扩展]
实现了原地变异操作符__ior__
,__iand__
,__ixor__
和__isub__
,用于MutableSet
,以及__iadd__
用于MutableList
,这样当使用这些变异方法修改集合时会触发变更事件。
另请参阅
原地变异操作符对 MutableSet, MutableList 有效
参考:#3853 - [错误] [声明]
如果使用declared_attr.cascading
修饰符与一个声明属性,而该属性本身是在要映射的类上声明的,而不是在混合类或__abstract__
类上声明,则会发出警告。declared_attr.cascading
修饰符目前仅适用于混合/抽象类。
参考:#3847 - [bug] [ext]
改进了关联代理列表集合,以防止针对新创建的关联对象进行过早的自动刷新,如果使用list.append()
,并且当关联代理访问端点集合时会调用惰性加载。现在首先访问端点集合,然后调用创建者以生成关联对象。
参考:#3941 - [bug] [ext]
sqlalchemy.ext.hybrid.hybrid_property
类现在支持在子类中多次调用诸如@setter
、@expression
等的 mutators,并且现在提供了一个@getter
mutator,以便特定的混合可以在子类或其他类中重新使用。这现在与标准 Python 中的@property
的行为相匹配。
另请参阅
混合属性支持在子类之间重用,重新定义@getter
参考:#3911, #3912 - [bug] [ext]
修复了sqlalchemy.ext.serializer
扩展中的一个 bug,即“注释”SQL 元素(由 ORM 为许多类型的 SQL 表达式生成)无法可靠地序列化。还将序列化器的默认 pickle 级别提升到“HIGHEST_PROTOCOL”。
参考:#3918
1.2.19
发布日期:2019 年 4 月 15 日
orm
- [orm] [bug]
由于引入了用于关系惰性加载器的烘焙查询,导致 1.2 版本中的一个回归,生成“惰性子句”时会出现竞争条件,该条件发生在一个被记忆的属性内。如果两个线程同时初始化被记忆的属性,则烘焙查询可能会生成带有绑定参数键的查询,然后在下一次运行时用新键替换,导致惰性加载查询将相关条件指定为None
。修复确保在生成新子句和参数对象之前固定参数名称,以便每次名称都相同。
参考:#4507
示例
- [示例] [bug]
修复了大结果集示例中的一个 bug,由于代码重排导致“id”变量被重新命名,导致测试失败。感谢 Matt Schuchhardt 提供的拉取请求。
参考:#4528
engine
- [engine] [bug]
使用__eq__()
比较两个URL
对象时没有考虑端口号,只有端口号不同的两个对象被认为是相等的。现在在URL
的__eq__()
方法中添加了端口比较,端口号不同的对象现在不相等。此外,在 Python2 中使用!=
时,URL
没有实现__ne__()
,这导致了意外的结果,因为在 Python2 中比较运算符之间没有暗示的关系。
参考:#4406
mssql
- [mssql] [bug]
在将隔离级别更改为 SNAPSHOT 后会发出一个 commit(),因为 pyodbc 和 pymssql 都会打开一个隐式事务,这会阻止当前事务中的后续 SQL 被发出。
参考:#4536
oracle
- [oracle] [bug]
为 Oracle 方言添加了对NCHAR
数据类型的反射支持,并将NCHAR
添加到 Oracle 方言导出的类型列表中。
参考:#4506
orm
- [orm] [bug]
由于为关系惰性加载器引入了烘焙查询,导致 1.2 中出现了一个回归问题,其中在生成“惰性子句”期间创建了一个竞争条件,该条件发生在一个被备忘的属性内。如果两个线程同时初始化备忘属性,则烘焙查询可能会生成带有绑定参数键的查询,然后在下一次运行时用新键替换,导致惰性加载查询将相关条件指定为None
。修复确保在生成新子句和参数对象之前固定参数名称,以便每次名称都相同。
参考:#4507
示例
- [examples] [bug]
修复了大结果集示例中的一个 bug,由于代码重排导致“id”变量被重新命名,导致测试失败。感谢 Matt Schuchhardt 提供的拉取请求。
参考:#4528
engine
- [engine] [bug]
使用__eq__()
比较两个URL
对象时没有考虑端口号,仅通过端口号不同的两个对象被视为相等。现在,在URL
的__eq__()
方法中添加了端口比较,端口号不同的对象现在不相等。另外,URL
中也没有实现__ne__()
,这导致在 Python2 中使用!=
时出现意外结果,因为在 Python2 中比较运算符之间没有暗含的关系。
引用:#4406
mssql
- [mssql] [bug]
在将隔离级别更改为 SNAPSHOT 时发出 commit(),因为 pyodbc 和 pymssql 都会打开一个隐式事务,这会阻止当前事务中发出后续的 SQL。
引用:#4536
oracle
- [oracle] [bug]
增加了对 Oracle 方言的NCHAR
数据类型的反射支持,并将NCHAR
添加到 Oracle 方言导出的类型列表中。
引用:#4506
1.2.18
发布日期:2019 年 2 月 15 日
orm
- [orm] [bug]
修复了 1.2 版本中的一个回归问题,其中通配符/load_only 加载器选项对使用 of_type() 限制到特定子类的加载器路径不起作用。修复目前仅适用于简单子类的 of_type(),而不是使用多态实体的 with_polymorphic,后者将在单独的问题中处理;以前很可能不起作用。
引用:#4468 - [orm] [bug]
修复了一个相当简单但关键的问题,即当SessionEvents.pending_to_persistent()
事件不仅在对象从挂起转为持久时触发时,而且在对象已经是持久的并且仅在更新时触发时,导致该事件被触发用于每次更新的所有对象。
引用:#4489
sql
- [sql] [bug]
修复了JSON
类型具有只读的JSON.should_evaluate_none
属性的问题,当与此类型一起使用TypeEngine.evaluates_none()
方法时会导致失败。拉取请求感谢 Sanjana S。
参考:#4485
mysql
- [mysql] [bug]
修复了由#4344引起的第二个回归问题(第一个是#4361),该问题解决了 MySQL 问题 88718,其中使用的小写函数对于 Python 2 与 OSX/Windows 大小写约定不正确,然后会引发TypeError
。现在已经为此逻辑添加了完整的覆盖,以便以模拟样式执行所有三种大小写约定在所有 Python 版本上的所有代码路径。与此同时,MySQL 8.0 已经修复了问题 88718,因此这个解决方法仅适用于特定范围的 MySQL 8.0 版本。
参考:#4492
sqlite
- [sqlite] [bug]
修复了在 SQLite DDL 中的一个 bug,其中在服务器端默认值使用表达式时需要将其包含在括号中才能被 SQLite 解析器接受。感谢 Bartlomiej Biernacki 提供的拉取请求。
参考:#4474
mssql
- [mssql] [bug]
修复了一个 bug,即 SQL Server 的“IDENTITY_INSERT”逻辑允许在 IDENTITY 列上使用显式值进行 INSERT 时未检测到Insert.values()
与包含Column
作为键和 SQL 表达式作为值的字典一起使用的情况。
参考:#4499
orm
- [orm] [bug]
修复了 1.2 版本中的一个回归问题,其中通配符/load_only 加载器选项对于使用 of_type()限制到特定子类的加载器路径不会正确工作。修复目前仅适用于简单子类的 of_type(),而不适用于将在单独的问题中解决的 with_polymorphic 实体;这后一种情况以前可能不起作用。
参考:#4468 - [orm] [bug]
修复了一个相当简单但关键的问题,即SessionEvents.pending_to_persistent()
事件不仅在对象从挂起状态转为持久状态时被调用,而且在对象已经是持久状态并且只是被更新时也会被调用,从而导致事件在每次更新时为所有对象被调用。
参考:#4489
sql
- [sql] [bug]
修复了JSON
类型具有只读JSON.should_evaluate_none
属性的问题,这会导致在使用TypeEngine.evaluates_none()
方法与此类型一起使用时出现故障。感谢 Sanjana S 提供的拉取请求。
参考:#4485
mysql
- [mysql] [bug]
修复了由#4344引起的第二个回归(第一个是#4361),该回归解决了 MySQL 问题 88718,其中使用的小写函数对于具有 OSX/Windows 大小写约定的 Python 2 来说不正确,然后会引发TypeError
。已对此逻辑进行了全面覆盖,以便在所有 Python 版本的所有三种大小写约定上以模拟样式执行每个代码路径。与此同时,MySQL 8.0 已经修复了问题 88718,因此这个解决方法仅适用于特定范围的 MySQL 8.0 版本。
参考:#4492
sqlite
- [sqlite] [bug]
修复了 SQLite DDL 中的一个 bug,即在将表达式作为服务器端默认值时,必须将其包含在括号中才能被 sqlite 解析器接受。感谢 Bartlomiej Biernacki 提供的拉取请求。
参考:#4474
mssql
- [mssql] [bug]
修复了一个 bug,即 SQL Server 的“IDENTITY_INSERT”逻辑允许在 IDENTITY 列上使用显式值进行 INSERT 时,未检测到使用字典的情况,该字典将Column
作为键,SQL 表达式作为值。
参考:#4499
1.2.17
发布日期:2019 年 1 月 25 日
orm
- [orm] [功能]
添加了新的事件钩子QueryEvents.before_compile_update()
和QueryEvents.before_compile_delete()
,这些事件钩子在Query.update()
和Query.delete()
方法的情况下补充了QueryEvents.before_compile()
。
参考:#4461 - [orm] [bug]
修复了在使用单表继承与使用“with polymorphic”加载的连接继承层次结构时,该单表实体的“单表条件”可能会与在同一查询中使用的同一层次结构的其他实体的条件混淆的问题。对“单表条件”的调整更具体地针对目标实体,以避免它意外地适应查询中的其他表。
参考:#4454
postgresql
- [postgresql] [bug]
修订了在反射 CHECK 约束时使用的查询,以利用pg_get_constraintdef
函数,因为consrc
列在 PG 12 中已被弃用。感谢 John A Stevenson 的提示。
参考:#4463
oracle
- [oracle] [bug]
由于在 1.2 版本中重构了 cx_Oracle 方言,修复了整数精度逻辑的回归。我们现在不再将 cx_Oracle.NATIVE_INT 类型应用于发送整数值的结果列(检测为具有正精度和 scale == 0 的值),这会导致超出 32 位边界的值发生整数溢出问题。相反,输出变量保持未命名,以便 cx_Oracle 可以选择最佳选项。
参考:#4457
orm
- [orm] [feature]
添加了新的事件钩子QueryEvents.before_compile_update()
和QueryEvents.before_compile_delete()
,这与Query.update()
和Query.delete()
方法相辅相成。
参考:#4461 - [orm] [bug]
修复了在使用单表继承与使用“with polymorphic”加载的连接继承层次结构时,该单表实体的“单表条件”可能会与在同一查询中使用的同一层次结构的其他实体的条件混淆的问题。对“单表条件”的调整更具体地针对目标实体,以避免它意外地适应查询中的其他表。
参考:#4454
postgresql
- [postgresql] [bug]
对于反射 CHECK 约束时使用的查询进行了修订,利用了pg_get_constraintdef
函数,因为consrc
列在 PG 12 中被弃用。感谢 John A Stevenson 的建议。
参考:#4463
oracle
- [oracle] [bug]
由于在 1.2 版中重构了 cx_Oracle 方言,导致整数精度逻辑出现回归。我们现在不再将 cx_Oracle.NATIVE_INT 类型应用于发送整数值的结果列(检测为具有正精度和 scale == 0 的值),因为这会导致超出 32 位边界的值发生整数溢出问题。相反,输出变量保持未命名,以便 cx_Oracle 可以选择最佳选项。
参考:#4457
1.2.16
发布日期:2019 年 1 月 11 日
engine
- [engine] [bug]
在版本 1.2 中引入的回归已修复,该版本中对SQLAlchemyError
基本异常类进行了重构,将纯字符串消息不适当地强制转换为 Unicode(在 Python 2k 下,这由 Python 解释器处理,不处理平台编码之外的字符(通常是 ascii)。SQLAlchemyError
类现在在 Py2K 下通过__str__()
传递字节串,这是 Py2K 下异常对象的一般行为,对于__unicode__()
进行安全的 utf-8 强制转换。对于 Py3K,消息通常已经是 Unicode,但如果不是,则再次进行安全的 utf-8 强制转换以备用于__str__()
方法。
参考:#4429
sql
- [sql] [bug] [mysql] [oracle]
修复了一个问题,即针对 MySQL 和 Oracle 数据库,将用于即将推出的 Alembic 版本的DropTableComment
发出的 DDL 不正确。
参考:#4436
postgresql
- [postgresql] [bug]
修复了一个问题,即在远程模式下存在的ENUM
或自定义域,如果枚举/域的名称或模式的名称需要引用,则在列反射中将无法识别。现在,一个新的解析方案完全解析出带引号或不带引号的标记,包括支持 SQL 转义引号。
参考:#4416 - [postgresql] [bug]
修复了一个问题,即如果多个由相同的MetaData
对象引用的多个ENUM
对象在不同的模式名称下具有相同的名称,则在创建期间将无法创建。PostgreSQL 方言使用的内部记忆化现在会考虑模式名称,在 DDL 创建序列期间跟踪它是否已在数据库中创建了特定的ENUM
。
sqlite
- [sqlite] [bug]
基于 SQL 表达式的索引反射现在会跳过,并显示警告,方式与 Postgresql 方言相同,在那里我们目前不支持反映具有其中的 SQL 表达式的索引。以前,会生成具有列为 None 的索引,这会破坏像 Alembic 这样的工具。
参考资料:#4431
杂项
- [no_tags]
在“expanding IN”功能中修复了问题,其中在查询中多次使用相同的绑定参数名称会导致查询中的参数重写过程中出现 KeyError。
参考资料:#4394
engine
- [engine] [bug]
修复了 1.2 版本中引入的退化问题,其中SQLAlchemyError
基本异常类的重构引入了对纯字符串消息的不适当强制转换为 Unicode 在 python 2k 下,在平台的编码之外(通常是 ascii)不由 Python 解释器处理的字符。SQLAlchemyError
类现在在 Py2K 下将字节串通过__str__()
传递,这是 Py2K 下异常对象的一般行为,对于__unicode__()
进行了安全的 utf-8 强制转换并回退到反斜杠。对于 Py3K,消息通常已经是 unicode,但如果不是,则再次进行 utf-8 的安全强制转换,并为__str__()
方法进行反斜杠回退。
参考资料:#4429
sql
- [sql] [bug] [mysql] [oracle]
修复了为 MySQL 和 Oracle 数据库准备的将用于即将推出的版本的 Alembic 的DropTableComment
发出的 DDL 错误的问题。
参考资料:#4436
postgresql
- [postgresql] [bug]
修复了在列反射中无法识别远程模式中存在的ENUM
或自定义域的问题,如果枚举/域的名称或模式的名称需要引号。现在的新解析方案完全解析出带引号或不带引号的标记,包括对 SQL 转义引号的支持。
参考:#4416 - [postgresql] [bug]
修复了多个由相同MetaData
对象引用的ENUM
对象在具有不同模式名称的相同名称的多个对象时无法创建的问题。PostgreSQL 方言在 DDL 创建序列期间用于跟踪是否在数据库中创建了特定ENUM
的内部记忆现在考虑模式名称。
sqlite
- [sqlite] [bug]
基于 SQL 表达式的索引的反射现在会跳过并发出警告,与 Postgresql 方言的方式相同,我们目前不支持反射具有 SQL 表达式的索引。以前,会生成具有 None 列的索引,这会破坏像 Alembic 这样的工具。
参考:#4431
杂项
- [no_tags]
修复了“扩展 IN”功能中在查询中多次使用相同绑定参数名称会导致在重写查询中的参数时出现 KeyError 的问题。
参考:#4394
1.2.15
发布日期:2018 年 12 月 11 日
orm
- [orm] [bug]
修复了在声明性映射中使用模式ForeignKey(SomeClass.id)
时,ORM 注释可能不正确的 bug,这种模式会将不需要的注释泄漏到连接条件中,这可能会破坏Query
中进行的不应影响该连接条件中的元素的别名操作。如果存在这些注释,现在会提前将其删除。
参考:#4367 - [orm] [bug]
继续与最近的#4349类似的主题,修复了Comparator.any()
和Comparator.has()
的问题,其中“secondary”可选择性地需要明确作为 FROM 子句的一部分存在于 EXISTS 子查询中,以适应“secondary”是Join
对象的情况。
参考:#4366 - [orm] [bug]
修复了由#4349引起的回归,其中将“secondary”表添加到动态加载器的 FROM 子句会影响Query
后续连接到另一个实体的能力。修复将主实体添加为 FROM 列表的第一个元素,因为Query.join()
希望从那里跳转。版本 1.3 也将对这个问题有一个更全面的解决方案(#4365)。
参考:#4363 - [orm] [bug]
修复了使用RelationshipProperty.of_type()
链式映射选项的 bug,与仅通过字符串引用属性名称的链式选项一起使用时,无法定位属性的问题。
参考:#4400
orm declarative
- [orm] [declarative] [bug]
在将column()
对象应用于声明类的情况下,会发出警告,因为这似乎是想要一个Column
对象。
参考:#4374
杂项
- [no_tags]
增加了对 mysqlclient 和 pymysql 接受的write_timeout
标志在 URL 字符串中传递的支持。
参考:#4381 - [no_tags]
修复了无法识别表达为数组的 PostgreSQL 域的反射问题。感谢 Jakub Synowiec 的拉取请求。
参考:#4377,#4380
orm
- [orm] [bug]
修复了一个错误,即如果在声明映射中使用模式ForeignKey(SomeClass.id)
,则关系的 primaryjoin/secondaryjoin 的 ORM 注释可能不正确。这种模式会将不需要的注释泄漏到加入条件中,这可能会破坏Query
中进行的别名操作,这些别名操作不应影响该加入条件中的元素。如果存在这些注释,现在会立即删除。
参考:#4367 - [orm] [bug]
继续与最近的#4349类似的主题,修复了Comparator.any()
和Comparator.has()
的问题,其中“secondary”可选择性地需要明确作为 FROM 子句的一部分存在于 EXISTS 子查询中,以适应“secondary”是Join
对象的情况。
参考:#4366 - [orm] [bug]
由#4349引起的回归错误已修复,其中将“secondary”表添加到动态加载器的 FROM 子句会影响Query
后续加入到另一个实体的能力。修复方法是将主实体作为 FROM 列表的第一个元素,因为Query.join()
希望从那里跳转。版本 1.3 还将���此问题提供更全面的解决方案(#4365)。
参考:#4363 - [orm] [bug]
修复了使用RelationshipProperty.of_type()
链式映射器选项与仅通过字符串引用属性名称的链式选项进行链接时无法定位属性的错误。
参考:#4400
orm 声明式
- [orm] [declarative] [bug]
当将column()
对象应用于声明类时,会发出警告,因为这似乎是打算将其作为Column
对象。
参考:#4374
杂项
- [no_tags]
增加了对write_timeout
标志的支持,该标志被 mysqlclient 和 pymysql 接受并传递到 URL 字符串中。
参考:#4381 - [no_tags]
修复了一个问题,即将表示为数组的 PostgreSQL 域的反射会失败无法被识别。感谢 Jakub Synowiec 提交的拉取请求。
参考:#4377, #4380
1.2.14
发布日期:2018 年 11 月 10 日
orm
- [orm] [bug]
修复了Session.bulk_update_mappings()
中的错误,在其中,备用映射属性名称会导致 UPDATE 语句的主键列包含在 SET 子句中,以及在 WHERE 子句中;虽然通常是无害的,但对于 SQL Server,这可能由于 IDENTITY 列而引发错误。这是与 #3849 中修复的同一错误的延续,其中测试不足以捕捉到这个额外的缺陷。
参考:#4357 - [orm] [bug]
修复了一个小的性能问题,可能会在某些情况下给结果获取增加不必要的开销,这涉及到在查询中同时使用 ORM 列和包含这些相同列的实体。这个问题与在不同方式中引用列时的哈希 / 相等性开销有关。
参考:#4347
mysql
- [mysql] [bug]
修复了 1.2.13 中发布的 #4344 引起的回归问题,在此版本中,对于 MySQL 8.0 在反射外键引用时处理列名大小写敏感性问题的修复是通过使用information_schema.columns
视图来解决的。这个解决方法在 OSX /lower_case_table_names=2
上失败了,这会导致information_schema.columns
与SHOW CREATE TABLE
的大小写不匹配,因此在不区分大小写的 SQL 模式下,现在使用不区分大小写的匹配。
参考:#4361
orm
- [orm] [bug]
修复了Session.bulk_update_mappings()
中的错误,在其中,备用映射属性名称会导致 UPDATE 语句的主键列包含在 SET 子句中,以及在 WHERE 子句中;虽然通常是无害的,但对于 SQL Server,这可能由于 IDENTITY 列而引发错误。这是与 #3849 中修复的同一错误的延续,其中测试不足以捕捉到这个额外的缺陷。
参考:#4357 - [orm] [bug]
修复了一个小的性能问题,可能会在某些情况下给结果获取增加不必要的开销,这涉及到在查询中同时使用 ORM 列和包含这些相同列的实体。这个问题与在不同方式中引用列时的哈希 / 相等性开销有关。
参考:#4347
mysql
- [mysql] [bug]
修复了 1.2.13 中由#4344引起的回归问题,其中针对 MySQL 8.0 在反射外键引用列名称时的大小写敏感性问题的修复是通过使用information_schema.columns
视图来解决的。这种解决方法在 OSX /lower_case_table_names=2
上失败,因为information_schema.columns
与SHOW CREATE TABLE
的大小写不匹配,因此在不区分大小写的 SQL 模式下现在使用不区分大小写的匹配。
参考:#4361
1.2.13
发布日期:2018 年 10 月 31 日
orm
- [orm] [bug]
修复了“动态”加载器需要在查询的 FROM 子句中显式设置“secondary”表的 bug,以适应次要表是连接对象的情况,否则仅从其列中提取的查询中不会包含该表。
参考:#4349
orm declarative
- [orm] [declarative] [bug]
修复了 1.2.12 版本中由#4326引起的回归问题,当与synonym()
一起在 mixin 中使用declared_attr
时,无法正确将同义词映射到继承的子类。
参考:#4350 - [orm] [declarative] [bug]
在使用 use_existing_column 解决列冲突中讨论的列冲突解决技术现在对于Column
也是主键列的情况下可用。以前,在单继承子类上声明主键列时,会在允许列复制通过之前进行主键列检查。
参考:#4352
sql
- [sql] [feature]
重构了SQLCompiler
以公开类似于SQLCompiler.order_by_clause()
和SQLCompiler.limit_clause()
方法的SQLCompiler.group_by_clause()
方法,可以被方言重写以自定义 GROUP BY 的呈现方式。感谢 Samuel Chou 的拉取请求。 - [sql] [bug]
修复了Enum.create_constraint
标志在Enum
数据类型的副本中未传播的 bug,这影响了声明性混合和抽象基类等用例。
参考:#4341
postgresql
- [postgresql] [bug]
添加了对aggregate_order_by
函数的支持,以接收多个 ORDER BY 元素,先前只接受单个元素。
参考:#4337
mysql
- [mysql] [bug]
将单词function
添加到 MySQL 的保留字列表中,现在是 MySQL 8.0 中的关键字。
参考:#4348 - [mysql] [bug]
为 MySQL 8.0 系列引入的一个 bug #88718 添加了一个解决方法,其中外键约束的反射未报告引用列的正确大小写敏感性,导致在使用反射约束时出现错误,例如在使用 automap 扩展时。解决方法通过向 information_schema 表发出额外的查询来检索正确的大小写敏感名称。
参考:#4344
杂项
- [杂项] [bug]
修复了实用语言助手内部的一部分错误,该错误将错误类型的参数传递给 Python__import__
内置函数作为要导入的模块列表。该问题在核心库中没有产生任何症状,但可能会导致重新定义__import__
内置函数或以其他方式对其进行检测的外部应用程序出现问题。感谢 Joe Urciuoli 提交的拉取请求。 - [杂项] [bug] [py3k]
修复了由于 Python 3.7 中 Pythoncollections
和collections.abc
包组织变化而生成的额外警告。之前的collections
警告在版本 1.2.11 中已修复。感谢 xtreak 提交的拉取请求。
参考:#4339 - [bug] [ext]
在关联代理扩展的基于列表的关联集合中添加了缺失的.index()
方法。
orm
- [orm] [bug]
修复了“动态”加载器需要显式设置查询的 FROM 子句中的“secondary”表的 bug,以适应次要表是一个联接对象,否则仅从其列中拉入查询会导致问题的情况。
参考:#4349
orm 声明性
- [orm] [declarative] [bug]
修复了版本 1.2.12 中由#4326引起的回归,使用declared_attr
与 mixin 结合使用synonym()
会导致将同义词正确映射到继承子类失败。
参考:#4350 - [orm] [declarative] [bug]
现在,讨论的列冲突解决技术使用use_existing_column
解决列冲突对于Column
也是主键列的功能正常运行。以前,在单继承子类上声明主键列之前,会发生主键列检查,然后才允许列复制通过。
参考:#4352
sql
- [sql] [feature]
重构了SQLCompiler
以公开一个类似于SQLCompiler.order_by_clause()
和SQLCompiler.limit_clause()
方法的SQLCompiler.group_by_clause()
方法,可以被方言重写以自定义 GROUP BY 的呈现方式。感谢 Samuel Chou 的拉取请求。 - [sql] [bug]
修复了Enum.create_constraint
标志在Enum
数据类型的副本中不会传播的错误,这会影响到声明性 mixin 和抽象基类等用例。
参考:#4341
postgresql
- [postgresql] [bug]
添加了对aggregate_order_by
函数接收多个 ORDER BY 元素的支持,以前只接受单个元素。
参考:#4337
mysql
- [mysql] [bug]
将function
一词添加到 MySQL 的保留字列表中,现在在 MySQL 8.0 中是一个关键字。
参考:#4348 - [mysql] [bug]
添加了针对 MySQL 8.0 系列引入的 bug #88718 的解决方法,其中外键约束的反射未报告所引用列的正确大小写敏感性,导致在使用反射约束时出现错误,例如在使用 automap 扩展时。解决方法通过向 information_schema 表发出额外查询来检索正确的大小写敏感名称。
参考:#4344
misc
- [misc] [bug]
修复了实用语言助手内部的一部分问题,该问题将错误类型的参数传递给 Python__import__
内置函数作为要导入的模块列表。该问题在核心库中没有产生任何症状,但可能会导致重新定义__import__
内置函数或以其他方式对其进行调试的外部应用程序出现问题。感谢 Joe Urciuoli 提供的拉取请求。 - [misc] [bug] [py3k]
修复了 Python 3.7 由于 Pythoncollections
和collections.abc
包组织结构变化而生成的额外警告。之前的collections
警告在 1.2.11 版本中已修复。感谢 xtreak 提供的拉取请求。
参考:#4339 - [bug] [ext]
在关联代理扩展中添加了缺失的.index()
方法到基于列表的关联集合。
版本号:1.2.12
发布日期:2018 年 9 月 19 日
orm
- [orm] [bug]
在弱引用清理中添加了一个检查,用于检查InstanceState
对象是否存在dict
内置对象,以减少在解释器关闭期间发生这些清理时生成的错误消息。感谢 Romuald Brunet 提供的拉取请求。 - [orm] [bug]
修复了一个 bug,即在与Query.join()
以及Query.select_entity_from()
结合使用Lateral
构造时,不会将适配器应用于连接的右侧。 “lateral”引入了连接右侧可关联的用例。先前,未考虑适配此子句。请注意,在 1.2 版本中,由Query.subquery()
引入的可选择项仍未适配,原因是#4304;可选择项需要由select()
函数生成,以成为“lateral”连接的右侧。
参考:#4334 - [orm] [bug]
修复了 1.2 版本中由 #3472 引起的回归问题,即在后续更新操作的上下文中处理“updated_at”风格列时,也会发生在更新后要删除的行上,这意味着具有 Python 端值生成器的列将显示在 UPDATE 之前发出的现在已删除的值(这不是以前的行为),以及 SQL 发出的值生成器将使属性过期,这意味着由于行已被删除且对象已从会话中分离,因此无法访问以前的值。对于最终将被删除的对象,完全跳过了作为 #3472 的一部分添加的“postfetch”逻辑。
参考:#4327
orm declarative
- [orm] [declarative] [bug]
修复了一个 bug,即在已映射类的子类上通过@declared_attr
可调用获取描述符时,声明性扫描属性会收到混合属性提供的表达式代理,而不是混合属性本身。这会导致在Mapper.all_orm_descriptors
中查看时,属性不会报告自身为混合属性。
参考:#4326
postgresql
- [postgresql] [bug]
修复了 PostgreSQL 方言中的一个 bug,即编译器关键字参数(如literal_binds=True
)未传播到 DISTINCT ON 表达式。
参考:#4325 - [postgresql] [bug]
修复了array_agg()
函数,这是通常array_agg()
函数的略有改变版本,也接受传入的“type”参数,而不强制将其包装在 ARRAY 中,本质上与 1.1 中为通用函数修复的相同问题 #4107。
参考:#4324 - [postgresql] [bug]
修复了 PostgreSQL ENUM 反射中的 bug,即查询中会报告包含引号的区分大小写的名称,这在表反射期间不会与目标列匹配,因为需要去掉引号。
参考:#4323
oracle
- [oracle] [bug]
修复了针对 cx_Oracle 7.0 的问题,其中 Oracle param.getvalue() 的行为现在返回一个列表,而不是单个标量值,这破坏了 Core 和 ORM 中的自增逻辑。对于 cx_Oracle 6.3 和 6.4,使用了 dml_ret_array_val 兼容标志来建立与 7.0 及更高版本的兼容行为,对于 cx_Oracle 6.2.1 及更早版本,版本号检查退回到旧逻辑。
参考:#4335
杂项
- [bug] [ext]
修复了BakedQuery
未包含会话(Session
)使用的特定查询类作为缓存键的问题,导致在使用自定义查询类时不兼容,特别是ShardedQuery
,它具有一些不同的参数签名。
参考:#4328
orm
- [orm] [bug]
在弱引用清理中增加了一个检查,检查InstanceState
对象中是否存在dict
内置对象,以减少在解释器关闭时发生清理时生成的错误消息。感谢 Romuald Brunet 的拉取请求。 - [orm] [bug]
修复了在使用Query.join()
以及Query.select_entity_from()
与Lateral
构造结合使用时,不会将子句适配应用于 join 的右侧的 bug。“lateral”引入了右侧 join 可相关的用例。以前,没有考虑到适配此子句。请注意,在 1.2 版本中,由Query.subquery()
引入的可选择项仍未适配,因为#4304;可选择项需要由select()
函数生成以成为“lateral”连接的右侧。
参考:#4334 - [orm] [bug]
修复了由#3472引起的 1.2 回归,即在后续更新操作的上下文中处理“updated_at”样式列时,也会发生对于随后将被删除的行的更新,这意味着具有 Python 端值生成器的列将显示在 UPDATE 之前发出的现在已删除的值(这不是以前的行为),以及 SQL 发出的值生成器将使属性过期,这意味着由于行已被删除且对象已从会话中分离,因此无法访问先前的值。对于最终将被删除的对象,完全跳过了作为#3472的一部分添加的“postfetch”逻辑。
参考:#4327
orm 声明式
- [orm] [declarative] [bug]
修复了一个 bug,即在已映射类的子类上通过@declared_attr
可调用获取描述符时,声明扫描属性会收到混合属性提供的表达式代理,而不是混合属性本身。这会导致在Mapper.all_orm_descriptors
中查看时,该属性不会报告自身为混合属性。
参考:#4326
postgresql
- [postgresql] [bug]
修复了 PostgreSQL 方言中的 bug,即编译器关键字参数(如literal_binds=True
)未传播到 DISTINCT ON 表达式。
参考:#4325 - [postgresql] [bug]
修复了array_agg()
函数,这是通常array_agg()
函数的略有改变版本,也接受传入的“type”参数,而不强制在其周围添加一个 ARRAY,这与 1.1 中为通用函数修复的内容相同,见#4107。
参考:#4324 - [postgresql] [bug]
修复了 PostgreSQL ENUM 反射中的 bug,即查询中包含带引号的区分大小写名称,这些引号在表反射期间不会匹配目标列,因为需要去掉引号。
参考:#4323
oracle
- [oracle] [bug]
修复了 cx_Oracle 7.0 中 Oracle param.getvalue() 的行为,现在返回一个列表,而不是单个标量值,这会破坏 Core 和 ORM 中的自增逻辑。对于 cx_Oracle 6.3 和 6.4,使用 dml_ret_array_val 兼容性标志来建立与 7.0 及以后版本的兼容性行为,对于 cx_Oracle 6.2.1 及之前的版本,版本号检查会回退到旧逻辑。
参考文献:#4335
misc
- [bug] [ext]
修复了BakedQuery
不包含由Session
使用的特定查询类作为缓存键的一部分的问题,导致在使用自定义查询类时不兼容,特别是ShardedQuery
具有一些不同的参数签名。
参考文献:#4328
1.2.11
发布日期:2018 年 8 月 20 日
orm declarative
- [orm] [declarative] [bug]
修复了先前未经测试的用例中的问题,允许声明式映射类继承自声明基类之外的经典映射类,其中包括它适应未映射的中间类。未映射的中间类可以指定__abstract__
,现在可以正确解释,或者中间类可以保持未标记状态,并且经典映射的基类将在层次结构中被检测到。为了预期可能正在将经典映射混合到现有声明层次结构中的现有情景,如果检测到给定类的多个映射基类,则现在会引发错误。
参考文献:#4321
sql
- [sql] [bug]
修复了一个与 #3639 密切相关的问题,即在非本地布尔后端的布尔上下文中呈现的表达式将与 1/0 进行比较,即使它已经是隐式布尔表达式,当使用ColumnElement.self_group()
时也是如此。虽然这不影响用户友好的后端(MySQL、SQLite),但 Oracle(可能还有 SQL Server)没有处理它。现在,任何数据库上是否隐式布尔表达式现在都会被事先确定为在语句的编译中不生成整数比较的附加检查。
参考文献:#4320 - [sql] [bug]
将缺失的窗口函数参数WithinGroup.over.range_
和WithinGroup.over.rows
参数添加到WithinGroup.over()
和FunctionFilter.over()
方法中,以对应于 SQL 函数的“over”方法中在版本 1.1 中添加的 range/rows 功能。
参考:#4322 - [sql] [bug]
修复了 UPDATE 和 DELETE 语句的多表支持未将额外的 FROM 元素视为与语句结合时的相关目标的 bug,当相关的 SELECT 也与语句结合时。此更改现在包括在 WHERE 子句中的 SELECT 语句将尝试自动关联回父 UPDATE/DELETE 中的这些额外表,或者如果使用Select.correlate()
,则无条件关联。请注意,如果 SELECT 语句的结果没有 FROM 子句,则自动关联会引发错误,这种情况现在可能发生,如果父 UPDATE/DELETE 在其额外的表集中指定相同的表,请显式指定Select.correlate()
以解决。
参考:#4313
oracle
- [oracle] [bug]
对于 cx_Oracle,整数数据类型现在将绑定到“int”,根据 cx_Oracle 开发人员的建议。在 cx_Oracle 6.x 系列中,以前使用 cx_Oracle.NUMBER 会导致精度丢失。
参考:#4309
杂项
- [bug] [py3k]
开始在 Python 3.3 及更高版本中从“collections.abc”导入“collections”以实现 Python 3.8 的兼容性。感谢 Nathaniel Knight 的拉取请求。 - [no_tags]
修复了在表反射中用于 SQLite 数据库的“schema”名称未正确引用模式名称的问题。感谢 Phillip Cloud 的拉取请求。
orm 声明式
- [orm] [declarative] [bug]
修复了以前未经测试的用例中的问题,允许声明映射类从声明基类之外的经典映射类继承,包括适应未映射的中间类。未映射的中间类可以指定__abstract__
,现在将正确解释,或者中间类可以保持未标记,而经典映射的基类将在层次结构中被检测到。为了预期可能将经典映射混合到现有声明层次结构中的现有场景,如果检测到给定类的多个映射基类,则现在会引发错误。
参考:#4321
sql
- [sql] [bug]
修复了一个与#3639密切相关的问题,即在非本地布尔后端上渲染为布尔上下文的表达式将与 1/0 进行比较,即使它已经是一个隐式布尔表达式,当使用ColumnElement.self_group()
时。虽然这不会影响用户友好的后端(MySQL,SQLite),但 Oracle(可能还有 SQL Server)没有处理。现在,无论在任何数据库上表达式是否隐式布尔都将在编译语句时提前确定,以避免生成整数比较。
参考:#4320 - [sql] [bug]
将缺失的窗口函数参数WithinGroup.over.range_
和WithinGroup.over.rows
参数添加到WithinGroup.over()
和FunctionFilter.over()
方法中,以对应于版本 1.1 中作为 SQL 函数“over”方法的一部分添加的 range/rows 功能的特性#3049。
参考:#4322 - [sql] [bug]
修复了一个错误,在联合 SELECT 与语句结合时,UPDATE 和 DELETE 语句的多表支持没有将额外的 FROM 元素视为相关目标,此时一个相关的 SELECT 也与该语句结合。此更改现在包括了在这样一个语句的 WHERE 子句中的 SELECT 语句将尝试自动关联到父 UPDATE/DELETE 中的这些额外表,或者如果使用Select.correlate()
则无条件关联。请注意,如果 SELECT 语句的结果没有 FROM 子句,则自动关联会引发错误,这现在可能会发生,如果父 UPDATE/DELETE 指定了相同的表在其额外的表集中;请显式指定Select.correlate()
以解决此问题。
参考:#4313
oracle
- [oracle] [bug]
对于 cx_Oracle,Integer 数据类型现在将绑定到“int”,根据 cx_Oracle 开发人员的建议。以前,在 cx_Oracle 6.x 系列中使用 cx_Oracle.NUMBER 会导致精度丢失。
参考:#4309
杂项
- [bug] [py3k]
开始在 Python 3.3 及更高版本中从“collections”导入“collections.abc”,以实现与 Python 3.8 的兼容性。由 Nathaniel Knight 提供的 Pull 请求。 - [no_tags]
修复了在表反射中使用的 SQLite 数据库的“schema”名称无法正确引用模式名称的问题。由 Phillip Cloud 提供的 Pull 请求。
SqlAlchemy 2.0 中文文档(六十一)(3)https://developer.aliyun.com/article/1560911