SqlAlchemy 2.0 中文文档(六十一)(4)https://developer.aliyun.com/article/1560912
1.2.0b1
发布日期:2017 年 7 月 10 日
orm
- [orm] [功能]
aliased()构造现在可以传递给Query.select_entity_from()方法。实体将从由aliased()构造表示的可选择项中提取。这允许与Query.select_entity_from()一起使用aliased()的特殊选项,例如aliased.adapt_on_names。
此更改还回溯到:1.1.7
参考:#3933 - [orm] [功能]
向scoped_session添加了.autocommit属性,代理当前分配给线程的底层Session的.autocommit属性。感谢 Ben Fagin 的拉取请求。 - [orm] [功能]
添加了一个新特性with_expression(),允许在结果时间将一个临时 SQL 表达式添加到查询中的特定实体。这是 SQL 表达式作为结果元组中的一个单独元素传递的替代方法。
参见
ORM 属性可以接收临时 SQL 表达式
参考:#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 中的新“修改”事件处理程序
参考:#3303 - [orm] [bug]
修复了子查询急加载的问题,这个问题延续自#2699、#3106、#3893中修复的一系列问题,涉及到“子查询”在从连接的继承子类开始,然后对基类的关系进行子查询急加载时,包含正确的 FROM 子句,同时查询还包括对子类的条件。之前票证中的修复没有考虑到从第一级更深层次加载更多的 subqueryload 操作,因此修复进一步泛化。
此更改也回溯到:1.1.11
参考:#4011 - [orm] [bug]
修复了级联操作(如“delete-orphan”等)无法定位与继承关系中本地关系相连的对象的 bug,从而导致操作无法执行。
此更改也回溯到: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]
修复了几个使用relationship.post_update功能的用例,当与具有“onupdate”值的列一起使用时。当 UPDATE 发出时,相应的对象属性现在会过期或刷新,以便新生成的“onupdate”值可以填充到对象中;以前的过时值将保留。此外,如果目标属性在 Python 中设置为对象的 INSERT,那么在 UPDATE 期间该值现在将被重新发送,以便“onupdate”不会覆盖它(请注意,这对于服务器生成的 onupdates 同样有效)。最后,在刷新时,当在 flush 中刷新这些属性时,现在会发出SessionEvents.refresh_flush()事件。
另请参阅
与 onupdate 一起的 post_update 的改进
参考:#3471, #3472 - [orm] [bug]
修复了一个 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]
修复了一个 bug,在其中结合“with_polymorphic”加载与指定了 innerjoin=True 的子类链接关系的 joinedload 结合使用时,会导致无法将这些“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()标记为“deferred”后,在 flush 期间会将其标记为“expired”,导致它与常规属性的未过期加载一起被加载,即使从未访问过该属性也是如此。
参考资料:#3984 - [orm] [bug]
修复了子查询提前加载中的错误,其中自引用关系的“join_depth”参数不会被正确地识别,而是加载所有可用的深度,而不是正确地计算提前加载的指定级别数。
参考资料:#3967 - [orm] [bug]
向Mapper(最终也将用于其他基于 ORM 的 LRU 缓存)的 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]
修复了单表继承中的 bug,当将行限制为子类时,select_from()参数不会被考虑。以前,只有请求的列中的表达式会被考虑。
另请参阅
修复了与 select_from()一起使用的单表继承的问题
参考:#3891 - [orm] [bug]
当将集合分配给由关系映射的属性时,先前的集合不再被改变。以前,旧集合会在“项移除”事件触发时被清空;现在事件会触发而不影响旧集合。
另请参阅
替换时不再改变先前的集合
参考:#3913 - [orm] [bug]
当SessionEvents.after_rollback()事件被触发时,Session的状态现在是存在的,即对象在过期之前的属性状态。这与SessionEvents.after_commit()事件的行为一致,该事件在对象的属性状态过期之前也会被触发。
另请参阅
在对象过期之前,after_rollback() Session 事件现在会被触发
参考:#3934 - [orm] [bug]
修复了一个 bug,Query.with_parent()在针对aliased()构造而不是常规映射类时无法工作。还为独立的with_parent()函数以及Query.with_parent()添加了一个新参数with_parent.from_entity。
参考:#3607
orm 声明
- [orm] [declarative] [bug]
修复了在AbstractConcreteBase上使用declared_attr时的错误,其中特定返回值为一些非映射符号,包括None,会导致属性只被强制评估一次并将值存储到对象字典中,不允许其为子类调用。当declared_attr在映射类上时,这种行为是正常的,并且不会发生在混入类或抽象类上。由于AbstractConcreteBase既是“抽象”的又实际上是“映射”的,因此在这里特殊的例外情况是“抽象”行为优先于declared_attr。
参考:#3848
引擎
- [引擎] [功能]
向Pool对象添加了本机“悲观断开”处理。新参数Pool.pre_ping,可从引擎中作为create_engine.pool_pre_ping获得,应用了池文档中特色的“预先 ping”配方的高效形式,每次连接检出时,发出一个简单的语句,通常是“SELECT 1”,以测试连接的活动性。如果现有连接不再能响应命令,则连接将被透明地回收,并且在当前时间戳之前进行的所有其他连接将被作废。
另请参阅
断开处理 - 悲观
连接池中添加了悲观断开检测
参考:#3919 - [引擎] [错误]
添加了一个异常处理程序,当Connection的“autorollback”功能本身引发异常时,将会警告“cause”异常在 Py2K 上。在 Py3K 中,这两个异常自然地由解释器报告为一个发生在处理另一个异常时。这是继续处理回滚失��处理的一系列更改的一部分,上次在 1.0.12 中作为#2696的一部分访问的。
此更改也回溯到:1.1.7
参考:#3946 - [引擎] [错误]
修复了一个 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.empty_in_strategy参数来启用create_engine()中的旧行为。
另请参阅
IN / NOT IN 操作符的空集合行为现在是可配置的;默认表达式已简化
参考:#3907 - [sql] [feature]
为“startswith”和“endswith”比较器类添加了一个新选项autoescape;这将提供一个转义���符,并自动将其应用于所有通配符字符“%”和“_”。感谢戴安娜·克拉克提供的拉取请求。
注意
该功能已于 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的机制,无条件地延迟“自动关闭”步骤,直到Connection完成对象的操作;在 PostgreSQL ON CONFLICT with RETURNING 返回零行的情况下,之前不存在的用例中发生了自动关闭,导致在 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-coercingNumeric数据类型,消除了在 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 的指定 paramstyle 进行;对于像 PostgreSQL 和 MySQL 驱动程序常见的百分号敏感 paramstyles,将会发生加倍,对于 SQLite 等其他驱动程序则不会。这使得更多数据库无关的使用literal_column构造成为可能。
另请参阅
在literal_column()中条件性转义百分号
参考:#3740 - [sql] [bug]
修复了一个 bug,其中列级CheckConstraint无法使用基础方言编译器编译 SQL 表达式,并且在 sqltext 是 Core 表达式而不仅仅是普通字符串的情况下应用正确的标志以生成内联字面值。长期以来,这在 0.9 中作为 #2742 的一部分已经修复了,这更常见地使用 Core SQL 表达式而不是普通字符串表达式的表级检查约束。
参考:#3957 - [sql] [bug]
修复了一个 bug,在“预执行”代码路径中,如果 SQL 本身是一个未分类的表达式(比如纯文本),则 SQL 导向的 Python 侧列默认值可能在 INSERT 时无法正确执行。然而,“预执行”代码路径相当不常见,但是在不使用 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] [错误]
继续修复正确处理 PostgreSQL 版本字符串“10devel”的问题,该问题在 1.1.8 中发布,另外增加了一个正则表达式来处理形式为“10beta1”的版本字符串。虽然 PostgreSQL 现在提供了更好的获取此信息的方法,但我们至少在 1.1.x 中仍然坚持使用正则表达式,以减少与旧版或替代 PostgreSQL 数据库的兼容性风险。
此更改也回溯到:1.1.11
参考:#4005 - [postgresql] [错误]
修复了在使用带有排序规则的字符串类型的ARRAY时,在 CREATE TABLE 中无法生成正确语法的错误。
此更改也回溯到:1.1.11
参考:#4006 - [postgresql] [错误]
为 GRANT、REVOKE 关键字添加了“autocommit”支持。感谢 Jacob Hayes 的拉取请求。
此更改也回溯到:1.1.10 - [postgresql] [错误]
增加了解析 PostgreSQL 版本字符串的支持,例如“PostgreSQL 10devel”这样的开发版本。感谢 Sean McCully 的拉取请求。
此更改也回溯到:1.1.8 - [postgresql] [错误]
修复了基本ARRAY数据类型不会调用ARRAY的绑定/结果处理器的错误。
参考:#3964 - [postgresql] [错误]
在反射 PostgreSQLINTERVAL数据类型时,增加了对所有可能的“字段”标识符的支持,例如“YEAR”、“MONTH”、“DAY TO MINUTE”等。此外,INTERVAL数据类型本身现在包括一个新参数INTERVAL.fields,可以在其中指定这些限定符;在反射/检查时,限定符也会反映到结果数据类型中。
另请参阅
INTERVAL 中字段规范的支持,包括完整反射
参考:#3959
mysql
- [mysql] [功能]
增加了对 MySQL 的 ON DUPLICATE KEY UPDATE MySQL 特定的Insert对象的支持。感谢 Michael Doronin 的拉取请求。
另请参阅
INSERT…ON DUPLICATE KEY UPDATE 的支持
参考:#4009 - [mysql] [错误]
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 事务隔离的错误,现在查询将尝试针对两个视图,如果失败继续提供最佳的抗未来任意 API 更改的弹性,将无条件引发 NotImplemented。
此更改也回溯到:1.1.11
参考:#3994 - [mssql] [bug]
向 SQL Server 方言添加了一个占位符类型XML,以便包含此类型的反射表可以重新渲染为 CREATE TABLE。该类型没有特殊的往返行为,也不支持额外的限定参数。
此更改也回溯到:1.1.11
参考:#3973 - [mssql] [bug]
SQL Server 方言现在允许在其中带有点的数据库和/或所有者名称,使用字符串中明确在所有者周围以及可选地在数据库名称周围的括号。此外,将quoted_name构造发送到模式名称将不会在点上拆分,并将提供完整字符串作为“所有者”。quoted_name现在也可以从sqlalchemy.sql导入空间中使用。
另请参阅
支持带有嵌入点的 SQL Server 模式名称
参考:#2626
oracle
- [oracle] [feature] [postgresql]
添加了新关键字Sequence.cache和Sequence.order到Sequence,以允许呈现 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 方言中的错误,其中版本字符串解析会由于“b”字符而在 cx_Oracle 版本 6.0b1 中失败。现在版本字符串解析是通过正则表达式而不是简单的拆分。
此更改还回溯到:1.1.10
参考:#3975 - [Oracle] [错误]
cx_Oracle 方言现在支持“合理的多行计数”,即当通过 DBAPIcursor.executemany()执行一系列参数集时,我们可以利用cursor.rowcount来验证匹配的行数。这在 ORM 中检测并发修改场景时有影响,因为现在即使 ORM 批处理语句,一些简单条件也可以被检测到,而且当使用更严格的版本控制功能时,ORM 仍然可以使用语句批处理。假定至少为版本 5.0,这个标志对 cx_Oracle 启用,这现在是很普遍的。
参考:#3932 - [Oracle] [错误]
Oracle 反射现在“规范化”了外键约束的名称,即对于大小写不敏感的名称,将其全部转换为小写。对于索引和主键约束以及所有表和列名称,这已经是行为。这将允许 Alembic 自动生成脚本在最初指定为大小写不敏感时正确比较和呈现外键约束名称。
另见
Oracle 外键约束名称现在是“名称规范化的”
参考:#3276
杂项
- [特性] [扩展]
添加了新标志Session.enable_baked_queries到Session以允许在会话范围内禁用烘焙查询,减少内存使用。还添加了新的Bakery包装器,以便通过BakedQuery.bakery返回的烘焙可以进行检查。 - [错误] [扩展]
在声明类被垃圾回收并且新的 automap prepare() 操作同时发生的情况下,保护不会将“None”作为类进行测试,非常少地在 gc 后没有完全处理 weakref,从而非常不频繁地命中。
此更改还回溯到:1.1.10
参考:#3980 - [错误] [扩展]
修复了sqlalchemy.ext.mutable中的一个错误,其中Mutable.as_mutable()方法不会跟踪使用TypeEngine.copy()复制的类型。这在 1.1 版本相对于 1.0 版本来说更像是一个回退,因为TypeDecorator类现在是SchemaEventTarget的子类之一,其中之一的功能是告诉父Column当Column被复制时,类型也应该被复制。在使用混入或抽象类的声明性时,这些副本很常见。
此更改也已回溯到:1.1.8
参考:#3950 - [bug] [ext]
对Result.count()方法添加了对绑定参数的支持,例如通常通过Query.params()设置的参数。先前,对参数的支持被省略了。感谢 Pat Deegan 提交的拉取请求。
此更改也已回溯到:1.1.8 - [bug] [ext]
AssociationProxy.any(),AssociationProxy.has()和AssociationProxy.contains()比较方法现在支持链接到一个属性,该属性本身也是AssociationProxy,递归地。
另请参阅
AssociationProxy any(),has(),contains()可与链式关联代理一起使用
参考:#3769 - [bug] [ext]
为MutableSet实现了就地突变运算符__ior__,__iand__,__ixor__和__isub__,以及为MutableList实现了__iadd__,这样当使用这些变异器方法来改变集合时就会触发变更事件。
另请参阅
就地突变运算符对 MutableSet,MutableList 起作用
参考:#3853 - [bug] [declarative]
如果在要映射的类上使用了declared_attr.cascading修饰符,而不是在声明的 mixin 类或__abstract__类上使用,则会发出警告。declared_attr.cascading修饰符目前仅适用于 mixin/abstract 类。
参考:#3847 - [bug] [ext]
改进了关联代理列表集合,以便在使用list.append()时防止对新创建的关联对象进行过早的自动刷新,并且在关联代理访问端点集合时将调用延迟加载。现在首先访问端点集合,然后再调用创建者以产生关联对象。
参考:#3941 - [bug] [ext]
sqlalchemy.ext.hybrid.hybrid_property类现在支持多次调用诸如@setter、@expression等 mutator,并且现在提供了一个@gettermutator,以便可以在子类或其他类中重新使用特定的混合属性。这现在与标准 Python 中的@property的行为相匹配。
另请参阅
混合属性支持在子类之间重用,重新定义 @getter
参考:#3911, #3912 - [bug] [ext]
修复了sqlalchemy.ext.serializer扩展中的一个 bug,该 bug 导致“已注释”的 SQL 元素(由 ORM 为许多类型的 SQL 表达式生成)无法可靠地序列化。还将序列化器的默认 pickle 级别提升为“HIGHEST_PROTOCOL”。
参考:#3918
orm
- [orm] [功能]
aliased()构造现在可以传递给Query.select_entity_from()方法。实体将从由aliased()构造表示的可选择项中提取。这允许与Query.select_entity_from()结合使用aliased()的特殊选项,例如aliased.adapt_on_names。
此更改也 回溯 到:1.1.7
参考:#3933 - [orm] [功能]
向scoped_session添加了.autocommit属性,代理当前分配给线程的底层Session的.autocommit属性。感谢 Ben Fagin 的 Pull 请求。 - [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 并收集结果时,会混淆连接的 eager loader,从而导致属性错误。现在,在别名对象被缓存和在线程之间共享之前,该集合现在会被提前生成。
此更改也已回溯到:1.1.7
参考文献:#3947 - [orm] [bug]
作为relationship.post_update功能的结果发出的 UPDATE 现在将与版本控制功能集成,既会提升行的版本号,也会断言现有版本号已匹配。
另见
post_update 与 ORM 版本控制集成
参考文献:#3496 - [orm] [bug]
修复了几个用例,涉及relationship.post_update功能与具有“onupdate”值的列结合使用时。当 UPDATE 发出时,相应的对象属性现在将被过期或刷新,以便新生成的“onupdate”值可以填充到对象中;以前,旧值将保留。此外,如果在对象的 INSERT 中设置了目标属性,则在 UPDATE 期间现在会重新发送该值,以便“onupdate”不会覆盖它(请注意,这对于服务器生成的 onupdates 也同样有效)。最后,在刷新期间刷新这些属性时,现在会触发SessionEvents.refresh_flush()事件。
另见
与 onupdate 结合使用的 post_update 的细化
参考文献:#3471,#3472 - [orm] [bug]
修复了一个 bug,在程序化版本 _id 计数器与联合表继承结合使用时,如果版本 _id 计数器实际上未递增且未修改基表上的任何其他值,则会失败,因为 UPDATE 将具有一个空的 SET 子句。由于程序化版本 _id 的版本计数器未递增是一个记录的用例,因此现在会检测到此特定条件,并且 UPDATE 现在将版本 _id 值设置为自身,以便仍然进行并发检查。
参考文献:#3996 - [orm] [bug]
版本功能不支持版本计数器为 NULL。如果版本 id 是程序化的,并且在 UPDATE 时设置为 NULL,则现在会引发异常。感谢 Diana Clarke 的 Pull 请求。
参考:#3673 - [orm] [bug]
从scoped_session中移除了一个非常古老的关键字参数scope。这个关键字从未被记录在文档中,是早期允许变量作用域的尝试。
参见
从 scoped_session 中移除“scope”关键字
参考:#3796 - [orm] [bug]
修复了一个 bug,即在与指定了 innerjoin=True 的 subclass-linked 关系一起组合“with_polymorphic”加载时,会失败将这些“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()同时标记为“deferred”时,在刷新期间会被标记为“expired”,导致它与常规属性一起加载,即使从未访问过该属性。
参考:#3984 - [orm] [bug]
修复了子查询急加载中的一个 bug,即对于自引用关系,“join_depth”参数不会被正确遵守,会加载所有可用的深度,而不是正确计算急加载的指定级别数。
参考:#3967 - [orm] [bug]
已向Mapper(最终也将用于其他基于 ORM 的 LRU 缓存)的 LRU“编译缓存”添加了警告,以便当缓存开始达到其大小限制时,应用程序会发出警告,指出这是一种可能需要关注的降低性能的情况。如果应用程序正在使用无限数量的Engine对象,则 LRU 缓存主要可以达到其大小限制,这是一种反模式。否则,这可能表明存在应该引起 SQLAlchemy 开发人员注意的问题。 - [orm] [bug]
修复了 bug,以改善对在延迟加载相关实体后生效的加载器选项的特异性,以便如果这些选项包括实体信息,则加载器选项将更具体地匹配到别名或非别名实体。
参考:#3963 - [orm] [bug]
函数flag_modified()现在如果对象中不存在指定的属性键,则会引发InvalidRequestError异常,因为在刷新过程中假定该键已存在。要在不引用任何特定属性的情况下标记对象为“脏”以进行刷新,可以使用函数flag_dirty()。
请参见
使用 flag_dirty()将对象标记为“脏”而不更改任何属性
参考:#3753 - [orm] [bug]
由Query.update()和Query.delete()使用的“评估”策略现在可以容纳从多对一关系到实例的简单对象比较,当主键/外键列的属性名称与列的实际名称不匹配时。以前,这将进行简单的基于名称的匹配,并在 AttributeError 时失败。
参考:#3366 - [orm] [bug]
@validates装饰器现在允许装饰的方法接收来自“批量集合设置”操作的对象,这些对象尚未与现有集合进行比较。这允许将传入的值转换为兼容的 ORM 对象,就像从“追加”事件中已经允许的那样。请注意,这意味着在集合分配期间,将调用所有值的@validates方法,而不仅仅是新的值。
请参见
在比较之前,@validates 方法会在批量集合设置时接收所有值
参考:#3896 - [orm] [bug]
修复了单表继承中的 bug,当限制行到子类时,select_from()参数将不会被考虑。以前,只有请求的列中的表达式会被考虑。
请参阅
修复了与 select_from() 一起使用的单表继承问题
参考:#3891 - [orm] [bug]
当将集合分配给由关系映射的属性时,以前的集合不再发生变化。以前,旧集合会随着“项删除”事件的触发而清空;现在事件会在不影响旧集合的情况下触发。
请参阅
替换时以前的集合不再发生变化
参考:#3913 - [orm] [bug]
当Session的状态在发出SessionEvents.after_rollback()事件时现在存在,也就是说,在对象过期之前的属性状态。这与发出SessionEvents.after_commit()事件的行为一致,该事件也会在对象的属性状态过期之前发出。
请参阅
在对象过期之前,after_rollback()会话事件现在会发出
参考:#3934 - [orm] [bug]
修复了Query.with_parent()在Query针对aliased()构造而不是常规映射类时无法工作的 bug。还为独立的with_parent()函数以及Query.with_parent()添加了一个新参数with_parent.from_entity。
参考:#3607
orm 声明
- [orm] [declarative] [bug]
修复了一个 bug,在AbstractConcreteBase上使用declared_attr,其中特定的返回值是一些非映射符号,包括None,会导致属性只会硬评估一次并将值存储到对象字典中,不允许它为子类调用。当declared_attr在一个映射类上时,这种行为是正常的,在混合类或抽象类上不会发生。由于AbstractConcreteBase既是“抽象的”又实际上是“映射的”,所以这里特殊地做了一个异常情况,以便“抽象”的行为优先于declared_attr。
参考:#3848
引擎
- [引擎] [功能]
向Pool对象添加了本机“悲观断开连接”处理。新参数Pool.pre_ping,可从引擎中作为create_engine.pool_pre_ping获得,应用了在连接池文档中特色的“预先 ping”配方的有效形式,每次连接检出时,都会发出一个简单的语句,通常是“SELECT 1”,以测试连接的活动性。如果现有连接不再能够响应命令,则连接将被透明地回收,并且在当前时间戳之前进行的所有其他连接都将被作废。
另请参阅
断开连接处理 - 悲观
对连接池添加了悲观断开连接检测
参考:#3919 - [引擎] [bug]
添加了一个异常处理程序,当Connection的“autorollback”功能本身引发异常时,将会警告“原因”异常。在 Py3K 中,两个异常自然由解释器报告为一个在处理另一个时发生。这是继续上次在 1.0.12 中访问的回滚失败处理的系列更改的一部分。
此更改也回溯到:1.1.7
参考:#3946 - [引擎] [bug]
修复了一个 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 在这方面的大量努力。
另请参阅
支持在表、列上添加 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;这提供了一个转义字符,同时自动应用于所有通配符字符“%”和“_”的所有出现。感谢戴安娜·克拉克的拉取请求。
注意
该功能已从其在 1.2.0b2 中的初始实现中更改为 1.2.0,使得 autoescape 现在作为布尔值传递,而不是作为要用作转义字符的特定字符。
参见
新的“autoescape”选项用于 startswith(),endswith()
参考:#2694 - [sql] [bug]
修复了在WithinGroup结构迭代期间可能发生的 AttributeError。
此更改也被回溯到:1.1.11
参考:#4012 - [sql] [bug]
由于#3859导致的 1.1.5 中发布的回归已修复,根据Variant对表达式的“右侧”评估进行调整,以遵守底层类型的“右侧”规则,导致Variant类型在那些我们确实希望左侧类型直接传递到右侧以便将绑定级规则应用于表达式参数的情况下不当地丢失。
此更改也被回溯到:1.1.9
参考:#3952 - [sql] [bug] [postgresql]
改变了ResultProxy的机制,无条件地推迟“autoclose”步骤,直到Connection完成对象处理;在 PostgreSQL ON CONFLICT with RETURNING 返回零行的情况下,以前不存在的使用情况中,会发生自动关闭,导致在以前不存在的情况下进行的 INSERT/UPDATE/DELETE 操作的通常自动提交行为失败。
此更改也回溯到:1.1.9
参考:#3955 - [sql] [bug]
现在关于Numeric、Integer和与日期相关的类型之间的类型强制转换规则现在包括额外的逻辑,该逻辑将尝试保留“resolved”类型的传入类型的设置。当前,这个目标是asdecimal标志,因此,Numeric或Float与Integer之间的数学运算将保留asdecimal标志以及类型是否应该是Float子类。
另见
强化了“浮点数”数据类型的类型强度
参考:#4018 - [sql] [bug] [mysql]
现在,Float类型的结果处理器现在无条件地通过float()处理器运行值,如果方言还支持“本地十进制”模式的话。虽然大多数后端会为浮点数据类型提供 Pythonfloat对象,但是 MySQL 后端在某些情况下缺少类型信息以提供此类信息,并且除非进行浮点转换,否则返回Decimal。
另见
强化了“浮点数”数据类型的类型强度
参考:#4020 - [sql] [bug]
对传递给 SQL 语句的 Python“浮点数”值的处理增加了一些额外的严格性。一个“浮点数”值将与Float数据类型关联,而不是以前的 Decimal-coercingNumeric数据类型,这消除了 SQLite 上发出的令人困惑的警告以及不必要的转换为 Decimal 的情况。
另见
强化了“浮点数”数据类型的类型强度
参考:#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 的声明的 paramstyle 进行;对于像 PostgreSQL 和 MySQL 驱动程序常见的百分号敏感 paramstyles,将会发生加倍,对于 SQLite 等其他驱动程序则不会。这使得更多与数据库无关的使用literal_column构造成为可能。
另请参阅
在 literal_column()中的百分号现在有条件地转义
参考:#3740 - [sql] [bug]
修复了一个 bug,在列级CheckConstraint中,如果 sqltext 是一个 Core 表达式而不仅仅是一个普通字符串,将无法使用底层方言编译器编译 SQL 表达式并应用适当的标志以生成内联的字面值。这在 0.9 版本中已经很久以前修复了表级别的检查约束,作为#2742的一部分,更常见的是使用 Core SQL 表达式而不是普通字符串表达式。
参考:#3957 - [SQL] [错误]
修复了一个 bug,在“预执行”代码路径中,如果 SQL 本身是一个未分类的表达式,比如纯文本,那么 SQL 导向的 Python 端列默认值可能在 INSERT 时无法正确执行。然而,“预执行”代码路径相当罕见,但在不使用 RETURNING 时,可以应用于具有 SQL 默认值的非整数主键列。
参考:#3923 - [SQL] [错误]
由列级collate()和ColumnOperators.collate()呈现的用于 COLLATE 的表达式现在在名称区分大小写时被引用为标识符,例如包含大写字符。请注意,这不会影响类型级别的排序,因为它已经被引用。
另请参见
列级别的 COLLATE 关键字现在引用排序名称
参考:#3785 - [SQL] [错误]
修复了一个 bug,在列上下文中使用Alias对象会在尝试将自身分组到括号表达式中时引发参数错误。目前还不是完全支持的 API,但这种方式的使用适用于一些最终用户的示例,并且可能在支持一些未来的 PostgreSQL 功能时发挥更重要的作用。
参考:#3939
模式
- [模式] [错误]
如果使用不匹配的“本地”和“远程”列创建了一个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 事务隔离的错误,现在尝试针对两个视图执行查询,如果失败继续提供对未来新 SQL Server 版本中任意 API 更改的最佳弹性,则无条件引发 NotImplemented。
此更改也被回溯到:1.1.11
参考:#3994 - [mssql] [bug]
在 SQL Server 方言中添加了一个占位符类型XML,以便包含此类型的反射表可以重新呈现为 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 方言中的错误,版本字符串解析会因为 cx_Oracle 版本 6.0b1 中的“b”字符而失败。现在版本字符串解析使用正则表达式而不是简单的分割。
此更改也被回溯到:1.1.10
参考文献:#3975 - [oracle] [错误]
cx_Oracle 方言现在支持“合理的多行计数”,即,当通过 DBAPIcursor.executemany()执行一系列参数集时,我们可以利用cursor.rowcount来验证匹配的行数。这在 ORM 中对于检测并发修改方案有影响,因为在批处理语句时,一些简单的条件现在可以被检测到,同时当使用更严格的版本功能时,ORM 仍然可以使用语句批处理。假设至少版本 5.0,现在 cx_Oracle 默认启用该标志,这已经是司空见惯的了。
参考文献:#3932 - [oracle] [错误]
Oracle 反射现在“规范化”了给定的外键约束名称,即,对于大小写不敏感的名称,将其返回为全部小写。这已经是索引和主键约束以及所有表和列名称的行为了。这将允许 Alembic 自动生成的脚本在最初指定为大小写不敏感时正确比较和渲染外键约束名称。
请参见
Oracle 外键约束名称现在已“规范化”
参考文献:#3276
杂项
- [特性] [扩展]
添加了新标志Session.enable_baked_queries到Session中,以允许全局禁用烘焙查询,减少内存使用。还添加了新的Bakery包装器,以便可以检查由BakedQuery.bakery返回的烘焙器。 - [错误] [扩展]
在声明性类被垃圾收集并且新的 automap prepare() 操作同时进行的情况下,防止测试“None”作为一个类,非常不经常地命中一个在垃圾回收后尚未完全处理的 weakref。
此更改也被回溯到:1.1.10
参考文献:#3980 - [错误] [扩展]
修复了sqlalchemy.ext.mutable中的错误,在使用TypeEngine.copy()复制类型时,Mutable.as_mutable()方法不会跟踪已复制的类型。在 1.1 中相比于 1.0,这变得更加退化,因为TypeDecorator类现在是SchemaEventTarget的子类,其中之一是当Column被复制时指示类型也应该被复制的内容。在使用混合或抽象类与声明式一起使用时,这些副本很常见。
此更改也已回溯至:1.1.8
参考:#3950 - [错误] [扩展]
添加了对绑定参数的支持,例如通常通过Query.params()设置的参数,到Result.count()方法中。先前,参数的支持被省略了。感谢 Pat Deegan 提供的拉取请求。
此更改也已回溯至:1.1.8 - [错误] [扩展]
AssociationProxy.any()、AssociationProxy.has()和AssociationProxy.contains()比较方法现在支持链接到本身也是AssociationProxy的属性,递归地。
另请参阅AssociationProxy.any()、has()、contains()与链接的关联代理一起工作
参考:#3769 - [错误] [扩展]
对于MutableSet实施就地变异运算符__ior__、__iand__、__ixor__和__isub__,以及对MutableList实施__iadd__,以便在使用这些变异器方法修改集合时触发更改事件。
另请参阅
就地变异运算符对 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等的变异器,以及现在提供了一个@getter变异器,这样一个特定的混合属性可以在子类或其他类之间重新使用。这现在与标准 Python 中@property的行为相匹配。
另请参见
混合属性支持在子类之间重用,重新定义@getter
参考:#3911,#3912 - [bug] [ext]
修复了sqlalchemy.ext.serializer扩展中的一个 bug,即“注释”SQL 元素(由 ORM 为许多类型的 SQL 表达式生成)无法可靠地序列化。还将序列化器的默认 pickle 级别提升为“HIGHEST_PROTOCOL”。
参考:#3918