SqlAlchemy 2.0 中文文档(六十五)(3)https://developer.aliyun.com/article/1560889
0.8.0
发布日期:2013 年 3 月 9 日
注意
0.8.0 中存在一些新的行为变化,而在 0.8.0b2 中不存在。它们在迁移文档中如下所示:
- 将“待定”对象视为“孤立”对象的考虑更加积极
- create_all() 和 drop_all() 现在将尊重空列表
- 相关性现在始终是上下文特定的
orm
- [orm] [feature]
添加了有意义的QueryableAttribute.info
属性,它代理到直接存在的Column
对象的.info
属性,否则代理到MapperProperty
。完整的行为已记录并通过测试确保稳定。
参考:#2675 - [orm] [feature]
可以在relationship()
构造已经创建后设置/更改“cascade”属性。这不是正常使用的模式,但我们喜欢在教程中为了演示目的更改设置。 - [orm] [feature]
添加了新的辅助函数was_deleted()
,如果给定对象是Session.delete()
操作的主题,则返回 True。
参考:#2658 - [orm] [feature]
扩展了运行时检查 API 系统,以便检索与 ORM 或其扩展相关的所有 Python 描述符。这满足了能够检查所有QueryableAttribute
描述符的常见请求,以及扩展类型,如hybrid_property
和AssociationProxy
。请参阅Mapper.all_orm_descriptors
。 - [orm] [bug]
在映射器配置期间改进了对现有反向引用名称冲突的检查;现在将在超类和子类上测试名称冲突,除了当前映射器之外,因为这些冲突同样会导致问题。这是 0.8 的新功能,但请参见下面关于 0.7.11 中也会触发的警告。
参考:#2674 - [orm] [bug]
改进了在检测到“反向引用循环”时发出的错误消息,即当属性事件触发两个其他属性之间的双向赋值时,没有结束。这种情况不仅发生在分配错误类型的对象时,还发生在属性被错误配置为反向引用到现有反向引用对时。也适用于 0.7.11。
参考:#2674 - [orm] [bug]
当将 MapperProperty 分配给替换现有属性的映射器时,如果涉及的属性不是简单的基于列的属性,则会发出警告。替换关系属性很少(甚至从未?)是预期的,通常指的是映射器配置错误。也适用于 0.7.11。
参考:#2674 - [orm] [bug]
如果事件处理程序在 after_commit()处理程序中尝试在没有进行中的有效事务的情况下在会话中发出 SQL,则会发出清晰的错误消息。
参考:#2662 - [orm] [bug]
在级联自然主键更新过程中检测到主键更改将成功,即使该键是复合键,只有部分属性发生更改。
参考:#2665 - [orm] [bug]
从会话中删除的对象在事务提交后将完全与该会话解除关联,也就是object_session()
函数将返回 None。
参考:#2658 - [orm] [bug]
修复了Query.yield_per()
错误设置执行选项的错误,从而破坏了后续使用Query.execution_options()
方法。感谢 Ryan Kelly。
参考:#2661 - [orm] [bug]
修复了between()
运算符的考虑,使其与新的关系本地/远程系统正确工作。
参考:#1768 - [orm] [bug]
将待定对象视为“孤立”对象的考虑已经修改,以更接近持久对象的行为,即一旦与任何启用孤立的父对象解除关联,该对象就会从Session
中清除。以前,只有在从所有启用孤立的父对象中解除关联时,待定对象才会被清除。新增了legacy_is_orphan
标志到Mapper
,它重新建立了传统行为。
详细讨论此更改的变更说明和示例案例,请参阅将“待定”对象视为“孤立”对象的考虑更加激进。
参考:#2655 - [orm] [bug]
修复了(很可能从未使用过的)“@collection.link”集合方法,每次将集合与映射对象关联或解除关联时都会触发-装饰器未经测试或功能性。装饰器方法现在命名为collection.linker()
,尽管名称“link”仍保留以确保向后兼容性。感谢 Luca Wehrstedt。
参考:#2653 - [orm] [bug]
对生成自定义受控集合系统进行了一些修复,主要是现在@collection 装饰器的使用将遵循给定类的 mro,应用特定集合方法的子类最底层类的逻辑。以前,在对现有受控类进行子类化时,例如MappedCollection
,无法预测自定义方法是否会正确解析。
参考:#2654 - [orm] [bug]
修复了潜在的内存泄漏问题,可能会在创建任意数量的sessionmaker
对象时发生。当 sessionmaker 创建的匿名子类被解除引用时,由于事件包中仍存在类级别的引用,该子类不会被垃圾回收。这个问题也适用于任何自定义系统,该系统与事件调度程序一起使用临时子类。也适用于 0.7.10 版本。
参考:#2650 - [orm] [bug]
Query.merge_result()
现在可以从外连接中加载可能为None
的实体行而不会抛出错误。也适用于 0.7.10 版本。
参考:#2640 - [orm] [bug]
对relationship()
上的“dynamic”加载器进行修复,包括当禁用自动刷新时,反向引用将正常工作,历史事件在多次添加/删除相同对象的情况下更加准确。
参考:#2637 - [orm] [removed]
已删除了使用与集合关联的__instrumentation__
数据结构来生成自定义集合的未记录(希望未使用)系统,因为这是一个复杂且未经测试的功能,与装饰器方法基本重复。还对 orm.collections 模块进行了其他内部简化。
examples
- [examples] [bug]
修复了示例/dogpile_caching 示例中的回归问题,这是由于#2614中的更改引起的。
sql
- [sql] [feature]
向Enum
及其基本SchemaType
添加了一个新参数inherit_schema
。当设置为True
时,该类型将把其schema
属性设置为其关联的Table
的模式。这也会在进行Table.tometadata()
操作时发生;在所有情况下,当Table.tometadata()
发生时,SchemaType
现在都会被复制,如果inherit_schema=True
,则该类型将采用传递给该方法的新模式名称。在与 PostgreSQL 后端一起使用时,schema
非常重要,因为该类型会导致CREATE TYPE
语句。
参考:#2657 - [sql] [feature]
Index
现在支持任意的 SQL 表达式和/或函数,除了直接列。常见的修饰符包括使用somecolumn.desc()
来创建降序索引,以及func.lower(somecolumn)
来创建不区分大小写的索引,具体取决于目标后端的功能。
参考:#695 - [sql] [bug]
改进了 SELECT 关联的行为,使得Select.correlate()
和Select.correlate_except()
方法,以及它们的 ORM 类似方法,在 FROM 子句仅在输出为合法 SQL 时才被修改;也就是说,如果关联的 SELECT 在 WHERE、columns 或 HAVING 子句的上下文中未被用于封闭的 SELECT 中,FROM 子句将保持不变。这两种方法现在只指定默认“自动关联”的条件,而不是绝对的 FROM 列表。
参考:#2668 - [sql] [bug]
修复了关于列注释的 bug,特别是可能影响到新的remote()
和local()
注释函数的某些用法,当列在后续表达式中使用时,注释可能会丢失。
参考:#1768, #2660 - [sql] [bug]
ColumnOperators.in_()
操作符现在会将None
值强制转换为null()
。
参考:#2496 - [sql] [bug]
修复了一个 bug,当一个Column
同时具有外键和列的替代“.key”名称时,Table.tometadata()
会失败。也适用于 0.7.10 版本。
参考:#2643 - [sql] [bug]
在不支持 RETURNING 的方言上尝试编译时,insert().returning() 会引发一个信息性的 CompileError。
参考:#2629 - [sql] [bug]
调整了编译器用于识别需要传递的 INSERT/UPDATE 绑定参数的“REQUIRED”符号,以便在编写自定义绑定处理代码时更容易识别。
参考:#2648
schema
- [schema] [bug]
MetaData.create_all()
和MetaData.drop_all()
现在将接受一个空列表作为不创建/删除任何项的指令,而不是忽略该集合。
参考:#2664
postgresql
- [postgresql] [feature]
增加了对 PostgreSQL 传统 SUBSTRING 函数语法的支持,当使用常规的func.substring()
时,呈现为“SUBSTRING(x FROM y FOR z)”。感谢 Gunnlaugur Þór Briem。
这个更改也被回溯到:0.7.11
参考:#2676 - [postgresql] [feature]
添加了Comparator.any()
和Comparator.all()
方法,以及独立的表达式构造。非常感谢 Audrius Kažukauskas 在这里的出色工作。 - [postgresql] [bug]
修复了在array()
构造中的 bug,当在insert()
构造中使用它时,会产生关于self_group()
方法中参数问题的错误。
mysql
- [mysql] [feature]
添加了 CyMySQL 的新方言,感谢 Hajime Nakagami。 - [mysql] [feature]
GAE 方言现在接受 URL 中的用户名/密码参数,感谢 Owen Nelson。 - [mysql] [bug] [gae]
在gaerdbms
方言中添加了一个条件导入,尝试导入 rdbms_apiproxy 和 rdbms_googleapi 以在开发和生产平台上工作。现在也支持instance
属性。感谢 Sean Lynch。也在 0.7.10 版本中。
参考:#2649 - [mysql] [bug]
如果无法从异常中提取错误代码,GAE 方言将不会在无匹配时失败;感谢 Owen Nelson。
mssql
- [mssql] [feature]
在Index
中添加了mssql_include
和mssql_clustered
选项,分别呈现INCLUDE
和CLUSTERED
关键字。感谢 Derek Harland。 - [mssql] [feature]
现在支持在非主键列上建立Sequence
构造来支持 IDENTITY 列的 DDL。感谢 Derek Harland。
参考:#2644 - [mssql] [bug]
在 mssql 信息模式中添加了一个 py3K 条件,解决了 Py3K 中反射的问题。也在 0.7.10 版本中。
参考:#2638 - [mssql] [bug]
修复了一个回归问题,即字符类型 CHAR、NCHAR 等的“collation”参数停止工作,因为“collation”现在受到基本字符串类型的支持。MSSQL 方言中的 TEXT、NCHAR、CHAR、VARCHAR 类型现在是基本类型的同义词。
oracle
- [oracle] [bug]
cx_oracle 方言将不再通过encode()
运行绑定参数名称,因为这在 Python 3 上无效,并且阻止了 Python 3 上语句的正确功能。现在只有在supports_unicode_binds
为 False 时才进行编码,当至少使用 cx_oracle 的版本 5 时,这不是 cx_oracle 的情况。
测试
- [测试] [错误]
修复了在一些 Linux 平台上无法在 test_execute 中工作的“logging”导入。也在 0.7.11 中。
参考:#2669
orm
- [orm] [功能]
添加了有意义的QueryableAttribute.info
属性,它代理到直接存在的Column
对象的.info
属性,否则代理到MapperProperty
。完整的行为已记录并通过测试确保保持稳定。
参考:#2675 - [orm] [功能]
可以在已经构建的relationship()
构造函数上设置/更改“cascade”属性。这不是正常使用的模式,但我们喜欢在教程中更改设置以进行演示。 - [orm] [功能]
添加了新的辅助函数was_deleted()
,如果给定对象是Session.delete()
操作的主题,则返回 True。
参考:#2658 - [orm] [功能]
扩展了运行时检查 API 系统,以便检索与 ORM 或其扩展相关的所有 Python 描述符。这满足了能够检查所有QueryableAttribute
描述符的常见请求,以及扩展类型,如hybrid_property
和AssociationProxy
。请参阅Mapper.all_orm_descriptors
。 - [orm] [错误]
改进了在映射器配置期间检查现有反向引用名称冲突的方法;现在将在超类和子类上测试名称冲突,除了当前映射器外,因为这些冲突会造成同样的问题。这是 0.8 版本的新功能,但请参见下面关于 0.7.11 版本也会触发的警告。
参考:#2674 - [orm] [bug]
当检测到“反向引用循环”时,改进了发出的错误消息,即当属性事件触发两个其他属性之间的双向赋值而没有结束时。这种情况不仅会在分配错误类型的对象时发生,还会在属性被错误配置为反向引用到现有反向引用对时发生。也适用于 0.7.11 版本。
参考:#2674 - [orm] [bug]
当将 MapperProperty 分配给替换现有属性的映射器时,如果涉及的属性不是简单的基于列的属性,则会发出警告。替换关系属性很少(甚至从未?)是预期的,通常指的是映射器错误配置。也适用于 0.7.11 版本。
参考:#2674 - [orm] [bug]
如果事件处理程序尝试在没有进行中的有效事务的情况下在after_commit()
处理程序中发出 SQL,则会发出清晰的错误消息。
参考:#2662 - [orm] [bug]
在级联自然主键更新过程中检测主键更改将成功,即使该主键是复合的,只有一些属性发生了变化。
参考:#2665 - [orm] [bug]
从会话中删除的对象在事务提交后将完全与该会话解除关联,即object_session()
函数将返回 None。
参考:#2658 - [orm] [bug]
修复了Query.yield_per()
设置执行选项不正确的错误,从而破坏了后续使用Query.execution_options()
方法的情况。感谢 Ryan Kelly。
参考:#2661 - [orm] [bug]
修复了between()
运算符的考虑,使其与新的关系本地/远程系统正确工作。
参考:#1768 - [orm] [bug]
将待处理对象视为“孤儿”的考虑已修改,以更接近持久对象的行为,即一旦它从任何启用孤儿的父级对象中取消关联,该对象就会从Session
中删除。以前,只有当待处理对象从所有启用孤儿的父级对象中取消关联时,才会将其删除。在Mapper
中添加了新标志legacy_is_orphan
,它重新建立了旧版本的行为。
有关此更改的详细讨论,请参阅将“待处理”对象视为“孤儿”的考虑变得更加激进的更改说明和示例情况。
参考:#2655 - [orm] [bug]
修复了(很可能从未使用过的)“@collection.link”集合方法,该方法在每次将集合与映射对象关联或取消关联时触发 - 未测试或功能性不强。装饰器方法现在命名为collection.linker()
,尽管名称“link”仍保留以保持向后兼容性。感谢 Luca Wehrstedt。
参考:#2653 - [orm] [bug]
对生成自定义检测集合系统进行了一些修复,主要是现在使用 @collection 装饰器将遵循给定类的 mro,应用于特定集合方法的子类版本的逻辑。以前,在对现有的检测类进行子类化时,例如MappedCollection
,无法预测自定义方法是否会正确解析。
参考:#2654 - [orm] [bug]
修复了可能会发生的内存泄漏问题,如果创建了任意数量的sessionmaker
对象,则会发生。由于事件包中保留了来自类级别的引用,当取消引用 sessionmaker 创建的匿名子类时,它不会被垃圾收集。此问题还适用于与事件调度程序结合使用临时子类的任何自定义系统。也适用于 0.7.10 版本。
参考:#2650 - [orm] [bug]
Query.merge_result()
现在可以从外连接加载行,其中实体可能为None
而不会抛出错误。也适用于 0.7.10 版本。
参考:#2640 - [orm] [bug]
对relationship()
上的“dynamic”加载器进行修复,包括当禁用自动刷新时,反向引用将正常工作,历史事件在同一对象多次添加/删除的情况下更加准确。
参考:#2637 - [orm] [removed]
已删除了使用与集合关联的__instrumentation__
数据结构来生成自定义集合的未记录(希望未使用)系统,因为这是一个复杂且未经测试的功能,与装饰器方法基本重复。还对 orm.collections 模块进行了其他内部简化。
示例
- [examples] [bug]
修复了示例/dogpile_caching 示例中的回归,这是由于#2614的更改引起的。
sql
- [sql] [feature]
向Enum
及其基类SchemaType
添加了一个新参数inherit_schema
。当设置为True
时,该类型将设置其与之关联的Table
的schema
属性。这也会在进行Table.tometadata()
操作时发生;在Table.tometadata()
发生时,SchemaType
现在在所有情况下都会被复制,并且如果inherit_schema=True
,该类型将采用传递给该方法的新模式名称。在与 PostgreSQL 后端一起使用时,schema
非常重要,因为该类型会导致CREATE TYPE
语句。
参考:#2657 - [sql] [feature]
Index
现在支持任意的 SQL 表达式和/或函数,除了直接列。常见的修饰符包括使用somecolumn.desc()
来创建降序索引和func.lower(somecolumn)
来创建不区分大小写的索引,具体取决于目标后端的功能。
参考:#695 - [sql] [bug]
改进了 SELECT 关联的行为,使得Select.correlate()
和Select.correlate_except()
方法,以及它们的 ORM 类似方法,在上下文中仍将保留“自动关联”的行为,即仅在输出合法的 SQL 时修改 FROM 子句;也就是说,如果关联的 SELECT 在 WHERE、columns 或 HAVING 子句的上下文中未被用于封闭的 SELECT 中,FROM 子句将保持不变。这两种方法现在只指定默认“自动关联”的条件,而不是绝对的 FROM 列表。
参考:#2668 - [sql] [bug]
修复了关于列注释的 bug,特别是可能影响新的remote()
和local()
注释函数的某些用法,其中在列在后续表达式中使用时可能会丢失注释。
参考:#1768, #2660 - [sql] [bug]
ColumnOperators.in_()
运算符现在会将None
的值强制转换为null()
。
参考:#2496 - [sql] [bug]
修复了一个 bug,关于Table.tometadata()
如果一个Column
同时具有外键和列的替代“.key”名称,将会失败。也适用于 0.7.10 版本。
参考:#2643 - [sql] [bug]
insert().returning()
在不支持 RETURNING 的方言上尝试编译时会引发一个信息丰富的 CompileError。
参考:#2629 - [sql] [bug]
调整了编译器用于识别需要传递的 INSERT/UPDATE 绑定参数的“REQUIRED”符号,使其在编写自定义绑定处理代码时更容易识别。
参考:#2648
schema
- [schema] [bug]
MetaData.create_all()
和MetaData.drop_all()
现在将空列表作为不创建/删除任何项的指令,而不是忽略该集合。
参考:#2664
postgresql
- [postgresql] [功能]
添加了对 PostgreSQL 传统 SUBSTRING 函数语法的支持,当使用常规的func.substring()
时,会呈现为“SUBSTRING(x FROM y FOR z)”。感谢 Gunnlaugur Þór Briem。
这个更改也被回溯到:0.7.11
参考:#2676 - [postgresql] [功能]
添加了Comparator.any()
和Comparator.all()
方法,以及独立的表达式构造。非常感谢 Audrius Kažukauskas 在这里的出色工作。 - [postgresql] [错误]
修复了在array()
构造中的 bug,该 bug 在insert()
构造中使用时会产生关于self_group()
方法中参数问题的错误。
mysql
- [mysql] [功能]
新增了 CyMySQL 的方言,感谢 Hajime Nakagami。 - [mysql] [功能]
GAE 方言现在接受 URL 中的用户名/密码参数,感谢 Owen Nelson。 - [mysql] [错误] [gae]
在gaerdbms
方言中添加了一个条件导入,尝试导入 rdbms_apiproxy 而不是 rdbms_googleapi 以在开发和生产平台上工作。现在也支持instance
属性。感谢 Sean Lynch。也在 0.7.10 版本中。
参考:#2649 - [mysql] [错误]
如果 GAE 方言无法从异常抛出中提取错误代码,则不会因为 None 匹配而失败;感谢 Owen Nelson。
mssql
- [mssql] [功能]
在Index
中添加了mssql_include
和mssql_clustered
选项,分别呈现INCLUDE
和CLUSTERED
关键字。感谢 Derek Harland。 - [mssql] [功能]
现在支持在非主键列上为自增列设置 DDL,方法是在任何整数列上建立一个Sequence
构造。感谢 Derek Harland。
参考:#2644 - [mssql] [错误]
在 mssql 信息模式中添加了一个 py3K 条件,修复了 Py3K 中的反射问题。也在 0.7.10 版本中。
参考:#2638 - [mssql] [错误]
修复了字符类型 CHAR、NCHAR 等的“collation”参数停止工作的回归问题,因为“collation”现在由基本字符串类型支持��MSSQL 方言中的 TEXT、NCHAR、CHAR、VARCHAR 类型现在是基本类型的同义词。
oracle
- [oracle] [错误]
cx_oracle 方言将不再通过encode()
运行绑定参数名称,因为这在 Python 3 上是无效的,并且阻止了 Python 3 上语句的正确功能。现在只有在supports_unicode_binds
为 False 时才进行编码,当至少使用 cx_oracle 的版本 5 时,这种情况并不适用于 cx_oracle。
测试
- [测试] [错误]
修复了在一些 Linux 平台上无法在 test_execute 中工作的“logging”导入。也在 0.7.11 中。
参考:#2669
0.8.0b2
发布日期:2012 年 12 月 14 日
orm
- [orm] [功能]
添加了KeyedTuple._asdict()
和KeyedTuple._fields
到KeyedTuple
类,以提供与 Python 标准库collections.namedtuple()
一定程度的兼容性。
参考:#2601 - [orm] [功能]
允许在定义关系的主要和次要连接时使用同义词。 - [orm] [错误]
Query.select_from()
方法现在可以与aliased()
构造一起使用,而不会干扰被选择的实体。基本上,像这样的语句:
ua = aliased(User) session.query(User.name).select_from(ua).join(User, User.name > ua.name)
- 将保持 SELECT 中的列子句作为未命名的“user”指定;select_from 仅在 FROM 子句中发生:
SELECT users.name AS users_name FROM users AS users_1 JOIN users ON users.name < users_1.name
- 请注意,这种行为与原始、较旧的
Query.select_from()
用例形成对比,即在不同的可选择性方面重新表述映射实体:
session.query(User.name).select_from(user_table.select().where(user_table.c.id > 5))
- 产生:
SELECT anon_1.name AS anon_1_name FROM (SELECT users.id AS id, users.name AS name FROM users WHERE users.id > :id_1) AS anon_1
- 正是后一种用例的“别名”行为妨碍了前一种用例。该方法现在明确将 SQL 表达式(如
select()
或alias()
)与映射实体(如aliased()
构造)分开考虑。
参考:#2635 - [orm] [错误]
MutableComposite
类型不允许使用MutableBase.coerce()
方法,即使代码似乎表明了这个意图,所以现在可以使用,并添加了一个简要示例。作为副作用,此事件处理程序的机制已更改,以使新的MutableComposite
类型不再添加每类型的全局事件处理程序。还在 0.7.10 版本中。
参考:#2624 - [orm] [bug]
对别名/内部路径机制的第二次彻底改进现在允许两个子类具有相同名称的不同关系,当使用完整的多态加载时同时支持子查询或联接的快速加载。
参考文献:#2614 - [orm] [bug]
修复了一个错误,其中特定的 with_polymorphic 加载中的多跳子查询加载会产生 KeyError。利用了与 #2614 相同的内部路径改进。
参考:#2617 - [orm] [bug]
修复了一个错误,当对象通过“fetch”同步策略匹配但本地不存在时,查询.update() 会产生错误。由 Scott Torborg 提供。
参考:#2602
orm 扩展
- [orm] [extensions] [feature]
sqlalchemy.ext.mutable
扩展现在包括作为扩展的一部分的示例MutableDict
类。
引擎
- [engine] [feature]
Connection.connect()
和Connection.contextual_connect()
方法现在返回一个“branched”版本,以便在返回的连接上调用Connection.close()
方法而不影响原始连接。在使用Engine
和Connection
对象作为上下文管理器时允许对称性:
with conn.connect() as c: # leaves the Connection open c.execute("...") with engine.connect() as c: # closes the Connection c.execute("...")
- [engine] [bug]
修复了MetaData.reflect()
方法,正确使用给定的Connection
,如果给定的话,而不是从该连接的Engine
中打开第二个连接。
此更改也已回溯至:0.7.10
参考:#2604 - [engine]
MetaData
的“reflect=True”参数已被弃用。请使用MetaData.reflect()
��法。
sql
- [sql] [feature]
Insert
构造现在支持多值插入,即类似于“INSERT INTO table VALUES (…), (…), …”。受 PostgreSQL、SQLite 和 MySQL 支持。特别感谢 Idan Kamara 在这方面的工作。
另请参阅
Insert 的多值支持
参考:#2623 - [sql] [bug]
修复了一个 bug,即在不传递“for_update=True”标志的情况下使用 server_onupdate= 会将默认对象应用于 server_default,覆盖原有内容。这种用法不应该需要显式的 for_update=True 参数(尤其是因为文档中显示了一个没有使用该参数的示例),因此现在在内部使用给定默认对象的副本来安排,如果标志没有设置为对应该参数的值。
此更改也已回溯至:0.7.10
参考:#2631 - [sql] [bug]
修复了由 #2410 引起的回归,即在Table.tometadata()
操作期间,CheckConstraint
会将自身应用回原始表,因为它会解析父表的 SQL 表达式。现在该操作会将给定表达式复制以对应新表。
参考:#2633 - [sql] [bug]
修复了在方言上使用的 label_length 小于实际列标识符大小时,在 SELECT 语句中无法正确渲染列的 bug。
参考:#2610 - [sql] [bug]
DECIMAL
类型现在在渲染 DDL 时遵守“precision”和“scale”参数。
参考:#2618 - [sql] [bug]
对二进制表达式的“boolean”(即__nonzero__
)评估进行了调整,例如x1 == x2
,以确保BinaryExpression
在某些情况下的“自动分组”不会妨碍此比较。之前,像下面这样的表达式:
expr1 = mycolumn > 2 bool(expr1 == expr1)
- 即使这是一个身份比较,也会评估为
False
,因为mycolumn > 2
将在被放入BinaryExpression
之前被“分组”,从而改变其身份。BinaryExpression
现在跟踪传递的“原始”对象。此外,__nonzero__
方法现在仅在运算符为==
或!=
时返回 - 其他所有情况均引发TypeError
。
参考:#2621 - [sql] [bug]
修复了一个陷阱,即无意中对ColumnElement
调用list()
会陷入无限循环,如果实现了ColumnOperators.__getitem__()
。现在通过__iter__()
发出新的 NotImplementedError。 - [sql] [bug]
修复了 type_coerce()中的错误,即如果语句被用作另一语句中的子查询,以及其他类似情况,可能会丢失类型信息。在其他情况下,当 Oracle/mssql 方言应用限制/偏移包装时,会导致类型信息丢失。
参考:#2603 - [sql] [bug]
修复了一个错误,即在生成可选择的列的“代理”时未使用 Column 的“.key”。在 0.7 版本中可能不会发生这种情况,因为 0.7 版本在更广泛的情况下不会尊重“.key”。
参考:#2597
postgresql
- [postgresql] [feature]
HSTORE
现在在 PostgreSQL 方言中可用。如果可用,还将使用 psycopg2 的扩展。感谢 Audrius Kažukauskas。
参考:#2606
sqlite
- [sqlite] [bug]
对此与 SQLite 相关的问题进行了更多调整,该问题在 0.7.9 中发布,以拦截反射外键时的遗留 SQLite 引号字符。除了拦截双引号之外,还拦截其他引号字符,例如方括号、反引号和单引号。
此更改还回溯至:0.7.10
参考:#2568
mssql
- [mssql] [功能]
添加了对主键约束“name”的反射支持,感谢 Dave Moore。
参考:#2600 - [mssql] [错误]
修复了在使用 Column 的“key”与拥有表的“schema”结合使用时,由于 MSSQL 方言的“schema 渲染”逻辑未考虑.key 而导致无法定位结果行的错误。
此更改也已回溯至:0.7.10
oracle
- [oracle] [错误]
修复了在访问引用到 DBLINK 远程数据库的同义词时,Oracle 的表反射问题;虽然 Oracle 方言中的语法已经存在一段时间,但直到现在才进行了测试。该语法已经针对链接到自身的示例数据库进行了测试,但在查询远程数据库的表信息时,仍存在一些不确定性。目前,从 user_db_links 中使用的“username”值用于匹配“owner”。
参考:#2619 - [oracle] [错误]
Oracle 的 LONG 类型,虽然是一个无界文本类型,但在返回结果行时似乎不使用 cx_Oracle.LOB 类型,因此方言已被修复,排除了对 LONG 应用 cx_Oracle.LOB 过滤。同样适用于 0.7.10。
参考:#2620 - [oracle] [错误]
修复了与 cx_Oracle 一起使用.prepare()
时,如果返回值为False
,则不会调用connection.commit()
,从而避免“无事务”错误。已经展示了在 SQLAlchemy 和 cx_oracle 中以基本方式工作的两阶段事务,但受到驱动程序观察到的注意事项的影响;请查看文档获取详细信息。同样适用于 0.7.10。
参考:#2611
杂项
- [功能] [sybase]
已为 Sybase 方言添加了反射支持。非常感谢 Ben Trofatter 为开发和测试所做的所有工作。
参考:#1753 - [功能] [池]
Pool
现在将记录所有 connection.close()操作,包括对无效连接、分离连接和超出池容量的连接的关闭。 - [功能] [池]
Pool
现在咨询Dialect
有关连接应如何“自动回滚”以及关闭的功能。这使得方言对事务范围有更多控制,因此我们将能够更好地实现对 pysqlite 和 cx_oracle 可能需要的事务处理的绕过。
参考:#2611 - [feature] [pool]
添加了新的PoolEvents.reset()
钩子,以在连接自动回滚之前捕获事件,返回到池中。与ConnectionEvents.rollback()
一起,这允许拦截所有回滚事件。 - [bug] [firebird]
为实验性的“firebird+fdb”方言添加了“fdb”的缺失导入。
参考:#2622 - [informix]
删除了有关 Informix 事务处理的一些杂项,包括一个会跳过调用 commit()/rollback()的功能,以及在 begin()中的一些硬编码隔离级别假设。由于我们没有任何用户使用它,也没有访问 Informix 数据库的权限,因此对这个方言的状态了解不多。如果有人能够访问 Informix 并愿意帮助测试这个方言,请告诉我们。
orm
- [orm] [feature]
添加了KeyedTuple._asdict()
和KeyedTuple._fields
到KeyedTuple
类,以提供与 Python 标准库collections.namedtuple()
一定程度的兼容性。
参考:#2601 - [orm] [feature]
允许在定义关系的主要和次要连接时使用同义词。 - [orm] [bug]
现在可以使用aliased()
构造来与Query.select_from()
方法一起使用,而不会干扰被选择的实体。基本上,像这样的语句:
ua = aliased(User) session.query(User.name).select_from(ua).join(User, User.name > ua.name)
- 将保留 SELECT 的列子句作为来自未别名化的“user”,如指定的;select_from 仅在 FROM 子句中发生:
SELECT users.name AS users_name FROM users AS users_1 JOIN users ON users.name < users_1.name
- 请注意,这种行为与
Query.select_from()
的原始、较旧的用例形成对比,即在不同的可选择性方面重新表述映射实体:
session.query(User.name).select_from(user_table.select().where(user_table.c.id > 5))
- 这将产生:
SELECT anon_1.name AS anon_1_name FROM (SELECT users.id AS id, users.name AS name FROM users WHERE users.id > :id_1) AS anon_1
- 后一种用例的“别名”行为妨碍了前一种用例。该方法现在明确将类似
select()
或alias()
的 SQL 表达式与像aliased()
构造一样的映射实体分开考虑。
参考:#2635 - [orm] [bug]
MutableComposite
类型不允许使用MutableBase.coerce()
方法,尽管代码似乎表明了这一意图,所以现在可以使用,并添加了一个简短示例。作为副作用,此事件处理程序的机制已更改,以便新的MutableComposite
类型不再添加每种类型的全局事件处理程序。也在 0.7.10 版本中。
参考:#2624 - [orm] [bug]
第二次对别名/内部路径机制进行改进,现在允许两个子类具有相同名称的不同关系,在同时使用子查询或连接式加载时支持全多态加载时。当使用全多态加载时,同时在两个子类上使用子查询或连接式加载时支持全多态加载。
参考:#2614 - [orm] [bug]
修复了在特定的 with_polymorphic 加载中多跳子查询加载会产生 KeyError 的错误。利用了与 #2614 相同的内部路径改进。
参考:#2617 - [orm] [bug]
修复了查询.update()在“fetch”同步策略匹配的对象不在本地时会产生错误的回归。感谢 Scott Torborg。
参考:#2602
orm 扩展
- [orm] [extensions] [feature]
sqlalchemy.ext.mutable
扩展现在包括示例MutableDict
类作为扩展的一部分。
engine
- [engine] [feature]
Connection.connect()
和Connection.contextual_connect()
方法现在返回一个“分支”版本,以便可以在返回的连接上调用Connection.close()
方法而不影响原始连接。在使用Engine
和Connection
对象作为上下文管理器时提供对称性:
with conn.connect() as c: # leaves the Connection open c.execute("...") with engine.connect() as c: # closes the Connection c.execute("...")
- [engine] [bug]
修复了MetaData.reflect()
以正确使用给定的Connection
,如果给定的话,而不是从该连接的Engine
中打开第二个连接。
此更改也被回溯到:0.7.10
参考:#2604 - [engine]
对MetaData
的“reflect=True”参数已被弃用。请使用MetaData.reflect()
方法。
sql
- [sql] [feature]
Insert
构造现在支持多值插入,即,一个类似“INSERT INTO table VALUES (…), (…), …”的 INSERT。由 PostgreSQL、SQLite 和 MySQL 支持。非常感谢 Idan Kamara 在这方面的工作。
另请参见
插入的多值支持
参考:#2623 - [sql] [bug]
修复了使用 server_onupdate=而没有传递“for_update=True”标志的 bug,会将默认对象应用于 server_default,覆盖原有内容。明确的 for_update=True 参数在这种用法中不应该是必需的(特别是因为文档显示了一个没有使用它的示例),因此现在在内部使用给定默认对象的副本,如果标志未设置为对应该参数的内容。
此更改也被回溯到:0.7.10
参考:#2631 - [sql] [bug]
修复了由#2410引起的回归,其中CheckConstraint
在Table.tometadata()
操作期间会将自身应用回原始表,因为它会解析父表的 SQL 表达式。该操作现在将给定的表达式复制以对应新表。
参考:#2633 - [sql] [bug]
修复了在 dialect 上使用 label_length 小于实际列标识符大小的 bug,会导致在 SELECT 语句中无法正确渲染列。
参考:#2610 - [sql] [bug]
当渲染 DDL 时,DECIMAL
类型现在遵守“precision”和“scale”参数。
参考:#2618 - [sql] [bug]
对二进制表达式(即__nonzero__
)的“布尔”评估进行了调整,即x1 == x2
,以确保BinaryExpression
在某些情况下的“自动分组”不会干扰此比较。先前,像这样的表达式:
expr1 = mycolumn > 2 bool(expr1 == expr1)
- 将被评估为
False
,即使这是一个恒等比较,因为在被放入BinaryExpression
之前,mycolumn > 2
将被“分组”,从而改变其标识。BinaryExpression
现在跟踪传入的“原始”对象。此外,__nonzero__
方法现在仅在操作符为==
或!=
时返回 - 所有其他操作符都会引发TypeError
。
参考:#2621 - [sql] [bug]
修复了一个问题,即无意中对ColumnElement
调用 list() 会进入无限循环,如果实现了ColumnOperators.__getitem__()
。现在通过__iter__()
发出一个新的 NotImplementedError。 - [sql] [bug]
修复了 type_coerce() 中的错误,其中如果语句被用作另一个语句内部的子查询,以及其他类似情况,则可能会丢失类型信息。在 Oracle/mssql 方言应用 limit/offset 包装时,会导致类型信息丢失,这是其中之一。
参考:#2603 - [sql] [bug]
修复了一个错误,即在生成可选择的列的“代理”时,未使用列的“.key”。这可能在 0.7 中没有发生,因为在更广泛的范围内 0.7 不尊重“.key”。
参考:#2597
postgresql
- [postgresql] [feature]
在 PostgreSQL 方言中现在可以使用HSTORE
。如果可用,还将使用 psycopg2 的扩展。感谢 Audrius Kažukauskas。
参考:#2606
sqlite
- [sqlite] [bug]
对于这个与 SQLite 相关的问题进行了更多调整,该问题在 0.7.9 中发布,以拦截反射外键时的传统 SQLite 引号字符。除了拦截双引号外,现在还拦截其他引号字符,如方括号、反引号和单引号。
这个更改也被回溯到:0.7.10
参考:#2568
mssql
- [mssql] [功能]
添加了对主键约束“name”的反射支持,感谢 Dave Moore。
参考:#2600 - [mssql] [错误]
修复了在将“key”与 Column 结合使用时与拥有表的“schema”失败的 bug,原因是 MSSQL 方言的“schema 渲染”逻辑未考虑 .key。
此更改也已回溯到:0.7.10
oracle
- [oracle] [错误]
修复了在访问引用到 DBLINK 远程数据库的同义词时的 Oracle 表反射问题;虽然该语法在 Oracle 方言中已经存在一段时间,但直到现在还没有进行过测试。该语法已针对连接到自身的样本数据库进行了测试,但是仍然存在一些不确定因素,即在查询远程数据库以获取表信息时应使用什么作为“owner”的值。当前,来自 user_db_links 的“username” 值用于匹配“owner”。
参考:#2619 - [oracle] [错误]
Oracle LONG 类型,虽然是无界文本类型,但在返回结果行时似乎没有使用 cx_Oracle.LOB 类型,因此修复了该方言以排除 LONG 从应用 cx_Oracle.LOB 过滤。同样适用于 0.7.10。
参考:#2620 - [oracle] [错误]
修复了与 cx_Oracle 结合使用.prepare()
的用法,因此返回值为False
将导致不调用connection.commit()
,从而避免“无事务”错误。已经证明 SQLAlchemy 和 cx_oracle 可以以一种基本方式使用两阶段事务,但是受到驱动程序观察到的警告的影响;有关详细信息,请参阅文档。同样适用于 0.7.10。
参考:#2611
杂项
- [功能] [sybase]
已向 Sybase 方言添加了反射支持。非常感谢 Ben Trofatter 在开发和测试中所做的所有工作。
参考:#1753 - [功能] [池]
Pool
现在将平等记录所有连接关闭(connection.close()
)操作,包括对失效连接、脱离连接和超出池容量的连接的关闭。 - [功能] [池]
Pool
现在会咨询Dialect
关于连接应该如何“自动回滚”以及关闭的功能。这使得方言更加掌控事务范围,因此我们将更好地能够实现对 pysqlite 和 cx_oracle 等可能需要的事务性回避的控制。
参考:#2611 - [功能] [池]
添加了新的PoolEvents.reset()
钩子,用于在连接自动回滚之前捕获事件,返回到池中。与ConnectionEvents.rollback()
一起,这允许拦截所有回滚事件。 - [错误] [firebird]
为实验性的“firebird+fdb”方言添加了“fdb”的缺失导入。
参考:#2622 - [informix]
已删除有关 informix 事务处理的一些不必要内容,包括一个跳过调用 commit()/rollback()以及在 begin()上的一些硬编码隔离级别假设的功能。由于我们没有任何用户使用它,也没有访问 Informix 数据库的权限,因此对这种方言的状态了解不多。如果有人有权访问 Informix 并愿意帮助测试这种方言,请告诉我们。
SqlAlchemy 2.0 中文文档(六十五)(5)https://developer.aliyun.com/article/1560892