SqlAlchemy 2.0 中文文档(六十九)(3)https://developer.aliyun.com/article/1560785
0.4.2
发布日期:Wed Jan 02 2008
ORM
- [ORM]
针对基于集合的反向引用的重大行为更改:它们不再触发延迟加载!“reverse”添加和删除被排队并在实际从中读取和加载集合时与集合合并;但不会事先触发加载。对于注意到这种行为的用户,在某些情况下,这应该比在某些情况下使用动态关系更方便;对于那些没有注意到的用户,您可能会注意到您的应用程序在某些情况下使用的查询比以前少得多。
参考:#871 - [orm]
可变主键支持已添加。主键列可以自由更改,并且在刷新时实例的标识将发生变化。此外,支持沿关系更新外键引用(主键或非主键),可以与数据库的 ON UPDATE CASCADE(对于像 Postgres 这样的数据库是必需的)一起使用,或者通过设置标志“passive_cascades=False”直接由 ORM 以 UPDATE 语句的形式发出。 - [orm]
继承映射器现在直接继承其父映射器的 MapperExtensions,以便为子类调用特定 MapperExtension 的所有方法。与往常一样,任何 MapperExtension 都可以返回 EXT_CONTINUE 以继续扩展处理或 EXT_STOP 以停止处理。映射器解析的顺序是:<在类的映射器上声明的扩展> <在类的父映射器上声明的扩展> <全局声明的扩展>。
请注意,如果您单独实例化相同的扩展类,然后分别将其应用于同一继承链中的两个映射器,该扩展将应用于继承类两次,并且每个方法将被调用两次。
要将映射扩展明确应用于每个继承类,但每个方法每次操作只调用一次,请为两个映射器使用相同的扩展实例。
参考:#490 - [orm]
现在对 MapperExtension.before_update()和 after_update()进行对称调用;以前,一个没有修改列属性(但有关系()修改)的实例可能会调用 before_update()但不会调用 after_update()
参考:#907 - [orm]
查询语句中缺少的列现在在加载时会自动延迟加载。 - [orm]
扩展“object”并且在实例构造时没有提供 init()方法的映射类现在将在实例构造时引发 TypeError,如果非空*args 或**kwargs 在实例构造时存在(并且未被任何扩展(如 scoped_session mapper)消耗),与普通 Python 类的行为一致
参考:#908 - [orm]
修复了当 filter_by()将关系与 None 进行比较时的查询错误
参考:#899 - [orm]
改进了对映射实体的 pickling 支持。现在每个实例的 lazy/deferred/expired 可调用对象都是可序列化的,因此它们与 _state 一起序列化和反序列化。 - [orm]
新的 synonym() 行为:如果类上不存在属性,则会在映射类上放置一个属性。如果类上已经存在属性,则 synonym 将使用适当的比较运算符修饰该属性,以便可以像任何其他映射属性一样在列表达式中使用(即可用于 filter() 等)。“proxy=True”标志已被弃用并且不再起作用。“map_column=True”标志将自动生成与同义词名称对应的 ColumnProperty,例如:‘somename’:synonym(‘_somename’, map_column=True) 将列名为 ‘somename’ 的列映射到属性 ‘_somename’。请参阅映射器文档中的示例。
参考:#801 - [orm]
Query.select_from() 现在将给定参数替换所有现有的 FROM 条件;以前的行为构造一个 FROM 子句列表通常是没有用的,因为需要 filter() 调用来创建连接条件,并且在 filter() 中引入的新表已经将自己添加到 FROM 子句中。新行为不仅允许从主表进行连接,还允许选择语句。过滤条件、排序条件、急加载条件将与给定语句“别名”对齐。 - [orm]
本月的属性检测重构改变了自 0.3 中期以来我们一直拥有的“加载时复制”行为,大多数情况下将其改为“修改时复制”。这减少了加载操作的大量延迟,并且总体上做更少的工作,因为只有实际上被修改的属性才会复制其“已提交状态”。只有“可变标量”属性(即 pickled 对象或其他可变项)保留了旧的行为。 - [orm] [attrname]
对属性进行 del 操作不会再次触发该属性的 lazyloader;“del”操作使属性的有效值为“None”。要重新触发属性的“loader”,请使用 session.expire(instance,)。 - [orm]
当将 many-to-one 属性与 None 进行比较时,query.filter(SomeClass.somechild == None) 将正确生成“id IS NULL”,包括 NULL 位于右侧的情况。 - [orm]
query.order_by() 考虑了别名连接,即 query.join(‘orders’, aliased=True).order_by(Order.id) - [orm]
eagerload()、lazyload()、eagerload_all() 接受可选的第二个类或映射器参数,该参数将选择要应用选项的映射器。这可以选择其他使用 add_entity() 添加的映射器之一。 - [orm]
eagerloading 会与通过 add_entity() 添加的映射器一起工作。 - [orm]
为“动态”关系添加了“级联删除”行为,就像常规关系一样。如果未设置passive_deletes
标志(也刚刚添加),则删除父项将触发对子项的完整加载,以便可以相应地删除或更新它们。 - [orm]
也使用动态,实现了正确的count()
行为以及其他辅助方法。 - [orm]
修复了多态关系上的级联,使得从对象到多态集合的级联继续沿着集合中每个元素特定的属性集进行级联。 - [orm]
query.get()
和query.load()
不考虑现有的过滤器或其他条件;这些方法始终在数据库中查找给定的 id 或从标识映射中返回当前实例,而忽略已配置的任何现有过滤器、连接、group_by 或其他条件。
参考:#893 - [orm]
在继承映射器中添加了对version_id_col
的支持。version_id_col
通常在继承关系的基本映射器上设置,在这种关系中,它对所有继承的映射器都生效。
参考:#883 - [orm]
放宽了对column_property()
表达式标签的规则;现在任何ColumnElement
都被接受了,因为编译器现在会自动给没有标签的ColumnElements
加上标签。一个可选择的,像select()
语句一样,仍然需要通过as_scalar()
或label()
转换为ColumnElement
。 - [orm]
修复了反向引用错误,如果attr
为None
,则无法删除instance.attr
。 - [orm]
删除或私有化了几个 ORM 属性:mapper.get_attr_by_column()
、mapper.set_attr_by_column()
、mapper.pks_by_table
、mapper.cascade_callable()
、MapperProperty.cascade_callable()
、mapper.canload()
、mapper.save_obj()
、mapper.delete_obj()
、mapper._mapper_registry
、attributes.AttributeManager
- [orm]
将不兼容的集合类型分配给关系属性现在会引发 TypeError 而不是 sqlalchemy 的 ArgumentError。 - [orm]
如果传入字典中的键与集合的keyfunc
为该值使用的键不匹配,则对 MappedCollection 进行的批量赋值将引发错误。
参考:#886 - [orm] [newval1] [newval2]
现在自定义集合可以指定一个@converter
方法,将“批量”赋值中使用的对象转换为一系列值,例如:
obj.col = # or obj.dictcol = {'foo': newval1, 'bar': newval2} • 1 • 2 • 3
- MappedCollection 使用此钩子确保从集合的角度来看传入的键/值对是合理的。
- [orm]
在双向关系的两端同时使用lazy="dynamic"
时修复了无限循环问题。
参考:#872 - [orm]
在 Query + eagerloads 中应用 LIMIT/OFFSET 别名时修复了更多问题,例如当与 select 语句进行映射时。
参考:#904 - [orm]
修复了自引用的急加载问题,即使在同一结果集中的两个或更多不同列集中出现相同映射的实例,其急加载集合也将被填充,无论所有行是否包含该集合的“急加载”列集。当打开 join_depth 时,这也会显示为 KeyError。 - [orm]
修复了在使用 LIMIT 与仅在父映射器中存在急加载器的继承映射器时,Query 不会将子查询应用于 SQL 的 bug。 - [orm]
澄清了当尝试使用相同标识键更新()已经存在于会话中的实例时发生的错误消息。 - [orm]
对 merge(instance, dont_load=True)进行了一些澄清和修复。修复了在返回的实例上禁用延迟加载器的 bug。此外,我们目前不支持在实例上有未提交更改时使用 dont_load=True 的合并实例的情况…这将引发错误。这是因为合并给定实例的“已提交状态”以正确对应新复制的实例以及其他修改状态的复杂性。由于 dont_load=True 的用例是缓存,给定实例不应该有任何未提交更改。我们现在也不使用任何事件复制实例,以便新会话上的“脏”列表保持不受影响。 - [orm]
修复了在使用 session.begin_nested()与多于一级的封闭 session.begin()语句时可能出现的 bug - [orm]
修复了使用具有自定义实体名称的实例进行 session.refresh()时的问题
参考:#914
sql
- [sql]
通用函数!我们引入了一个已知 SQL 函数的数据库,例如 current_timestamp、coalesce,并创建了表示它们的显式函数对象。这些对象具有受限制的参数列表,具有类型意识,并且可以以特定于方言的方式编译。因此,说 func.char_length(“foo”, “bar”)会引发错误(参数太多),func.coalesce(datetime.date(2007, 10, 5), datetime.date(2005, 10, 15))知道其返回类型是 Date。到目前为止,我们只表示了一些函数,但将继续添加到系统中
参考:#615 - [sql]
改进了自动重新连接支持;现在,Connection 在其基础连接失效后可以自动重新连接,而不需要再次从 engine 连接。这使得绑定到单个 Connection 的 ORM 会话不需要重新连接。在基础连接失效后,Connection 上的未完成事务必须回滚,否则会引发错误。还修复了在 cursor()、rollback()或 commit()中未调用 disconnect detect 的 bug。 - [sql]
为 String 和 create_engine()添加了新标志,assert_unicode=(True|False|’warn’|None)。在 create_engine()和 String 上默认为 False 或 None,Unicode 类型上为‘warn’。当为 True 时,所有 Unicode 转换操作在传递非 Unicode 字节字符串作为绑定参数时会引发异常。‘warn’会产生警告。强烈建议所有支持 Unicode 的应用程序正确使用 Python Unicode 对象(即 u’hello’而不是‘hello’),以便数据往返准确。 - [sql]
“unique”绑定参数的生成已简化为使用与其他所有内容相同的“唯一标识符”机制。这不会影响用户代码,除非可能已经针对生成的名称硬编码的任何代码。生成的绑定参数现在具有“_”的形式,而以前只有相同名称的第二个绑定会具有这种形式。 - [sql]
select().as_scalar()如果 select 在其 columns 子句中没有确切一个表达式,则会引发异常。 - [sql]
bindparam()对象本身可以用作 execute()的键,即 statement.execute({bind1:’foo’, bind2:’bar’}) - [sql]
添加了 TypeDecorator 的新方法,process_bind_param()和 process_result_value(),它们自动利用底层类型的处理。非常适合与 Unicode 或 PickleType 一起使用。TypeDecorator 现在应该是增强任何现有类型行为的主要方式,包括其他 TypeDecorator 子类,如 PickleType。 - [sql]
selectables(和其他对象)在其导出的列集合中基于名称冲突的两列时将发出警告。 - [sql]
具有模式的表仍然可以在 sqlite、firebird 中使用,模式名称只是被删除
参考:#890 - [sql]
更改各种“literal”生成函数以使用匿名绑定参数。这里没有太多变化,只是它们的标签现在看起来像“:param_1”,“:param_2”,而不是“:literal” - [sql]
现在支持形式为“tablename.columname”的列标签,即带有点的形式。 - [sql]
select()的 from_obj 关键字参数可以是标量或列表。
杂项
- [dialects]
sqlite SLDate 类型不会错误地呈现日期时间或时间对象的“微秒”部分。 - [dialects]oracle
- 添加了对 Oracle 的断开连接检测支持
- 对二进制/原始类型进行了一些清理,以便在特定情况下检测到 cx_oracle.LOB
- 参考:#902
- [dialects]MSSQL
- PyODBC 不再具有全局“set nocount on”。
- 修复自动加载时非标识整数主键
- 更好地支持 convert_unicode
- 对于 pyodbc/adodbapi 的日期转换不那么严格
- 模式限定的表/自动加载
- 参考:#824, #839, #842, #901
- [backend] [firebird]
正确反映域(部分修复)和 PassiveDefaults
参考:#410 - [3562] [backend] [firebird]
回退到使用默认的 poolclass(在 0.4.0 中设置为 SingletonThreadPool 用于测试目的) - [backend] [firebird]
将 func.length() 映射到 ‘char_length’(在旧版本的 Firebird 上可以轻松通过 UDF ‘strlen’ 进行覆盖)
orm
- [orm]
针对基于集合的反向引用的重大行为更改:它们不再触发延迟加载!“reverse” 添加和删除被排队并在实际读取和加载集合时与集合合并;但不会事先触发加载。对于注意到这种行为的用户,在某些情况下,这应该比在某些情况下使用动态关系更方便;对于那些没有注意到的用户,您可能会注意到您的应用程序在某些情况下使用的查询比以前少得多。
参考:#871 - [orm]
添加了可变主键支持。主键列可以自由更改,并且在刷新时实例的标识将会改变。此外,支持沿关系更新外键引用(主键或非主键),可以与数据库的 ON UPDATE CASCADE(对于像 Postgres 这样的数据库是必需的)一起使用,或者直接由 ORM 以 UPDATE 语句的形式发出,通过设置标志“passive_cascades=False”。 - [orm]
继承的映射器现在直接继承其父映射器的 MapperExtensions,因此特定 MapperExtension 的所有方法也将为子类调用。与往常一样,任何 MapperExtension 都可以返回 EXT_CONTINUE 继续扩展处理或 EXT_STOP 停止处理。映射器解析的顺序是:<在类的映射器上声明的扩展> <在类的父映射器上声明的扩展> <全局声明的扩展>。
请注意,如果您单独实例化相同的扩展类,然后分别将其应用于同一继承链中的两个映射器,那么该扩展将应用两次于继承类,并且每个方法将被调用两次。
要将映射器扩展显式应用于每个继承类,但每个方法每次操作只调用一次,请为两个映射器使用相同的扩展实例。
参考:#490 - [orm]
MapperExtension.before_update() 和 after_update() 现在被对称调用;以前,一个实例如果没有修改的列属性(但有关系() 修改)可能会在 before_update() 被调用但不会在 after_update() 被调用。
参考:#907 - [orm]
查询语句中缺失的列现在在加载时会自动延迟加载。 - [orm]
扩展“object”并且在实例构造时没有提供 init() 方法的映射类现在会在实例构造时引发 TypeError,如果非空的 *args 或 **kwargs 在实例构造���存在(并且没有被任何扩展(如 scoped_session 映射器)消耗),与普通 Python 类的行为一致。
参考:#908 - [orm]
修复了 Query 在 filter_by() 将关系与 None 进行比较时的 bug
参考:#899 - [orm]
改进了对映射实体的 pickling 支持。每个实例的延迟/延迟/过期可调用现在是可序列化的,因此它们与 _state 一起序列化和反序列化。 - [orm]
新的 synonym() 行为:如果映射类上不存在属性,则属性将放置在映射类上。如果类上已经存在属性,则 synonym 将使用适当的比较运算符装饰属性,以便它可以像任何其他映射属性一样在列表达式中使用(即可用于 filter() 等)。“proxy=True”标志已被弃用,不再起作用。此外,“map_column=True”标志将自动生成与同义词名称对应的 ColumnProperty,例如:‘somename’:synonym(‘_somename’, map_column=True) 将将名为‘somename’的列映射到属性‘_somename’。请参阅映射器文档中的示例。
参考:#801 - [orm]
Query.select_from() 现在用给定的参数替换所有现有的 FROM 条件;以前构造 FROM 子句列表的行为通常不实用,因为需要 filter() 调用来创建连接条件,并且在 filter() 中引入的新表已经添加到 FROM 子句中。新行为不仅允许从主表进行连接,还允许选择语句。过滤条件、排序和急加载子句将“针对”给定语句进行别名处理。 - [orm]
本月对属性检测的重构改变了自 0.3 中期以来我们一直拥有的“加载时复制”行为,大多数情况下改为“修改时复制”。这减少了加载操作中的相当大的延迟,并且总体上做的工作更少,因为只有实际修改的属性才会复制其“已提交状态”。只有“可变标量”属性(即 pickled 对象或其他可变项),即第一次更改加载时的复制行为的原因,保留了旧行为。 - [orm] [attrname]
对属性进行轻微的行为更改,删除属性不会再次触发该属性的延迟加载器;“del”使属性的有效值为“None”。要重新触发属性的“加载器”,请使用 session.expire(instance,)。 - [orm]
query.filter(SomeClass.somechild == None),当将一个多对一属性与 None 进行比较时,会正确生成“id IS NULL”,包括 NULL 在右侧的情况。 - [orm]
query.order_by() 考虑到别名连接,即 query.join(‘orders’, aliased=True).order_by(Order.id) - [orm]
eagerload()、lazyload()、eagerload_all() 接受可选的第二个类或映射器参数,这将选择要应用选项的映射器。这可以选择使用 add_entity() 添加的其他映射器之一。 - [orm]
eagerloading 将与通过 add_entity() 添加的映射器一起工作。 - [orm]
就像普通关系一样,对“动态”关系增加了“级联删除”行为。如果未设置 passive_deletes 标志(刚刚添加),则删除父项目将触发对子项目的完整加载,以便可以相应地删除或更新它们。 - [orm]
同样对动态实现了正确的 count() 行为以及其他辅助方法。 - [orm]
修复了关于多态关系的级联错误,使得从对象到多态集合的级联继续沿着集合中每个元素特定的属性集合进行级联。 - [orm]
query.get() 和 query.load() 不考虑现有的过滤器或其他条件;这些方法总是在数据库中查找给定的 id 或从标识映射中返回当前实例,而不考虑任何已配置的现有过滤器、连接、group_by 或其他条件。
引用:#893 - [orm]
在继承映射器的情况下增加了对 version_id_col 的支持。version_id_col 通常在继承关系中设置在基映射器上,它对所有继承映射器生效。
引用:#883 - [orm]
放宽了 column_property() 表达式的标签规则;现在接受任何 ColumnElement,因为编译器现在自动为非标记的 ColumnElement 添加标签。可选择的,比如 select() 语句,仍然需要通过 as_scalar() 或 label() 转换为 ColumnElement。 - [orm]
修复了 backref bug,如果 attr 为 None,则无法删除 instance.attr。 - [orm]
几个 ORM 属性已被删除或设置为私有:mapper.get_attr_by_column()、mapper.set_attr_by_column()、mapper.pks_by_table、mapper.cascade_callable()、MapperProperty.cascade_callable()、mapper.canload()、mapper.save_obj()、mapper.delete_obj()、mapper._mapper_registry、attributes.AttributeManager - [orm]
将不兼容的集合类型分配给关系属性现在会引发 TypeError 而不是 SQLAlchemy 的 ArgumentError。 - [orm]
如果传入字典中的键与集合的 keyfunc 为该值使用的键不匹配,则 MappedCollection 的批量赋值现在会引发错误。
引用:#886 - [orm] [newval1] [newval2]
自定义集合现在可以指定一个 @converter 方法来将用于“批量”赋值的对象转换为值流,如下所示:
obj.col = # or obj.dictcol = {'foo': newval1, 'bar': newval2}
- MappedCollection 使用此钩子来确保传入的键值对从集合的角度看是合理的。
- [orm]
修复了在双向关系的两侧都使用 lazy=”dynamic”时出现无限循环问题
参考:#872 - [orm]
在 Query + 急加载中应用 LIMIT/OFFSET 别名的更多修复,特别是在与 select 语句映射时
参考:#904 - [orm]
修复了自引用急加载的问题,即使同一映射实例出现在同一结果集中的两个或更多不同列集中,其急加载的集合也将被填充,无论所有行是否包含该集合的“急加载”列集。当打开 join_depth 时,这也会显示为 KeyError。 - [orm]
修复了在使用继承映射器时,当在父映射器中仅存在急加载器时,Query 在使用 LIMIT 与子查询时不会将子查询应用于 SQL 的错误。 - [orm]
澄清了当尝试使用相同标识键更新具有与会话中已存在实例相同标识键的实例时发生的错误消息。 - [orm]
对 merge(instance, dont_load=True)进行了一些澄清和修复。修复了在返回的实例上禁用延迟加载器的错误。此外,我们目前不支持在实例上有未提交更改时使用 dont_load=True 进行合并….这将引发错误。这是由于将给定实例的“已提交状态”正确合并到新复制的实例以正确对应其他修改状态的复杂性。由于 dont_load=True 的用例是缓存,因此给定实例不应该有任何未提交的更改。我们现在也在不使用任何事件的情况下复制实例,以使新会话上的“脏”列表保持不受影响。 - [orm]
修复了在使用 session.begin_nested()与多层嵌套 session.begin()语句时可能出现的错误 - [orm]
修复了具有自定义 entity_name 的实例使用 session.refresh()时的无限循环问题
参考:#914
sql
- [sql]
通用函数!我们引入了一个已知 SQL 函数的数据库,例如 current_timestamp,coalesce,并创建了表示它们的显式函数对象。这些对象具有受限制的参数列表,具有类型意识,并且可以以特定于方言的方式编译。因此,说 func.char_length(“foo”, “bar”)会引发错误(参数太多),func.coalesce(datetime.date(2007, 10, 5), datetime.date(2005, 10, 15))知道其返回类型是 Date。到目前为止,我们只表示了一些函数,但将继续添加到系统中
参考:#615 - [sql]
自动重新连接支持得到改进;现在连接在其底层连接失效后可以自动重新连接,而不需要再次从引擎连接()。这使得绑定到单个连接的 ORM 会话不需要重新连接。在底层连接失效后,连接上的打开事务必须回滚,否则会引发错误。还修复了在 cursor()、rollback()或 commit()中未调用断开检测的错误。 - [sql]
为 String 和 create_engine()添加了新标志,assert_unicode=(True|False|’warn’|None)。在 create_engine()和 String 上默认为 False 或 None,Unicode 类型上为‘warn’。当为 True 时,当传递非 Unicode 字节字符串作为绑定参数时,所有 Unicode 转换操作都会引发异常。‘warn’会产生警告。强烈建议所有支持 Unicode 的应用程序正确使用 Python Unicode 对象(即 u’hello’而不是‘hello’),以便数据往返准确。 - [sql]
“唯一”绑定参数的生成已简化为使用与其他所有内容相同的“唯一标识符”机制。这不会影响用户代码,除非可能已经针对生成的名称进行了硬编码。生成的绑定参数现在的形式为“_”,而以前只有同名的第二个绑定才会有这种形式。 - [sql]
select().as_scalar()如果在其列子句中没有确切一个表达式,将会引发异常。 - [sql]
bindparam()对象本身可以用作 execute()的键,即 statement.execute({bind1:’foo’, bind2:’bar’}) - [sql]
添加了 TypeDecorator 的新方法 process_bind_param()和 process_result_value(),它们自动利用底层类型的处理。非常适合与 Unicode 或 PickleType 一起使用。TypeDecorator 现在应该是增强任何现有类型行为的主要方式,包括其他 TypeDecorator 子类,如 PickleType。 - [sql]
selectables(以及其他对象)在其导出列集合中基于名称冲突的两个列时会发出警告。 - [sql]
在 sqlite、firebird 中仍然可以使用具有模式的表,模式名称只会被删除
参考:#890 - [sql]
将各种“literal”生成函数更改为使用匿名绑定参数。这里没有太多变化,除了它们的标签现在看起来像“:param_1”,“:param_2”而不是“:literal” - [sql]
现在支持形式为“tablename.columname”的列标签,即带有点的形式。 - [sql]
select()的 from_obj 关键字参数可以是标量或列表。
misc
- [dialects]
sqlite SLDate 类型不会错误地呈现日期时间或时间对象的“微秒”部分。 - [dialects]oracle
- 为 Oracle 添加了断开检测支持
- 对二进制/原始类型进行了一些清理,以便在需要时检测 cx_oracle.LOB
- 参考:#902
- [dialects]MSSQL
- PyODBC 不再具有全局“set nocount on”。
- 修复 autoload 上的非标识整数 PKs
- 更好地支持 convert_unicode
- 对于 pyodbc/adodbapi 的日期转换不再那么严格
- 模式限定的表/自动加载
- 参考:#824, #839, #842, #901
- [backend] [firebird]
现在正确反映域(部分修复)和 PassiveDefaults
参考:#410 - [3562] [backend] [firebird]
恢复为使用默认的 poolclass(在 0.4.0 中设置为 SingletonThreadPool 仅用于测试目的) - [backend] [firebird]
将 func.length()映射到‘char_length’(在旧版本的 Firebird 上可以轻松覆盖为 UDF‘strlen’)
0.4.1
发布日期:Sun Nov 18 2007
orm
- [orm]
eager loading with LIMIT/OFFSET applied no longer adds the primary table joined to a limited subquery of itself; the eager loads now join directly to the subquery which also provides the primary table’s columns to the result set. This eliminates a JOIN from all eager loads with LIMIT/OFFSET.
参考:#843 - [orm]
session.refresh()和 session.expire()现在支持额外的参数“attribute_names”,一个包含要刷新或过期的单个属性键名列表,允许对已加载实例进行部分重新加载。
参考:#802 - [orm]
添加 op()操作符到 instrumented attributes;例如 User.name.op(‘ilike’)(‘%somename%’)
参考:#767 - [orm]
映射类现在可以定义具有任意语义的 eq、hash 和 nonzero 方法。orm 现在仅基于标识处理所有映射实例。(例如‘is’ vs ‘==’)
参考:#676 - [orm]
Mapper 上的“properties”访问器已被移除;现在会抛出一个信息性异常,解释 mapper.get_property()和 mapper.iterate_properties 的用法 - [orm]
添加 having()方法到 Query,将 HAVING 应用于生成的语句,方式与 filter()追加到 WHERE 子句相同。 - [orm]
现在,query.options()的行为完全基于路径,即诸如 eagerload_all(‘x.y.z.y.x’)这样的选项将仅应用于这些路径,即不包括‘x.y.x’;eagerload(‘children.children’)仅适用于确切的两级深度等。
参考:#777 - [orm]
当设置为 mutable=False 时,PickleType 将使用==进行比较,而不是 is 操作符。要使用 is 或任何其他比较器,请使用 PickleType(comparator=my_custom_comparator)发送自定义比较函数。 - [orm]
如果同时使用 distinct()和包含 UnaryExpressions(或其他)的 order_by(),查询不会引发错误
参考:#848 - [orm]
当使用 distinct()时,来自连接表的 order_by()表达式会被正确添加到列子句中
参考:#786 - [orm]
修复了 Query.add_column()不接受类绑定属性作为参数的错误;Query 在 add_column()(在 instances()时间)发送无效参数时也会引发错误
参考:#858 - [orm]
在 InstanceState.__cleanup()中增加了更多垃圾回收解除引用的检查,以减少应用程序关闭时的“gc ignored”错误 - [orm]
会话 API 已经稳定: - [orm]
对已经持久化的对象进行 session.save()会报错
参考:#840 - [orm]
对于非持久化的对象进行 session.delete()会报错。 - [orm]
当更新或删除已在会话中具有不同标识的实例时,session.update()和 session.delete()会引发错误。 - [orm]
在确定“对象 X 已经在另一个会话中”时,会话会更加仔细检查;例如,如果您 pickle 一系列对象并 unpickle(即在 Pylons HTTP 会话或类似情况下),它们可以进入新会话而不会发生冲突 - [orm]
merge()包括一个关键字参数“dont_load=True”。设置此标志将导致合并操作不从数据库中加载任何数据以响应传入的分离对象,并将接受传入的分离对象,就好像它已经存在于该会话中。使用此功能将外部缓存系统中的分离对象合并到会话中。 - [orm]
当将 Deferred 列属性分配给时,不再触发加载操作。在这些情况下,新分配的值将无条件地出现在 flushes 的 UPDATE 语句中。 - [orm]
重新分配集合的子集时修复了截断错误(obj.relation = obj.relation[1:])
参考:#834 - [orm]
精简了 backref 配置代码,覆盖现有属性的 backrefs 现在会引发错误
参考:#832 - [orm]
改进了 add_property()等的行为,修复了涉及 synonym/deferred 的问题。
参考:#831 - [orm]
修复了 clear_mappers()行为,以更好地清理自身之后。 - [orm]
修复了“行切换”行为,即当 INSERT/DELETE 合并为单个 UPDATE 时;父对象上的多对多关系会正确更新。
参考:#841 - [orm]
修复了关联代理的哈希值,这些集合是不可哈希的,就像它们的可变 Python 对应物一样。 - [orm]
为作用域会话添加了 save_or_update、contains 和 iter 方法的代理。 - [orm]
修复了一个非常难以重现的问题,即 Query 的 FROM 子句可能会被某些生成调用污染
参考:#852
sql
- [sql]
bindparam()上的“shortname”关键字参数已被弃用。 - [sql]
添加了包含运算符(生成一个“LIKE %%”子句)。 - [sql]
匿名列表达式会自动标记。例如,select([x* 5])会产生“SELECT x * 5 AS anon_1”。这允许标签名出现在 cursor.description 中,然后可以与结果列处理规则适当匹配(我们无法可靠地使用位置跟踪进行结果列匹配,因为 text()表达式可能代表多个列)。 - [sql]
运算符重载现在由 TypeEngine 对象控制 - 到目前为止内置的运算符重载是 String 类型重载‘+’成为字符串连接运算符。用户定义的类型也可以通过覆盖 adapt_operator(self, op)方法来定义自己的运算符重载。 - [sql]
二元表达式右侧的无类型绑定参数将被分配为操作左侧的类型,以更好地���用适当的绑定参数处理
参考:#819 - [sql]
从大多数语句编译中删除了正则表达式步骤。同时修复了
参考:#833 - [sql]
修复了空(零列)sqlite 插入,允许在自增单列表上插入。 - [sql]
修复了 text()子句的表达式翻译;这修复了各种 ORM 场景,其中使用文字文本作为 SQL 表达式 - [sql]
移除了 ClauseParameters 对象;现在 compiled.params 返回一个普通的字典,以及 result.last_inserted_params() / last_updated_params()。 - [sql]
修复了关于具有基于 SQL 表达式的默认生成器的主键列的 INSERT 语句;SQL 表达式像往常一样内联执行,但不会触发列的“postfetch”条件,对于那些通过 cursor.lastrowid 提供它的 DB - [sql]
func.对象可以被 pickle/unpickle
参考:#844 - [sql]
重写并简化了用于在可选择表达式之间“定位”列的系统。在 SQL 方面,这由“corresponding_column()”方法表示。这种方法在 ORM 中被大量使用,用于将表达式的元素“适应”到类似的,别名的表达式,以及将最初绑定到表或可选择到别名的结果集列的“对应”表达式。新的重写功能具有完全一致和准确的行为。 - [sql]
添加了一个字段(“info”)用于在模式项上存储任意数据
参考:#573 - [sql]
Connections 上的 “properties” 集合已重命名为 “info” 以匹配 schema 的可写集合。直到 0.5 版本,仍然可以通过 “properties” 名称访问。 - [sql]
修复了在使用 strategy=’threadlocal’ 时 Transaction 上的 close() 方法 - [sql]
修复编译绑定参数不会错误地填充 None 的问题
参考:#853 - [sql]
._execute_clauseelement 变为公共方法 Connectable.execute_clauseelement
杂项
- [方言]
添加了对 MaxDB(版本 >= 7.6.03.007)的实验性支持。 - [方言]
现在 Oracle 将“DATE”反映为 OracleDateTime 列,而不是 OracleDate - [方言]
在 oracle table_names() 函数中添加了对模式名称的意识,修复了 metadata.reflect(schema=’someschema’) 的问题
参考:#847 - [方言]
MSSQL 匿名标签用于选择函数变得确定性 - [方言]
sqlite 将“DECIMAL”反映为数字列。 - [方言]
使访问 dao 检测更可靠
参考:#828 - [方言]
将 Dialect 属性 ‘preexecute_sequences’ 重命名为 ‘preexecute_pk_sequences’。对于使用旧名称的 out-of-tree 方言,现在有一个属性代理。 - [方言]
为未知类型反射添加了测试覆盖。修复了 sqlite/mysql 对未知类型的类型反射处理。 - [方言]
为 mysql 方言添加了 REAL(用于利用 REAL_AS_FLOAT sql 模式的人)。 - [方言]
mysql Float、MSFloat 和 MSDouble 现在在没有参数的情况下生成无参数 DDL,例如 ‘FLOAT’。 - [杂项]
删除了未使用的 util.hash()。
orm
- [orm]
应用了 LIMIT/OFFSET 的急加载不再将主表连接到自身的限制子查询;急加载现在直接连接到提供主表列给结果集的子查询。这消除了所有带有 LIMIT/OFFSET 的急加载的 JOIN。
参考:#843 - [orm]
session.refresh() 和 session.expire() 现在支持额外的参数“attribute_names”,一个要刷新或过期的单个属性键名列表,允许对已加载实例的属性进行部分重新加载。
参考:#802 - [orm]
为被检测属性添加了 op() 操作符;即 User.name.op(‘ilike’)(‘%somename%’)
参考:#767 - [orm]
映射类现在可以定义具有任意语义的 eq、hash 和 nonzero 方法。orm 现在仅基于标识处理所有映射实例。(例如 ‘is’ vs ‘==’)
参考:#676 - [orm]
Mapper 上的 “properties” 访问器已移除;现在会抛出一个信息性异常,解释 mapper.get_property() 和 mapper.iterate_properties 的用法 - [orm]
向 Query 添加了 having() 方法,将 HAVING 应用于生成的语句,方式与 filter() 将条件追加到 WHERE 子句中的方式相同。 - [orm]
现在 query.options() 的行为完全基于路径,即诸如 eagerload_all(‘x.y.z.y.x’) 这样的选项将仅应用于这些路径,并且不会应用于 ‘x.y.x’;eagerload(‘children.children’) 仅应用于恰好两层深度等。
参考:#777 - [orm]
如果设置 PickleType 的 mutable=False,则 PickleType 将使用 == 进行比较,而不是 is 操作符。要使用 is 或其他比较器,请使用 PickleType(comparator=my_custom_comparator) 发送自定义比较函数。 - [orm]
如果在 query 中同时使用 distinct() 和包含 UnaryExpressions(或其他)的 order_by(),则不会抛出错误。
参考:#848 - [orm]
在使用 distinct() 时,来自连接表的 order_by() 表达式将正确添加到列子句中。
参考:#786 - [orm]
修复了 Query.add_column() 不接受类绑定属性作为参数的错误;Query 还会在传递无效参数给 add_column()(在 instances() 时间)时报错。
参考:#858 - [orm]
在 InstanceState.__cleanup() 中增加了更多对垃圾收集引用的检查,以减少应用程序关闭时出现的“gc ignored”错误。 - [orm]
会话 API 已经稳定: - [orm]
当尝试对已经持久化的对象进行 session.save() 时会报错。
参考:#840 - [orm]
当尝试对 未 持久化的对象进行 session.delete() 时会报错。 - [orm]
当尝试对已经在会话中以不同标识符存在的实例进行更新或删除时,session.update() 和 session.delete() 会报错。 - [orm]
在确定“对象 X 已经在另一个会话中”时,会话现在会更仔细地进行检查;例如,如果您将一系列对象进行 pickle,并在稍后反 pickle(即在 Pylons HTTP 会话或类似情况下),它们可以在没有任何冲突的情况下进入新会话。 - [orm]
merge() 包含一个名为 “dont_load=True” 的关键字参数。设置此标志将导致合并操作不会在响应传入的分离对象时从数据库中加载任何数据,并且将接受传入的分离对象,就好像它已经存在于该会话中。可以使用此功能将外部缓存系统中的分离对象合并到会话中。 - [orm]
当分配属性时,延迟列属性不再触发加载操作。在这些情况下,新分配的值将无条件地出现在刷新的 UPDATE 语句中。 - [orm]
修复了重新分配集合子集时出现截断错误的问题(obj.relation = obj.relation[1:])。
参考:#834 - [orm]
精简了 backref 配置代码,覆盖现有属性的 backrefs 现在会引发错误
参考:#832 - [orm]
改进了 add_property()等的行为,修复了涉及 synonym/deferred 的问题。
参考:#831 - [orm]
修复了 clear_mappers()行为,以更好地清理自身之后。 - [orm]
修复了“行切换”行为,即当 INSERT/DELETE 合并为单个 UPDATE 时;父对象上的多对多关系正确更新。
参考:#841 - [orm]
修复了关联代理的 hash - 这些集合是不可哈希的,就像它们的可变 Python 对应物一样。 - [orm]
为作用域会话添加了 save_or_update、contains 和 iter 方法的代理。 - [orm]
修复了一个非常难以复现的问题,即 Query 的 FROM 子句可能会被某些生成调用污染
参考:#852
sql
- [sql]
bindparam()上的“shortname”关键字参数已被弃用。 - [sql]
添加了 contains 运算符(生成一个“LIKE %%”子句)。 - [sql]
匿名列表达式会自动标记。例如,select([x* 5])会产生“SELECT x * 5 AS anon_1”。这允许标签名存在于 cursor.description 中,然后可以与结果列处理规则适当匹配。(我们无法可靠地使用位置跟踪进行结果列匹配,因为 text()表达式可能代表多个列)。 - [sql]
运算符重载现在由 TypeEngine 对象控制 - 到目前为止内置的运算符重载是 String 类型重载‘+’成为字符串连接运算符。用户定义的类型也可以通过覆盖 adapt_operator(self, op)方法来定义自己的运算符重载。 - [sql]
二元表达式右侧的无类型绑定参数将被分配为操作左侧的类型,以更好地启用适当的绑定参数处理
参考:#819 - [sql]
从大多数语句编译中移除了正则表达式步骤。还修复了
参考:#833 - [sql]
修复了空(零列)sqlite 插入,允许在自动递增单列表上插入。 - [sql]
修复了 text()子句的表达式转换;这修复了各种 ORM 场景中使用文字文本作为 SQL 表达式的情况 - [sql]
移除了 ClauseParameters 对象;compiled.params 现在返回一个常规字典,以及 result.last_inserted_params() / last_updated_params()。 - [sql]
修复了关于具有基于 SQL 表达式的默认生成器的主键列的 INSERT 语句;SQL 表达式像往常一样内联执行,但不会为该列触发“postfetch”条件,对于那些通过 cursor.lastrowid 提供它的 DB - [sql]
func. 对象可以被 pickled/unpickled
参考:#844 - [SQL]
重写并简化了用于在可选择表达式之间“定位”列的系统。在 SQL 方面,这由 “corresponding_column()” 方法表示。此方法由 ORM 大量使用,以将表达式的元素“适应”为类似的、别名的表达式,以及将原始绑定到表或可选择到别名的结果集列的表达式“定位”为相应的表达式。新的重写具有完全一致和准确的行为。 - [SQL]
添加了一个字段(“info”)用于在模式项上存储任意数据
参考:#573 - [SQL]
连接上的“properties”集合已重命名为“info”,以匹配模式的可写集合。在 0.5 版本之前,仍可通过“properties”名称访问。 - [SQL]
修复了使用 strategy=‘threadlocal’ 时 Transaction 上的 close() 方法 - [SQL]
修复了编译绑定参数不会错误地填充 None 的问题
参考:#853 - [SQL]
._execute_clauseelement 变为公共方法 Connectable.execute_clauseelement
杂项
- [方言]
添加了对 MaxDB(版本 >= 7.6.03.007)的实验性支持。 - [方言]
oracle 现在将“DATE”反映为 OracleDateTime 列,而不是 OracleDate - [方言]
在 oracle table_names() 函数中增加了对模式名称的意识,修复了 metadata.reflect(schema=‘someschema’)
参考:#847 - [方言]
MSSQL 对函数选择的匿名标签使确定性 - [方言]
sqlite 将“DECIMAL”反映为数字列。 - [方言]
使访问 dao 检测更可靠
参考:#828 - [方言]
将 Dialect 属性 ‘preexecute_sequences’ 重命名为 ‘preexecute_pk_sequences’。针对使用旧名称的 out-of-tree 方言,已放置了属性代理。 - [方言]
为未知类型反射添加了测试覆盖。修复了 sqlite/mysql 处理未知类型反射的问题。 - [方言]
为 mysql 方言添加了 REAL(供利用 REAL_AS_FLOAT sql 模式的人使用)。 - [方言]
mysql Float、MSFloat 和 MSDouble 现在构造时不带参数将产生无参数的 DDL,例如 ‘FLOAT’。 - [杂项]
删除了未使用的 util.hash()。
SqlAlchemy 2.0 中文文档(六十九)(5)https://developer.aliyun.com/article/1560788