SqlAlchemy 2.0 中文文档(六十六)(3)https://developer.aliyun.com/article/1560809
0.7.3
发布日期:2011 年 10 月 16 日 星期日
通用
- [general]
调整了“importlater”机制,该机制在内部用于解决导入循环,使得在导入 sqlalchemy 或 sqlalchemy.orm 之后完成 import 的使用,从而避免在应用程序启动新线程后使用 import,修复了问题。也适用于 0.6.9 版本。
参考:#2279
orm
- [orm]
改进了 query.join(),使“左”侧可以更灵活地是非 ORM 可选择项,例如子查询。放置在 select_from()中的可选择项现在将被用作左侧,优先于隐式使用映射实体。如果基于外键不足而加入仍然失败,则错误消息将包含此详细信息。感谢 IRC 上的 brianrhude 提供测试用例。
参考:#2298 - [orm]
添加了 after_soft_rollback() Session 事件。无论是否发生实际的 DBAPI 级别回滚,此事件都会在调用 rollback()时无条件触发。此事件专门设计用于在 Session.is_active 为 True 时允许在回滚后继续与 Session 进行操作。
参考:#2241 - [orm]
在 orm.aliased()构造中添加了“adapt_on_names”布尔标志。允许 aliased()构造将 ORM 实体链接到包含聚合或其他派生形式特定属性的可选择项,前提是名称与实体映射列的名称相同。 - [orm]
向 column_property()添加了新标志 expire_on_flush=False,标记那些在刷新后否则被视为“只读”的属性,即从 SQL 表达式派生,以保留它们的值,即使父对象本身参与了更新。 - [orm]
增强了 ORM 中的仪器支持 Py3K 的新参数样式“required kw arguments”,即 fn(a, b, *, c, d),fn(a, b, *args, c, d)。映射对象的 init 方法的参数签名将被保留,包括必需的 kw 规则。
参考:#2237 - [orm]
修复了工作单元中的错误,其中在高度相互链接的模式中的类之间检测“循环”不会产生确定性结果;因此,有时会错过应该被视为循环的一些节点,并在后续引起更多问题。请注意,此错误也存在于 0.6 版本中;目前尚未回溯。
参考:#2282 - [orm]
修复了从 0.6 版本开始的各种与 synonym()相关的回归问题:
- 现在可以对同义词进行同义词处理。
- 对 relationship()创建的同义词可以传递给 query.join(),传递给 query.options()的选项,按名称传递给 query.with_parent()。
- [orm]
修复了在子查询的预加载中,“mapper.order_by” 属性将被“inner”查询中忽略的错误。同时也修复了 0.6.9 版本中的此问题。
参考:#2287 - [orm]
Identity map 中的.discard()方法在内部使用dict.pop(,None)而不是 “del”,以避免在非确定性的垃圾回收拆除期间出现 KeyError/警告。
参考:#2267 - [orm]
在新的复合重写中修复了由于缺少导入而导致deferred=True选项失败的错误。
参考:#2253 - [orm]
重新添加了composite()函数中的“comparator_factory”参数,该参数在 0.7 版本发布时被移除。
参考:#2248 - [orm]
修复了在复杂的多重重叠路径方案中会发生的查询.join()中的错误,其中相同的表可能会被加入两次。感谢 Dave Vitek 在这里提供了出色的修复。
参考:#2247 - [orm]
当切片的OFFSET为零时,查询将将其转换为None,以避免调用不必要的OFFSET子句。 - [orm]
修复了一个极端情况,即当一个新的 mapper 上的关系在第一个 mapper 上建立反向引用时,mapper 会在更新内部状态时失败的情况。 - [orm]
修复了一个错误,即如果重新定义了__eq__(),那么关系多对一的延迟加载会命中__eq__()并失败。不适用于 0.6.9。
参考:#2260 - [orm]
调用class_mapper()并传入一个不是“type”的对象(即一个可能被映射的类)现在会引发一个信息性的ArgumentError,而不是UnmappedClassError。
参考:#2196 - [orm]
新的事件钩子MapperEvents.after_configured()。在 configure() 步骤完成并且 mapper 实际受到影响后调用。理论上,除非在使用现有映射之后构建新映射,否则每个应用程序都会调用此事件一次。 - [orm]
当一个打开的 Session 被垃圾回收时,其中保留的对象再次被添加到新的 Session 中时被视为分离。这是通过额外检查之前的“session_key”是否实际存在于 Sessions 池中来完成的。
参考:#2281 - [orm]
新的声明性特性:
__declare_last__()方法,为类方法建立一个事件监听器,在完成最终的“configure”步骤时将调用该方法。__abstract__标志。当类上存在此标志时,该类将不被映射。- 新的辅助类
ConcreteBase,AbstractConcreteBase。允许使用声明性创建具体映射,当“configure” mapper 步骤被调用时,将自动设置“polymorphic_union”。- 映射器本身具有半私有方法,允许在配置后将“with_polymorphic”可选择项分配给映射器。
- 参考:#2239
- [ORM]
当子类的基类使用@declared_attr 用于常规列时,Declarative 将发出警告-此属性不会传播到子类。
参考:#2283 - [ORM]
用于将映射实例与其所属会话关联的整数“id”现在由序列生成函数生成,而不是 id(Session),以消除回收的 id()值可能导致不正确结果的可能性,无需检查对象是否实际在会话中。
参考:#2280 - [ORM]
行为改进:空的连接词,如 and_()和 or_()将在封闭连接词的上下文中被展平,即 and_(x, or_())将产生‘X’而不是‘X AND ()’。
参考:#2257 - [ORM]
修复了有关计算 select()元素的“from”列表的错误。现在“from”计算被延迟,因此如果构造使用尚未附加到表的 Column 对象,但稍后与表关联,它将使用表作为 FROM 生成 SQL。这个更改对 FROM 列表以及“correlates”集合的计算机制产生了相当深远的影响,因为一些“子句适应”方案(这些在 ORM 中被广泛使用)依赖于“froms”集合通常在适应完成之前被缓存的事实。重做允许“froms”集合可以随时清除并重新生成。
参考:#2261 - [ORM]
修复了 Select 的 with_only_columns()方法如果传递了可选择项将失败的错误。也在 0.6.9 版本中。
参考:#2270
示例
- [示例]
调整了 dictlike-polymorphic.py 示例,应用 CAST 使其在 PG 和其他数据库上运行。也在 0.6.9 版本中。
参考:#2266
引擎
- [引擎]
所有池类中的 recreate()方法使用 self.class 来获取要生成的池类型,在子类化的情况下。请注意,通常不需要对池进行子类化。
参考:#2254 - [引擎]
对多参数语句日志记录的改进,长列表的绑定参数集将被压缩,并提供有关正在进行的压缩的信息指示器。异常消息使用相同的改进格式。
参考:#2243 - [引擎]
添加了可选的“sa_pool_key”参数到 pool.manage(dbapi).connect(),以便不需要序列化参数。 - [引擎]
create_engine() 支持的入口点解析现在支持在内置或入口点解析的方言上解析单独的 DBAPI 驱动程序,使用标准的“+”表示法 - 在解析为入口点之前,它会被转换为“.”。
参考:#2286 - [engine]
添加了对连接中“返回 unicode 检测”步骤的异常捕获和警告,允许在 NVARCHAR 上崩溃的数据库继续初始化,假设没有实现 NVARCHAR 类型。
参考:#2299
模式
- [schema]
修改了 Column.copy() 方法以使用 _constructor(),它默认为 self.class,以创建新对象。这样可以更容易地支持 Column 的子类化。
参考:#2284 - [schema]
为 SchemaItem 类添加了稍微更好的 repr()。注意,这里的 repr 不能完全支持“repr 就是构造函数”的想法,因为模式项可能会非常深层次地嵌套/循环,有些东西可能会延迟初始化等。
参考:#2223
postgresql
- [postgresql]
为 Index() 添加了“postgresql_using”参数,用于产生 USING 子句以指定 PG 的索引实现方式。感谢 Ryan P. Kelly 提供补丁。
参考:#2290 - [postgresql]
在使用 postgresql+psycopg2 方言时,create_engine() 添加了 client_encoding 参数;连接时调用 psycopg2 的 set_client_encoding() 方法并传递值。
参考:#1839 - [postgresql]
修复了一个 bug,该 bug 与 PG 9 中修改索引行为影响重命名列上的主键反射有关。也出现在 0.6.9 版本中。
参考:#2141, #2291 - [postgresql]
对于 Table、Sequence 的反射函数不再区分大小写。名称只能在大小写上有所不同,并且将被正确区分。
参考:#2256 - [postgresql]
使用原子计数器作为服务器端游标名称的“随机数”源;在极少数情况下报告了冲突。 - [postgresql]
缩小了在反射当前搜索路径中具有模式的外键引用表时所做的假设范围;只有在引用表的模式确实与引用表的模式匹配时,才会应用显式模式到引用表。以前假设“当前”模式与完整的搜索路径是等同的。
参考:#2249
mysql
- [mysql]
CREATE TABLE 将在 CHARSET 之后放置 COLLATE 选项,这似乎是 MySQL 关于它是否实际工作的任意规则的一部分。也出现在 0.6.9 版本中。
参考:#2225 - [mysql]
向 Index 构造添加了 mysql_length 参数,指定索引的“长度”。
参考:#2293
sqlite
- [sqlite]
确保无论是否使用 C 扩展,从数据库解析的非法日期/时间/日期时间字符串都会引发相同的 ValueError。
mssql
- [mssql]
尝试支持 FreeTDS 0.91 与 Pyodbc。这包括在检测到 FreeTDS 0.91 时将字符串绑定发送为 Python unicode 对象,并在检测到表时使用 CAST(? AS NVARCHAR)。然而,我会继续将 Pyodbc + FreeTDS 0.91 的行为描述为相当糟糕,仍然有许多查询(例如在反射中使用的查询)在 Linux 上导致核心转储,在 OSX 上根本无法使用,MemoryErrors 随处可见,对 Unicode 支持有严重问题。
参考:#2273 - [mssql]
当比较标量选择与值时,= /!=的行为将不再在 0.8 版本中产生 IN / NOT IN;这种行为有点过于武断(如果要发出 IN,请使用in_()),现在会发出弃用警告。要立即获得 0.8 版本的行为并消除警告,可以在www.sqlalchemy.org/docs/07/dialects/mssql.html#scalar-select-comparisons给出的编译器配方中覆盖 visit_binary()的行为。
参考:#2277 - [mssql]
“0”被接受为 limit()的参数,将产生“TOP 0”。
参考:#2222
oracle
- [oracle]
修复了 zxjdbc 方言的 ReturningResultProxy。从 0.6 开始的回归。
参考:#2272 - [oracle]
String 类型现在在 Oracle 上生成 VARCHAR2,这是推荐的默认 VARCHAR。在 Oracle 方言中还添加了显式的 VARCHAR2 和 NVARCHAR2。使用 NVARCHAR 仍然生成“NVARCHAR2” - 在 Oracle 上没有“NVARCHAR” - 这仍然是“大写类型始终给出确切内容”的政策的轻微破坏。VARCHAR 仍然生成“VARCHAR”,遵循该政策。如果 Oracle 曾经定义“VARCHAR”为他们声称的不同内容(在我看���永远不会发生),该类型将可用。
参考:#2252
杂项
- [types]
超出基本 Float 类型的“精度”和“asdecimal”之外的额外关键字参数将被忽略;这里添加了一个弃用警告和额外的文档,相关于
参考:#2258 - [ext]
SQLSoup 将不包含在 SQLAlchemy 的 0.8 版本中;虽然有用,但我们希望保持 SQLAlchemy 本身专注于一个 ORM 使用范例。SQLSoup 很快将被第三方项目取代。
参考:#2262 - [ext]
向 AssociationProxy 添加了 local_attr、remote_attr、attr 访问器,提供对类级别的代理属性的快速访问。
参考:#2236 - [ext]
更改了关联代理字典上的 update() 方法,以使用鸭子类型方法,即检查“keys”,以区分 update({}) 和 update((a, b))。先前,传递具有元组作为键的字典会被错误解释为序列。
参考:#2275
一般
- [general]
调整了“importlater”机制,该机制在内部用于解决导入循环,使得在导入 sqlalchemy 或 sqlalchemy.orm 后完成对 import 的使用,从而避免在应用程序启动新线程后使用任何 import。也适用于 0.6.9 版本。
参考:#2279
orm
- [orm]
改进了 query.join(),使得“左”侧可以更灵活地是非 ORM 可选择的,比如子查询。放置在 select_from() 中的可选择项现在将用作左侧,优先于对映射实体的隐式使用。如果基于外键缺失而连接仍然失败,则错误消息将包含此详细信息。感谢 IRC 上的 brianrhude 提供的测试用例。
参考:#2298 - [orm]
添加了 after_soft_rollback() 会话事件。无论是否发生了实际的 DBAPI 级别的回滚,此事件都会无条件触发 rollback() 被调用。此事件专门设计用于在 rollback() 后 Session.is_active 为 True 时允许会话操作继续进行。
参考:#2241 - [orm]
向 orm.aliased() 构造添加了“adapt_on_names”布尔标志。允许 aliased() 构造将 ORM 实体链接到包含聚合或特定属性的其他派生形式的可选择项,前提是名称与映射列的实体相同。 - [orm]
向 column_property() 添加了新标志 expire_on_flush=False,将那些否则被认为是“只读”的属性标记为,在刷新后保留它们的值,包括父对象本身参与更新的情况。 - [orm]
增强了 ORM 中的仪器设备以支持 Py3K 的新参数样式“required kw arguments”,即 fn(a, b, *, c, d),fn(a, b, *args, c, d)。映射对象的 init 方法的参数签名将被保留,包括必需的 kw 规则。
参考:#2237 - [orm]
修复了工作单元中的错误,其中在高度相互链接的模式中检测类之间的“循环”不会产生确定性结果;因此,有时会错过应该被视为循环的一些节点,并在后续引发更多问题。请注意,此错误也存在于 0.6 版本中;目前没有回溯。
参考:#2282 - [orm]
修复了从 0.6 版本中引入的各种 synonym()-相关回归问题:
- 现在对一个同义词进行同义词处理是有效的。
- 与 relationship()相关的同义词可以传递给 query.join()、发送到 query.options()的选项,并按名称传递给 query.with_parent()。
- [orm]
修复了一个 bug,其中 mapper.order_by 属性在子查询贪婪加载中的“内部”查询中将被忽略。同时也在 0.6.9 版本中修复。
参考:#2287 - [orm]
Identity map .discard()在内部使用 dict.pop(,None)而不是“del”,以避免在非确定性 gc 拆除期间出现 KeyError/警告。
参考:#2267 - [orm]
修复了新的 composite 重写中由于缺少导入而导致 deferred=True 选项失败的回归问题。
参考:#2253 - [orm]
重新引入了 composite()的“comparator_factory”参数,在 0.7 发布时删除。
参考:#2248 - [orm]
修复了在复杂的多重重叠路径场景中会发生的 query.join()中的 bug,在此场景中,同一表可能会被连接两次。非常感谢 Dave Vitek 在这里的出色修复。
参考:#2247 - [orm]
当查询(Query)将 OFFSET 设置为零时,将其转换为 None,以避免不必要的 OFFSET 子句被调用。 - [orm]
修复了一个边缘情况,在新映射器上的关系(relationship)建立了第一个映射器上的反向引用时,mapper 将无法完全更新内部状态。 - [orm]
修复了一个 bug,其中如果重新定义了 eq(),则关系(relationship)多对一懒加载会触发 eq()并失败。不适用于 0.6.9 版本。
参考:#2260 - [orm]
调用 class_mapper()并传入一个不是“类型”的对象(即可能被映射的类)现在会引发一个具有信息性的 ArgumentError,而不是 UnmappedClassError。
参考:#2196 - [orm]
新的事件钩子,MapperEvents.after_configured()。在配置(configure())步骤完成并实际受到影响的映射器(mappers)后调用。理论上,此事件每个应用程序调用一次,除非在已使用现有映射器之后构造新映射。 - [orm]
当一个打开的 Session 被垃圾回收时,其中仍然存在的对象在被添加到新的 Session 时被认为是分离的。这是通过额外检查之前的“session_key”是否实际上存在于 Sessions 池中完成的。
参考:#2281 - [orm]
新的声明性功能:
- declare_last()方法,为类方法建立一个事件监听器,该监听器将在映射器(mappers)完成最终的“configure”步骤时调用。
- abstract 标志。当类上存在此标志时,该类将不会被映射。
- 新的辅助类 ConcreteBase、AbstractConcreteBase。允许使用声明性进行具体映射,当“configure”映射器步骤被调用时,自动设置“polymorphic_union”。
- 映射器本身具有半私有方法,允许在配置后将“with_polymorphic”可选择的分配给映射器。
- 参考:#2239
- [orm]
当子类的基类使用 @declared_attr 用于常规列时,声明性将发出警告 - 此属性不会传播到子类。
参考:#2283 - [orm]
用于将映射实例与其所属会话关联的整数“id”现在由序列生成函数生成,而不是 id(Session),以消除回收的 id() 值可能导致不正确结果的可能性,无需检查对象实际上是���在会话中。
参考:#2280 - [orm]
行为改进:空连接词,如 and_() 和 or_(),将在包含连接词的上下文中被展开,即 and_(x, or_()) 将产生‘X’而不是‘X AND ()’。
参考:#2257 - [orm]
修复了有关计算“from”列表的 bug,用于 select() 元素。现在,“from”计算被延迟,因此如果构造使用尚未附加到表格但稍后与表格关联的 Column 对象,则会生成使用表格作为 FROM 的 SQL。这个更改对 FROM 列表以及“correlates”集合的计算机制产生了相当深远的影响,因为一些“子句适应”方案(这些方案在 ORM 中被大量使用)依赖于“froms”集合通常在适应完成之前被缓存的事实。重新设计使得“froms”集合可以随时清除并重新生成。
参考:#2261 - [orm]
修复了一个 bug,即如果传递了可选择项,则 Select 的 with_only_columns() 方法将失败。也适用于 0.6.9 版本。
参考:#2270
示例
- [examples]
调整 dictlike-polymorphic.py 示例以应用 CAST,使其在 PG 和其他数据库上运行。也适用于 0.6.9 版本。
参考:#2266
engine
- [engine]
所有池类中的 recreate() 方法使用 self.class 来获取要生成的池类型,在子类化的情况下。请注意,通常不需要对池进行子类化。
参考:#2254 - [engine]
改进多参数语句记录,长列表的绑定参数集将被压缩,并附带有指示压缩正在进行的信息。异常消息使用相同的改进格式。
参考:#2243 - [引擎]
添加了可选的“sa_pool_key”参数到 pool.manage(dbapi).connect(),这样就不需要对参数进行序列化。 - [引擎]
create_engine()现在支持解析单独的 DBAPI 驱动程序的入口点解析,使用标准的‘+’符号 - 在解析为入口点之前会将其转换为‘.’。
参考:#2286 - [引擎]
在连接中添加了一个异常捕获+警告,用于“返回 unicode 检测”步骤,允许在 NVARCHAR 上崩溃的数据库继续初始化,假设没有实现 NVARCHAR 类型。
参考:#2299
模式
- [模式]
修改了 Column.copy()以使用 _constructor(),默认为 self.class,以创建新对象。这样可以更容易地支持 Column 的子类化。
参考:#2284 - [模式]
对 SchemaItem 类添加了稍微更好的 repr()。请注意,这里的 repr 不能完全支持“repr 即构造函数”的想法,因为模式项可以非常深层嵌套/循环,某些内容的初始化较晚等。
参考:#2223
postgresql
- [postgresql]
向 Index()添加了“postgresql_using”参数,生成 USING 子句以指定 PG 的索引实现方式。感谢 Ryan P. Kelly 的补丁。
参考:#2290 - [postgresql]
当使用 postgresql+psycopg2 方言时,向 create_engine()添加 client_encoding 参数;在连接时调用 psycopg2 的 set_client_encoding()方法并传递值。
参考:#1839 - [postgresql]
修复了一个与 PG 9 中相同修改的索引行为影响重命名列上的主键反射的错误。也在 0.6.9 中修复。
参考:#2141, #2291 - [postgresql]
Table、Sequence 的反射函数不再区分大小写。名称只能在大小写上有所不同,并且将被正确区分。
参考:#2256 - [postgresql]
使用原子计数器作为服务器端游标名称的“随机数”来源;在极少数情况下已报告冲突。 - [postgresql]
缩小了在反射具有当前搜索路径中模式的外键引用表时所做的假设;只有当显式模式与引用表的模式实际匹配时,才会将显式模式应用于引用表。先前假定“当前”模式与完整搜索路径是同义词。
参考:#2249
mysql
- [mysql]
CREATE TABLE 将在 CHARSET 后放置 COLLATE 选项,这似乎是 MySQL 关于其是否实际工作的任意规则的一部分。也适用于 0.6.9 版本。
参考:#2225 - [mysql]
向 Index 构造添加了 mysql_length 参数,指定索引的“length”。
参考:#2293
sqlite
- [sqlite]
确保无论是否使用 C 扩展,从数据库解析的非法日期/时间/日期时间字符串都会引发相同的 ValueError。
mssql
- [mssql]
更改以尝试支持 FreeTDS 0.91 与 Pyodbc。当检测到 FreeTDS 0.91 时,字符串绑定将作为 Python unicode 对象发送,并且在检测到表时使用 CAST(? AS NVARCHAR)。然而,我会继续将 Pyodbc + FreeTDS 0.91 的行为描述为相当糟糕,仍然有许多查询(例如在反射中使用的查询)在 Linux 上导致核心转储,在 OSX 上根本无法使用,MemoryErrors 丰富,而且对 Unicode 的支持完全破碎。
参考:#2273 - [mssql]
当将标量选择与值进行比较时,= /!= 的行为将不再在 0.8 版本中产生 IN / NOT IN;这种行为有点过于武断(如果要发出 IN,请使用in_()),现在会发出弃用警告。要立即获得 0.8 版本的行为并消除警告,可以在www.sqlalchemy.org/docs/07/dialects/mssql.html#scalar-select-comparisons给出的编译器配方中覆盖 visit_binary() 的行为。
参考:#2277 - [mssql]
“0” 被接受为 limit() 的参数,这将产生“TOP 0”。
参考:#2222
oracle
- [oracle]
修复了 zxjdbc 方言的 ReturningResultProxy。从 0.6 版本开始的退化。
参考:#2272 - [oracle]
String 类型现在在 Oracle 上生成 VARCHAR2,这是推荐的默认 VARCHAR。在 Oracle 方言中还添加了显式的 VARCHAR2 和 NVARCHAR2。使用 NVARCHAR 仍然生成“NVARCHAR2” - 在 Oracle 上没有“NVARCHAR” - 这仍然是“大写类型总是给出确切内容”的政策的轻微破坏。VARCHAR 仍然生成“VARCHAR”,遵循该政策。如果 Oracle 曾经定义“VARCHAR”为他们声称的不同内容(在我看来永远不会发生),该类型将可用。
参考:#2252
杂项
- [types]
在基本 Float 类型之外的额外关键字参数“precision”和“asdecimal”将被忽略;在此处添加了弃用警告和额外文档,相关于
参考:#2258 - [ext]
SQLSoup 将不包含在 SQLAlchemy 的 0.8 版本中;虽然有用,但我们希望将 SQLAlchemy 本身集中在一个 ORM 使用范例上。SQLSoup 希望很快会被第三方项目取代。
参考:#2262 - [扩展]
为 AssociationProxy 添加了 local_attr、remote_attr、attr 访问器,提供了在类级别快速访问代理属性的功能。
参考:#2236 - [扩展]
更改了关联代理字典上的 update()方法,采用了鸭子类型的方法,即检查“键”,以区分 update({})和 update((a, b))。以前,传递具有元组作为键的字典会被误解为序列。
参考:#2275
0.7.2
发布日期:2011 年 7 月 31 日 星期日
ORM
- [ORM]
功能增强:现在,连接和子查询加载将遍历已经存在的相关对象和集合,以查找未填充的属性,贯穿定义的急加载范围,以便通过映射或查询选项指定的急加载无条件地发生在整个深度上,填充尚未填充的内容。以前,如果已经存在相关对象或集合,此遍历将停止,导致不一致的行为(尽管会节省已加载图的加载/循环)。对于子查询加载,这意味着子查询加载发出的额外 SELECT 语句将无条件调用,无论现有图形的多少(因此有争议)。当查询是属性启动的延迟加载的结果时,以前的“停止”行为仍然有效,否则当重复遇到相同的相关对象时,“N+1”风格的集合迭代可能变得不必要昂贵。还有一个尚未公开的生成 Query 方法 _with_invoke_all_eagers(),选择旧/新行为
参考:#2213 - [ORM]
在 ORM 中重新设计了“替换遍历”,因为它会将可选择的内容更改为针对事物的别名(即子句适配),包括修复了针对连接表结构的多层嵌套 any()/has()构造的问题。
参考:#2195 - [ORM]
修复了一个错误,即在 relationship()上从一个连接到自身的 joined-inh 结构上使用 query.join() + aliased=True,并且在子表上具有连接条件时,会不适当地将主实体转换为连接实体。也在 0.6.9 中。
参考:#2234 - [ORM]
修复了从 0.6 中的回归,其中 Session.add()针对包含集合中的 None 的对象会引发内部异常。将此恢复为 0.6 的行为,即接受 None,但显然不会持久化任何内容。理想情况下,存在 None 的集合或在 append()上的集合至少应发出警告,这将在 0.8 中考虑。
参考:#2205 - [orm]
在无法定位行的对象上加载延迟属性会引发 ObjectDeletedError,而不是稍后失败;改进了 ObjectDeletedError 中的消息,包括除了简单的“删除”之外的其他条件。
参考:#2191 - [orm]
修复了从 0.6 中的回归,其中对一些基于 relationship()的属性执行 get history 操作时,当 lazyload 会发出时会失败;在某些条件下,这可能在 flush()中触发。感谢提交了这个伟大测试的用户。
参考:#2224 - [orm]
修复了仅在 Python 3 中明显的 bug,即在 flush 期间对持久性+挂起对象进行排序会产生非法比较,如果持久性对象的主键不是单个整数。也在 0.6.9 中。
参考:#2228 - [orm]
修复了一个 bug,即 query.join()使用的源子句在针对将多个实体组合在一起的列表达式时会不一致。也在 0.6.9 中。
参考:#2197 - [orm]
修复了一个 bug,即如果映射类重新定义了 hash()或 eq()为非标准内容,这是一个受支持的用例,因为 SQLA 不应该查询这些内容,那么如果该类是“复合”(即非单实体)结果集的一部分,这些方法将被查询。也在 0.6.9 中。
参考:#2215 - [orm]
向 Mapper 添加了公共属性“.validators”,这是所有已使用@validates 装饰器装饰的属性的不可变字典视图。感谢 Stefano Fontanelli
参考:#2240 - [orm]
修复了一个微妙的 bug,导致 SQL 在以下情况下崩溃:column_property()针对子查询 + joinedload + LIMIT +按列属性排序。也在 0.6.9 中。
参考:#2188 - [orm]
由 with_parent 生成的连接条件以及针对父级使用“dynamic”关系时将生成唯一的 bindparams,而不是错误地重复相同的 bindparam。也在 0.6.9 中。
参考:#2207 - [orm]
将“仅列”检查添加到 mapper.polymorphic_on 中,与接收 relationship.order_by、foreign_keys、remote_side 等用户参数时使用的检查相同。 - [orm]
修复了比较列表达式和 Query()的 bug,该比较不会调用 as_scalar()来在基础 SELECT 语句上生成标量子查询,方式类似于如果在 Query().subquery()上调用它时发生的情况。
参考:#2190 - [orm]
修复了声明性 bug,当一个类继承自同名的超类时,由于在 _decl_class_registry 中不必要地查找名称,会导致失败。
参考:#2194 - [orm]
修复了 Query 中的“无语句条件”断言,该断言在调用 from_statement()之后调用生成方法时会尝试引发异常。也适用于 0.6.9。
参考:#2199
示例
- [示例]
修复了示例/版本控制测试运行程序,不再依赖 SQLAlchemy 测试库,必须从示例/版本控制中运行 nosetests 以解决 setup.cfg 导致的问题。 - [示例]
调整示例/版本控制以在多层继承情况下选择正确的外键。 - [示例]
修复了属性分片示例,以正确检查 0.7 风格中的绑定参数可调用性。
engine
- [引擎]
由 Connection.begin()提供的上下文管理器在提交失败时会执行 rollback(),不仅在发生异常时。 - [引擎]
在 Python 2.6 及以上版本中使用 urllib.parse_qsl(),不再发出有关 cgi.parse_qsl()的弃用警告。
参考:#1682 - [引擎]
添加了 mixin 类 sqlalchemy.ext.DontWrapMixin。在语句执行的上下文中发生时,此类型的用户定义异常永远不会在 StatementException 中包装。 - [引擎]
StatementException 包装将在消息中显示原始异常类。 - [引擎]
连接失败会引发 dbapi.Error 的错误将转发到 dialect.is_disconnect(),如果方言知道这是一种可能的“可重试”条件,则设置“connection_invalidated”标志。目前只有 Oracle ORA-01033 实现。
参考:#2201
sql
- [sql]
修复了两个关于可选择的列对应的微妙错误,一个是相同的标记子查询重复,另一个是当标签已被“分组”并丢失时。影响。
参考:#2188
模式
- [模式]
新特性:对所有类型增加了with_variant()方法。产生一个 Variant()实例,这是一个特殊的 TypeDecorator,根据当前使用的方言选择不同类型的用法。
参考:#2187 - [模式]
当 ForeignKeyConstraint 引用父级中不存在的列名时,添加了一个信息性错误消息。也适用于 0.6.9。 - [模式]
修复了旧的 append_ddl_listener()函数适应错误,通过到表事件的意外**kw。表不得到 kws,0.6 中的 MetaData 事件将得到“tables=somecollection”,这种行为得到保留。
引用:#2206 - [schema]
修复了在表上检测“autoincrement”时的错误,如果类型没有“亲和性”值,特别是当在网站上使用 TypeEngine 作为“impl”的 UUID 示例时会发生这种情况。 - [schema]
为 TypeEngine 对象添加了改进的 repr(),它只会显示位置参数或偏离默认值的 kwargs。
引用:#2209
postgresql
- [postgresql]
添加了新的“postgresql_ops”参数到 Index,允许为索引列指定 PostgreSQL 操作符类。由 Filip Zyzniewski 提供。
引用:#2198
mysql
- [mysql]
修复了 OurSQL 方言,在 XA 命令中使用 ansi-neutral 引号符“’”而不是‘”’的错误。也在 0.6.9 中。
引用:#2186
sqlite
- [sqlite]
SQLite 方言不再从反映的默认值中去除引号,从而允许往返 CREATE TABLE 工作。这与其他方言一致,它们也保留默认值的精确形式。
引用:#2189
mssql
- [mssql]
调整了 pyodbc 方言,如果检测到“Easysoft”unix 驱动程序,则绑定值将作为字节而不是 unicode 传递。这与 FreeTDS 发生的行为相同。在某些情况下,Easysoft 似乎会导致 segfault,如果传递 Python unicode。
oracle
- [oracle]
添加了 ORA-00028 到断开连接代码中,使用 cx_oracle _Error.code 来获取代码,也在 0.6.9 中。
引用:#2200 - [oracle]
添加了 ORA-01033 到断开连接代码中,它可以在连接事件中捕获。
引用:#2201 - [oracle]
修复了 oracle.RAW 类型,它未生成正确的 DDL。也在 0.6.9 中。
引用:#2220 - [oracle]
添加了 CURRENT 到保留字列表中。也在 0.6.9 中。
引用:#2212 - [oracle]
修复了可变扩展中的错误,其中如果一个映射中两次使用相同的类型,则第一个之后的属性不会被检测。 - [oracle]
修复了可变扩展中的错误,其中如果设置为 None 或非对应类型,则会引发错误。现在接受 None,将 None 分配给所有属性,非法值引发 ValueError。
orm
- [orm]
功能增强:现在,对已经存在的相关对象和集合进行 joined 和子查询加载,以搜索未填充的属性,这是在定义了急加载的范围内进行的,因此通过映射或查询选项指定的急加载将无条件地对整个深度进行加载,填充尚未填充的内容。之前,如果已经存在相关对象或集合,则此遍历将停止,导致不一致的行为(尽管对于已加载的图表会节省加载/循环)。对于子查询加载,这意味着子查询加载发出的额外 SELECT 语句将无条件调用,无论现有图形的多少(因此引发了争议)。当查询是由属性启动的懒加载的结果时,先前的“停止”行为仍然有效,否则当重复遇到相同的相关对象时,“N+1”样式的集合迭代可能会变得不必要地昂贵。还有一个尚未公开的生成性 Query 方法 _with_invoke_all_eagers(),它选择旧/新行为。
参考:#2213 - [orm]
对 ORM 中的“替换遍历”进行了重新设计,因为它会修改为针对事物的别名的可选择性(即子句适配),包括对针对加入表结构的多重嵌套 any()/has() 构造的修复。
参考:#2195 - [orm]
修复了一个错误,即在 relationship() 中从一个关联到自身的 joined-inh 结构的子表上执行 query.join() + aliased=True 时,会不适当地将主实体转换为已加入的实体。也适用于 0.6.9 版本。
参考:#2234 - [orm]
修复了 0.6 版本中的一个退化,即针对一个包含空集合的对象进行 Session.add() 操作会引发内部异常的问题。将此恢复为 0.6 版本的行为,即接受空集合,但显然不会持久化任何内容。理想情况下,包含 None 的集合或在 append() 时应至少发出警告,这将在 0.8 版本中考虑。
参考:#2205 - [orm]
在找不到行的对象上加载延迟属性时,会引发 ObjectDeletedError 而不是稍后失败;改进了 ObjectDeletedError 中的消息,以包括除了简单的“删除”之外的其他条件。
参考:#2191 - [orm]
修复了 0.6 版本中的一个退化,在某些基于 relationship() 的属性上进行 get history 操作时,当懒加载会发出时会失败;这可能会在某些条件下在 flush() 中触发。感谢提交了此问题的出色测试的用户。
参考:#2224 - [orm]
修复了仅在 Python 3 中明显的 bug,在刷新期间对持久性+挂起对象进行排序会产生非法比较,如果持久对象的主键不是单个整数。同时也在 0.6.9 中修复。
参考:#2228 - [orm]
修复了一个 bug,即 query.join()使用的源子句在针对将多个实体组合在一起的列表达式时会不一致。同时也在 0.6.9 中修复。
参考:#2197 - [orm]
修复了一个 bug,即如果映射类重新定义了 hash()或 eq()为非标准内容,这是一个受支持的用例,因为 SQLA 不应该查询这些方法,如果类是复合(即非单实体)结果集的一部分,这些方法将被查询。同时也在 0.6.9 中修复。
参考:#2215 - [orm]
向 Mapper 添加了公共属性“.validators”,这是所有已使用@validates 装饰器装饰的属性的不可变字典视图。由 Stefano Fontanelli 提供。
参考:#2240 - [orm]
修复了一个微妙的 bug,导致如果发生了:对子查询的列属性(column_property()) + joinedload + LIMIT + 按列属性排序,SQL 会出现问题。同时也在 0.6.9 中修复。
参考:#2188 - [orm]
由 with_parent 生成的连接条件以及对父项使用“dynamic”关系时会生成唯一的 bindparams,而不是错误地重复相同的 bindparam。同时也在 0.6.9 中修复。
参考:#2207 - [orm]
向 mapper.polymorphic_on 添加了与 relationship.order_by、foreign_keys、remote_side 等接收用户参数时使用的相同“仅列”检查。 - [orm]
修复了一个 bug,使得对列表达式与 Query()进行比较时不会调用底层 SELECT 语句上的 as_scalar()方法来生成标量子查询,这种情况发生在如果你在 Query().subquery()上调用它时发生。
参考:#2190 - [orm]
修复了一个声明性 bug,在此 bug 中,从具有相同名称的超类继承的类将由于不必要地在 _decl_class_registry 中查找名称而失败。
参考:#2194 - [orm]
修复了在调用 from_statement()之后调用生成方法会尝试引发“无语句条件”断言的 Query 中的 bug。同时也在 0.6.9 中修复。
参考:#2199
示例
- [示例]
修复了示例/版本化测试运行程序,不再依赖于 SQLAlchemy 测试库,nosetests 必须在示例/版本化目录中运行以避免 setup.cfg 破坏它。 - [示例]
对示例/版本化进行微调以在多级继承情况下选择正确的外键。 - [示例]
修复了属性 shard 示例,以正确检查 0.7 风格中的绑定参数可调用。
engine
- [engine]
Connection.begin()提供的上下文管理器如果提交失败,将执行 rollback(),不仅在发生异常时执行。 - [engine]
在 Python 2.6 及以上版本中使用 urllib.parse_qsl(),不会有关于 cgi.parse_qsl()的弃用警告。
参考:#1682 - [engine]
添加了 mixin 类 sqlalchemy.ext.DontWrapMixin。当用户定义的此类型的异常在语句执行上下文中发生时,它们永远不会被包装在 StatementException 中。 - [engine]
StatementException 包装将在消息中显示原始异常类。 - [engine]
连接失败时引发 dbapi.Error 的错误将转发到 dialect.is_disconnect(),如果方言知道这是一个可能的“可重试”条件,则设置“connection_invalidated”标志。目前仅实现了 Oracle ORA-01033。
参考:#2201
sql
- [sql]
修复了两个涉及可选择的列对应的微妙 bug,一个是重复使用相同标记的子查询,另一个是标记已被“分组”且丢失自身。影响。
参考:#2188
schema
- [schema]
新功能:在所有类型上添加了 with_variant()方法。生成 Variant()的实例,这是一个特殊的 TypeDecorator,根据使用的方言选择不同类型的用法。
参考:#2187 - [schema]
当 ForeignKeyConstraint 引用父级中未找到的列名时,添加了一个信息性错误消息。也适用于 0.6.9 版本。 - [schema]
修复了旧的 append_ddl_listener()函数适配的 bug,该函数将意外地将**kw 传递给 Table 事件。Table 不接收 kw 参数,0.6 版本中的 MetaData 事件将接收“tables=somecollection”,此行为得以保留。
参考:#2206 - [schema]
修复了 Table 上“autoincrement”检测的 bug,如果类型没有“affinity”值,则会失败,特别是在使用 TypeEngine 作为“impl”的站点上使用 UUID 示例时会发生这种情况。 - [schema]
为 TypeEngine 对象添加了改进的 repr(),只显示构造函数参数,这些参数是位置参数或与默认值不同的 kwargs。
参考:#2209
postgresql
- [postgresql]
为 Index 添加了新的“postgresql_ops”参数,允许为索引列指定 PostgreSQL 操作符类。感谢 Filip Zyzniewski。
参考:#2198
mysql
- [mysql]
修复了 OurSQL 方言,使用 ansi-neutral 引号符“’”代替‘”’来执行 XA 命令。也适用于 0.6.9 版本。
参考:#2186
sqlite
- [sqlite]
SQLite 方言不���剥离反射默认值的引号,允许往返 CREATE TABLE 正常工作。这与其他方言一致,它们也保持默认值的确切形式。
参考:#2189
mssql
- [mssql]
调整了 pyodbc 方言,如果检测到“Easysoft” unix 驱动程序,则绑定值将作为字节而不是 Unicode 传递。这与 FreeTDS 发生的行为相同。在某些情况下,Easysoft 似乎会在传递 Python Unicode 时导致段错误。
oracle
- [oracle]
将 ORA-00028 添加到断开连接代码中,使用 cx_oracle _Error.code 来获取代码。也适用于 0.6.9 版本。
参考:#2200 - [oracle]
将 ORA-01033 添加到断开连接代码中,可以在连接事件中捕获。
参考:#2201 - [oracle]
修复了未生成正确 DDL 的 oracle.RAW 类型。也适用于 0.6.9 版本。
参考:#2220 - [oracle]
将 CURRENT 添加到保留字列表中。也适用于 0.6.9 版本。
参考:#2212 - [oracle]
修复了可变扩展中的错误,如果在一个映射中两次使用相同类型,则第一个之后的属性将不会被激活。 - [oracle]
修复了可变扩展中的错误,如果设置为 None 或非对应类型,则会引发错误。现在接受 None,将 None 分配给所有属性,非法值引发 ValueError。
0.7.1
发布日期:2011 年 6 月 5 日星期日
通用
- [general]
为 Python bug 7511 添加了一个解决方法,在 Windows 64 位 + VC express 上,C 扩展构建失败不会引发适当的异常。
参考:#2184
orm
- [orm]
“delete-orphan”级联现在允许在自引用关系上使用 - 自 SQLA 0.7 以来不再在 ORM 级别强制执行“父级没有子级”的检查;此检查留给外键的可空性。相关内容
参考:#1912 - [orm]
修复了新的“mutable”扩展,以正确传播事件到子类;也不为子类创建多个事件侦听器。
参考:#2180 - [orm]
修改了在刷新时未检测到“identity”键时出现的消息文本,包括常见原因,即列未正确设置以检测自增。也适用于 0.6.8 版本。
参考:#2170 - [orm]
修复了事务级别的“deleted”集合不会清除已删除状态的错误,如果它们后来变为瞬态,则会引发错误。也适用于 0.6.8 版本。
参考:#2182
engine
- [engine]
废弃 Connection/Engine 上从未被广泛知晓且多余的基于模式/SQL 的方法:reflecttable()、create()、drop()、text()、engine.func - [engine]
调整了 RowProxy 结果行的 contains()方法,使其在内部不会生成异常;无论列构造是否可以强制转换为字符串,NoSuchColumnError()也会生成其消息。也在 0.6.8 中。
参考:#2178
sql
- [sql]
修复了 metadata.reflect(bind)会关闭作为绑定参数传递的 Connection 的 bug。从 0.6 开始的回归。 - [sql]
简化了 Select 确定其‘.c’集合中内容的过程。行为完全相同,只是传递给 select([])的原始 ClauseList()(这本来就不是一个文档化的情况)现在将被扩展为其各个列元素,而不是被忽略。
postgresql
- [postgresql]
关于数字数组、MATCH 运算符的一些单元测试修复。修复了潜在的浮点不准确问题,并且目前某些 MATCH 运算符的测试仅在 EN 定向的区域设置下执行。也在 0.6.8 中。
参考:#2175
mysql
- [mysql]
单元测试在安装在 Windows 上的 MySQL 上通过率达到 100%。 - [mysql]
移除了在反射具有混合大小写名称的 MySQL 上的表时会失败的“调整大小写”步骤。经过一些对 Windows MySQL 服务器的实验后,确定这一步骤并没有真正帮助解决问题;MySQL 在非 Windows 平台上也不会返回带有正确大小写的 FK 名称,移除这一步骤至少使反射的行为更像在其他操作系统上的行为。这里考虑过发出警告,但很难确定在什么条件下可以发出这样的警告,所以暂时搁置了这个问题 - 而是添加了一些文档。
参考:#2181 - [mysql]
如果使用 MySQLdb 且 DBAPI 不提供 constants.CLIENT 模块,则 supports_sane_rowcount 将设置为 False。
sqlite
- [sqlite]
当调用“PRAGMA read_uncommitted”以确定连接时的当前隔离模式并默认为 SERIALIZABLE 时,接受来自 cursor.fetchone()的 None;这是为了支持 SQLite 版本 3.3.0 之前不具备此功能的情况。
参考:#2173
一般
- [general]
为 Python bug 7511 添加了一个解决方法,其中 C 扩展构建失败不会在 Windows 64 位+ VC express 上引发适当的异常。
参考:#2184
orm
- [orm]
”delete-orphan”级联现在允许在自引用关系上使用 - 这是因为 SQLA 0.7 不再在 ORM 级别强制执行“父项没有子项”的检查;此检查留给外键的可空性。相关的
参考:#1912 - [orm]
修复了新的“mutable”扩展正确传播事件到子类的问题;也不会为子类创建多个事件监听器。
参考:#2180 - [orm]
修改了在刷新时未检测到“identity”键时出现的消息文本,以包括列未正确设置以正确检测自增的常见原因;也适用于 0.6.8 版本。
参考:#2170 - [orm]
修复了事务级别的“已删除”集合不会清除已删除状态的 bug,如果后来变为瞬态,则会引发错误。也适用于 0.6.8 版本。
参考:#2182
引擎
- [engine]
在 Connection/Engine 上弃用了从未被广泛知晓且多余的基于模式/SQL 的方法:reflecttable()、create()、drop()、text()、engine.func - [engine]
调整了 RowProxy 结果行的 contains()方法,使其在内部不生成异常;无论列构造是否可以强制转换为字符串,NoSuchColumnError()也将生成其消息。也适用于 0.6.8 版本。
参考:#2178
sql
- [sql]
修复了 metadata.reflect(bind)会关闭传递为绑定参数的 Connection 的 bug。从 0.6 版本开始的回归。 - [sql]
简化了 Select 确定其‘.c’集合中内容的过程。行为完全相同,只是传递给 select([])的原始 ClauseList()(这本来就不是一个文档化的情况)现在将被扩展为其各个列元素,而不是被忽略。
postgresql
- [postgresql]
修复了关于数字数组、MATCH 运算符的一些单元测试问题。修复了潜在的浮点不精确性问题,并且目前某些 MATCH 运算符的测试仅在 EN 定向的区域设置下执行。也适用于 0.6.8 版本。
参考:#2175
mysql
- [mysql]
单元测试在安装在 Windows 上的 MySQL 上 100%通过。 - [mysql]
移除了在 Windows 上使用混合大小写名称的 MySQL 反射表时会失败的“调整大小写”步骤。经过一些对 Windows MySQL 服务器的实验后,确定这一步骤并没有真正帮助解决问题;MySQL 在非 Windows 平台上也不会返回正确大小写的 FK 名称,移除这一步骤至少使反射表的行为更像在其他操作系统上的行为。考虑过在此处发出警告,但很难确定在什么条件下可以发出这样的警告,因此暂时搁置了这个想法 - 只是添加了一些文档。
参考:#2181 - [mysql]
如果使用 MySQLdb 并且 DBAPI 不提供 constants.CLIENT 模块,则 supports_sane_rowcount 将设置为 False。
sqlite
- [sqlite]
在调用“PRAGMA read_uncommitted”以确定连接时的当前隔离模式并默认为 SERIALIZABLE 时,接受来自 cursor.fetchone()的 None;这是为了支持 SQLite 版本 3.3.0 之前没有此功能的情况。
参考:#2173
SqlAlchemy 2.0 中文文档(六十六)(5)https://developer.aliyun.com/article/1560813