SQLAlchemy 2.0 文档
变更和迁移
- SQLAlchemy 2.0 - 主要迁移指南
- SQLAlchemy 2.0 的新特性?
- 2.0 更新日志
- 1.4 更新日志
- 1.3 更新日志
- 1.2 更新日志
- 1.1 更新日志
- 1.0 更新日志
- 0.9 更新日志¶
- 0.8 更新日志
- 0.7 更新日志
- 0.6 更新日志
- 0.5 更新日志
- 0.4 更新日志
- 0.3 更新日志
- 0.2 更新日志
- 0.1 更新日志
- SQLAlchemy 1.4 的新特性?
- SQLAlchemy 1.3 的新特性?
- SQLAlchemy 1.2 的新特性?
- SQLAlchemy 1.1 的新特性?
- SQLAlchemy 1.0 的新特性?
- SQLAlchemy 0.9 的新特性?
- SQLAlchemy 0.8 的新特性?
- SQLAlchemy 0.7 的新特性?
- SQLAlchemy 0.6 的新特性?
- SQLAlchemy 0.5 的新特性?
- SQLAlchemy 0.4 的新特性?
项目版本
0.9 更新日志¶
0.9.10¶
发布日期:2015年7月22日orm¶
[orm] [特性] ¶
在
Query.column_descriptions返回的字典中添加了一个新的条目"entity"。此条目引用表达式引用的主要 ORM 映射类或别名类。与现有的"type"条目相比,它将始终是一个映射实体,即使是从列表达式中提取的,如果给定的表达式是纯核心表达式,则为 None。另请参阅 #3403,该条目修复了此功能中的一个回归,该回归在 0.9.10 中未发布,但在 1.0 版本中已发布。参考: #3320
[orm] [缺陷] ¶
当使用
Query.update()或Query.delete()方法时,Query不支持连接、子选择或特殊的 FROM 子句;如果调用了Query.join()或Query.select_from()等方法,则会发出警告,而不是静默忽略这些字段。从 1.0.0b5 开始,这将引发错误。参考: #3349
[orm] [缺陷] ¶
修复了在多个嵌套的
Session.begin_nested()操作中,状态跟踪无法传播在内部保存点内更新的对象的“脏”标志的缺陷,这样,如果封闭的保存点被回滚,则该对象将不属于已过期的状态,因此不会恢复到其数据库状态。参考: #3352
引擎¶
[引擎] [缺陷] ¶
将字符串值
"none"添加到Pool.reset_on_return参数接受的值中,作为None的同义词,以便字符串值可以用于所有设置,从而允许像engine_from_config()这样的实用程序可以毫无问题地使用。参考: #3375
sql¶
[sql] [特性] ¶
添加了对
Insert.from_select()内部的 SELECT 使用的 CTE 的官方支持。此行为在 0.9.9 之前意外地工作,当它由于 #3248 的一部分不相关的更改而不再工作时。请注意,这是在 INSERT 之后,SELECT 之前的 WITH 子句的呈现;在 INSERT、UPDATE、DELETE 的顶层呈现的 CTE 的全部功能是针对更高版本的新功能。参考: #3418
[sql] [缺陷] ¶
修复了使用命名约定的
MetaData对象无法与 pickle 正确工作的问题。该属性被跳过,导致如果使用未 pickle 的MetaData对象来基于其他表,则会导致不一致和失败。参考: #3362
postgresql¶
mysql¶
sqlite¶
测试¶
杂项¶
[缺陷] [ext] ¶
修复了当使用扩展属性检测系统时,如果使用无效输入(例如整数)调用
class_mapper()且该输入恰好不可弱引用时,不会引发正确异常的缺陷。参考: #3408
[缺陷] [ext] ¶
修复了 0.9.9 中的回归,其中
as_declarative()符号已从sqlalchemy.ext.declarative命名空间中删除。参考: #3324
0.9.9¶
发布日期:2015年3月10日orm¶
[orm] [特性] ¶
添加了新的参数
Session.connection.execution_options,该参数可用于在首次检出Connection时,在事务开始之前设置执行选项。这用于在事务开始之前在连接上设置隔离级别等选项。另请参阅
设置事务隔离级别 / DBAPI 自动提交 - 新的文档部分详细介绍了使用会话设置事务隔离的最佳实践。
参考: #3296
[orm] [特性] ¶
添加了新的方法
Session.invalidate(),其功能类似于Session.close(),但也会在所有连接上调用Connection.invalidate(),从而保证它们不会返回到连接池。这在例如处理 gevent 超时等情况下很有用,在这种情况下,即使对于回滚,继续使用连接也是不安全的。[orm] [缺陷] ¶
修复了 ORM 对象比较中的缺陷,其中如果源是别名类,或者如果查询需要由于别名连接或多态查询而对表达式应用特殊别名,则多对一
!= None的比较将失败;还修复了在将多对一与对象状态进行比较的情况下,如果查询需要由于别名连接或多态查询而应用特殊别名,则会失败的缺陷。参考: #3310
[orm] [缺陷] ¶
修复了在
Session的after_rollback()处理程序错误地将状态添加到该Session内的处理程序中时,内部断言将失败的缺陷,并且警告和删除此状态的任务(由 #2389 建立)尝试继续。参考: #3309
[orm] [缺陷] ¶
修复了当使用未知 kw 参数调用
Query.join()时引发 TypeError 的缺陷,原因是格式错误而引发了其自身的 TypeError。拉取请求由 Malthe Borch 提供。[orm] [缺陷] ¶
修复了延迟加载 SQL 构造中的缺陷,由此,在自引用连接的“指向自身的列”样式中多次引用同一“本地”列的复杂 primaryjoin 将不会在所有情况下都被替换。此处确定替换的逻辑已被重新设计为更开放。
参考: #3300
[orm] [缺陷] ¶
“通配符”加载器选项,特别是通过
load_only()选项设置的选项,以涵盖所有未明确提及的属性,现在考虑了给定实体的超类(如果该实体使用继承映射进行映射),以便超类中的属性名称也从加载中省略。此外,多态鉴别器列无条件地包含在列表中,就像主键列一样,这样即使设置了 load_only(),子类型的多态加载也会继续正常工作。参考: #3287
[orm] [缺陷] [pypy] ¶
修复了如果在
Query开始时在获取结果之前抛出异常(特别是在无法形成行处理器时),光标将保持打开状态并挂起结果,并且实际上不会关闭的缺陷。这通常仅在像 PyPy 这样的解释器上才是一个问题,在 PyPy 中,光标不会立即被 GC,并且在某些情况下可能会导致事务/锁打开的时间超过预期。参考: #3285
[orm] [缺陷] ¶
修复了一个泄漏,该泄漏会在不受支持且强烈不推荐的用例中发生,即多次替换固定映射类上的关系,引用任意数量不断增长的目标映射器。当旧关系被替换时,会发出警告,但是如果映射已用于查询,则旧关系仍将在某些注册表中被引用。
参考: #3251
[orm] [缺陷] [sqlite] ¶
修复了关于表达式突变的缺陷,当使用
Query从多个匿名列实体中选择时,可能会表现为 “无法找到列” 错误,这是针对 SQLite 查询时,SQLite 方言使用的 “连接重写” 功能的副作用。参考: #3241
[orm] [缺陷] ¶
修复了当使用
of_type()时,Query.join()和Query.outerjoin()到单继承子类的 ON 子句,如果设置了from_joinpoint=True标志,则不会呈现 ON 子句中的 “单表条件” 的缺陷。参考: #3232
示例¶
[示例] [缺陷] ¶
更新了 使用历史记录表进行版本控制 示例,以便重新映射映射列以匹配列名以及列的分组;特别是,这允许在同列名连接继承方案中显式分组的列以相同的方式在历史记录映射中进行映射,从而避免了在 0.9 系列中添加的关于此模式的警告,并允许相同的属性键视图。
[示例] [缺陷] ¶
修复了 examples/generic_associations/discriminator_on_association.py 示例中的一个缺陷,其中 AddressAssociation 的子类未被映射为 “单表继承”,从而导致在进一步尝试使用映射时出现问题。
引擎¶
[引擎] [特性] ¶
添加了新的用户空间访问器,用于查看事务隔离级别;
Connection.get_isolation_level(),Connection.default_isolation_level。[引擎] [缺陷] ¶
修复了
Connection和池中的缺陷,其中Connection.invalidate()方法或由于数据库断开连接而导致的失效,如果isolation_level参数已与Connection.execution_options()一起使用,则会失败;重置隔离级别的 “终结器” 将在不再打开的连接上调用。参考: #3302
[引擎] [缺陷] ¶
如果在
Transaction正在进行时,将isolation_level参数与Connection.execution_options()一起使用,则会发出警告;DBAPI 和/或 SQLAlchemy 方言(如 psycopg2、MySQLdb)可能会隐式回滚或提交事务,或者直到下一个事务才更改设置,因此这永远是不安全的。参考: #3296
sql¶
[sql] [缺陷] ¶
将
native_enum标志添加到Enum的__repr__()输出中,这在使用 Alembic autogenerate 时尤其重要。拉取请求由 Dimitris Theodorou 提供。[sql] [缺陷] ¶
修复了当使用
TypeDecorator实现的类型也是TypeDecorator时,当对使用此类型的对象使用任何类型的 SQL 比较表达式时,将失败并出现 Python 的 “无法创建一致的方法解析顺序 (MRO)” 错误。参考: #3278
[sql] [缺陷] ¶
修复了从 INSERT 语句(通过 values 子句或作为 “from select”)嵌入的 SELECT 中的列会污染 RETURNING 子句生成的结果集中使用的列类型的问题,当来自两个语句的列共享相同的名称时,会导致在检索返回行时可能出现错误或错误适配。
参考: #3248
schema¶
[schema] [缺陷] ¶
修复了 0.9 的外键设置系统中的缺陷,这样,当外键结合 “link_to_name=True” 和一个目标
Table使用时,用于将ForeignKey链接到其父级的逻辑可能会失败,该目标Table要到稍后才会接收其父列,例如在反射 + “useexisting” 场景中,如果目标列实际上具有与其名称不同的键值,则在列反射事件用于更改反射Column对象的 .key 以使 link_to_name 变得重要时,就会发生这种情况。还以类似的方式修复了在目标列具有不同的键并使用 link_to_name 引用时,通过 FK 传输列类型的支持。
postgresql¶
[postgresql] [特性] ¶
添加了对 PostgreSQL 索引的
CONCURRENTLY关键字的支持,使用postgresql_concurrently建立。拉取请求由 Iuri de Silvio 提供。另请参阅
[postgresql] [缺陷] ¶
修复了在使用 psycopg2 时,PostgreSQL UUID 类型与 ARRAY 类型结合使用的支持。psycopg2 方言现在使用 psycopg2.extras.register_uuid() 钩子,以便 UUID 值始终作为 UUID() 对象传递到/从 DBAPI。
UUID.as_uuid标志仍然被遵守,除了使用 psycopg2 时,当禁用此标志时,我们需要将返回的 UUID 对象转换回字符串。参考: #2940
[postgresql] [缺陷] ¶
添加了对使用 psycopg2 2.5.4 或更高版本时的
postgresql.JSONB数据类型的支持,该版本具有 JSONB 数据的原生转换,因此必须禁用 SQLAlchemy 的转换器;此外,新添加的 psycopg2 扩展extras.register_default_jsonb用于建立通过json_deserializer参数传递给方言的 JSON 反序列化器。还修复了 PostgreSQL 集成测试,这些测试实际上并没有往返 JSONB 类型,而不是 JSON 类型。拉取请求由 Mateusz Susik 提供。[postgresql] [缺陷] ¶
修复了在较旧的 psycopg2 版本 < 2.4.3 上注册 HSTORE 类型时 “array_oid” 标志的使用,这些版本不支持此标志,以及在 psycopg2 版本 < 2.5 上使用用户定义的
json_deserializer的原生 json 序列化器钩子 “register_default_json”,这些版本不包含原生 json。[postgresql] [缺陷] ¶
修复了 PostgreSQL 方言在渲染
Index中的表达式时会失败的错误,该表达式并非直接对应于表绑定的列;通常当text()构造是索引中表达式之一时;或者如果其中一个或多个表达式是这种表达式,则可能会误解表达式列表。参考: #3174
mysql¶
sqlite¶
misc¶
[错误] [ext] [py3k] ¶
修复了在 Py3K 下关联代理列表类无法正确解释切片的错误。 拉取请求由 Gilles Dartiguelongue 提供。
0.9.8¶
发布日期:2014 年 10 月 13 日orm¶
[orm] [错误] [引擎] ¶
修复了一个错误,该错误通常影响与 #3199 相同类型的事件类,当使用
named=True参数时。 某些事件将无法注册,而另一些事件将无法正确调用事件参数,通常发生在事件以某种其他方式“包装”以进行适配的情况下。“命名”机制已被重新安排,以不干扰内部包装函数期望的参数签名。参考: #3197
[orm] [错误] ¶
修复了一个错误,该错误影响许多类型的事件,特别是 ORM 事件以及引擎事件,其中对于那些监听器函数被包装的事件,使用相同参数重复调用
listen()的冗余调用的常用“去重”逻辑将失败。 断言将在 registry.py 中被命中。 此断言现在已集成到去重检查中,并额外提供了一种更简单的方法来全面检查去重。参考: #3199
[orm] [错误] ¶
修复了当复杂的自引用 primaryjoin 包含函数,同时指定了 remote_side 时会发出的警告;该警告会建议设置 “remote side”。 现在仅当 remote_side 不存在时才会发出警告。
参考: #3194
orm declarative¶
[orm] [声明式] [错误] ¶
修复了当
AbstractConcreteBase与声明__abstract__的子类结合使用时出现的“'NoneType' 对象没有属性 'concrete'” 错误。参考: #3185
engine¶
[engine] [错误] ¶
传递给
Engine的执行选项(通过create_engine.execution_options或Engine.update_execution_options())不会传递给用于在 “首次连接” 事件中初始化方言的特殊Connection;方言通常会在这个阶段执行自己的查询,并且此处不应应用当前可用的任何选项。 特别是,“autocommit” 选项导致在此初始连接中尝试自动提交,由于Connection的非标准状态,这将导致 AttributeError 失败。参考: #3200
[engine] [错误] ¶
用于确定 INSERT 或 UPDATE 受影响列的字符串键现在在用于“编译缓存”缓存键时进行排序。 这些键以前不是确定性排序的,这意味着相同的语句可能会在等效键上多次缓存,从而导致内存和性能方面的损失。
参考: #3165
sql¶
[sql] [错误] ¶
修复了 sql 包中相当多的 SQL 元素由于缺少
description属性而无法成功__repr__()的错误,当内部 AttributeError 随后重新调用__repr__()时,会导致递归溢出。参考: #3195
[sql] [错误] ¶
对表/索引反射进行了调整,如果索引报告的列未在表中找到,则会发出警告并跳过该列。 这可能会发生在某些特殊的系统列情况下,例如在 Oracle 中观察到的情况。
参考: #3180
[sql] [错误] ¶
修复了 CTE 中的错误,当一个 CTE 在语句中引用另一个别名 CTE 时,
literal_binds编译器参数不会始终正确传播。参考: #3154
[sql] [错误] ¶
修复了 0.9.7 回归,该回归由 #3067 与命名错误的单元测试结合引起,导致像
Boolean和Enum这样的所谓 “schema” 类型无法再被 pickle 序列化。
postgresql¶
[postgresql] [功能] [pg8000] ¶
为 pg8000 驱动程序添加了对 “合理的行数统计” 的支持,这主要适用于在 ORM 中使用版本控制时。 该功能基于正在使用的 pg8000 1.9.14 或更高版本进行版本检测。 拉取请求由 Tony Locke 提供。
[postgresql] [错误] ¶
重新审视了首次在 0.9.5 中修补的此问题,显然 psycopg2 的
.closed访问器不如我们假设的那么可靠,因此我们添加了对异常消息 “SSL SYSCALL error: Bad file descriptor” 和 “SSL SYSCALL error: EOF detected” 的显式检查,以检测是否为断开连接的情况。 我们将继续将 psycopg2 的 connection.closed 作为首要检查。参考: #3021
[postgresql] [错误] ¶
修复了 PostgreSQL JSON 类型无法持久化或渲染 SQL NULL 列值的错误,而是渲染了 JSON 编码的
'null'。 为了支持这种情况,更改如下:现在可以指定值
null(),这将始终导致语句中产生 NULL 值。添加了一个新的参数
JSON.none_as_null,当为 True 时,表示 PythonNone值应持久化为 SQL NULL,而不是 JSON 编码的'null'。
还修复了对于 psycopg2 以外的 DBAPI(即 pg8000),将 NULL 检索为 None 的问题。
参考: #3159
[postgresql] [错误] ¶
DBAPI 错误的异常包装系统现在可以容纳非标准的 DBAPI 异常,例如 psycopg2 TransactionRollbackError。 现在将使用
sqlalchemy.exc中最接近的可用子类引发这些异常,对于 TransactionRollbackError,则为sqlalchemy.exc.OperationalError。参考: #3075
[postgresql] [错误] ¶
修复了
array对象中的错误,其中与纯 Python 列表的比较将无法使用正确的数组构造函数。 拉取请求由 Andrew 提供。参考: #3141
[postgresql] [错误] ¶
为函数(例如
func构造)添加了受支持的FunctionElement.alias()方法。 以前,此方法的行为未定义。 当前行为模仿 pre-0.9.4 的行为,即函数被转换为具有给定别名名称的单列 FROM 子句,其中列本身是匿名命名的。参考: #3137
mysql¶
[mysql] [错误] [mysqlconnector] ¶
Mysqlconnector 从 2.0 版本开始,可能是 python 3 合并的副作用,现在即使在使用 “pyformat” 绑定参数格式时,也不希望百分号(例如用作模运算符和其他运算符)被加倍(此更改未在 Mysqlconnector 中记录)。 当检测模运算符应渲染为
%%还是%时,方言现在会检查 py2k 和 mysqlconnector 是否小于 2.0 版本。[mysql] [错误] [mysqlconnector] ¶
Unicode SQL 现在为 MySQLconnector 2.0 及更高版本传递;对于 Py2k 和 MySQL < 2.0,字符串被编码。
sqlite¶
mssql¶
oracle¶
misc¶
[错误] [声明式] ¶
修复了在某些外来最终用户设置中观察到的不太可能发生的竞争条件,其中声明式中检查 “重复类名” 的尝试会遇到与正在删除的某些其他类相关的未完全清理的弱引用;此处的检查现在确保 weakref 仍然引用一个对象,然后再进一步调用它。
参考: #3208
[错误] [ext] ¶
修复了排序列表中的错误,如果在集合替换事件期间 reorder_on_append 标志设置为 True,则项目的顺序会被打乱。 此修复确保排序列表仅影响与对象显式关联的列表。
参考: #3191
[错误] [ext] ¶
修复了
MutableDict未能实现update()字典方法的错误,因此无法捕获更改。 拉取请求由 Matt Chisholm 提供。[错误] [ext] ¶
修复了
MutableDict的自定义子类不会在 “coerce” 操作中显示,而是返回纯MutableDict的错误。 拉取请求由 Matt Chisholm 提供。[错误] [pool] ¶
修复了连接池日志记录中的错误,其中如果使用
logging.setLevel()而不是使用echo_pool标志设置日志记录,则不会发出 “连接已检出” 调试日志消息。 已添加测试以断言此日志记录。 这是在 0.9.0 中引入的回归。参考: #3168
0.9.7¶
发布日期:2014 年 7 月 22 日orm¶
[orm] [错误] [预加载] ¶
修复了 0.9.4 中发布的 #2976 引起的回归,其中沿连接的预加载链的 “外连接” 传播会错误地将兄弟连接路径上的 “内连接” 也转换为外连接,而只有后代路径才应接收 “外连接” 传播;此外,修复了相关的错误,即 “嵌套” 连接传播会在两个兄弟连接路径之间不适当地发生。
参考: #3131
[orm] [错误] ¶
修复了 0.9.0 中由于 #2736 引起的回归,其中
Query.select_from()方法不再正确设置Query对象的 “from entity”,因此后续的Query.filter_by()或Query.join()调用将无法在按字符串名称搜索属性时检查适当的 “from” 实体。[orm] [错误] ¶
query.update()/delete() 的 “evaluator” 不适用于多表更新,需要设置为 synchronize_session=False 或 synchronize_session='fetch';现在会发出警告。 在 1.0 中,这将升级为完全异常。
参考: #3117
[orm] [错误] ¶
修复了在保存点块中持久化、删除或主键更改的项目在外部事务回滚后不会参与恢复到其先前状态(不在会话中、在会话中、先前的 PK)的错误。
参考: #3108
[orm] [错误] ¶
修复了子查询预加载与
with_polymorphic()结合使用时的错误,子查询加载中实体和列的定位已针对这种类型的实体和其他实体进行了更精确的处理。参考: #3106
[orm] [错误] ¶
修复了涉及动态属性的错误,这再次是版本 0.9.5 中 #3060 的回归。 具有 lazy='dynamic' 的自引用关系会在刷新操作中引发 TypeError。
参考: #3099
engine¶
sql¶
[sql] [错误] ¶
修复了
Enum和其他SchemaType子类中的错误,其中类型与MetaData的直接关联会导致在MetaData上发出事件(如创建事件)时挂起。此更改也 向后移植 到:0.8.7
参考: #3124
[sql] [错误] ¶
修复了自定义运算符加
TypeEngine.with_variant()系统中的错误,其中将TypeDecorator与 variant 结合使用会在使用比较运算符时导致 MRO 错误。此更改也 向后移植 到:0.8.7
参考: #3102
[sql] [错误] ¶
修复了命名约定功能中的错误,其中使用包含
constraint_name的检查约束约定将强制所有Boolean和Enum类型也需要名称,因为这些类型隐式创建了约束,即使最终目标后端是不需要生成约束的后端(例如 PostgreSQL)。 这些特定约束的命名约定机制已重新组织,使得命名确定在 DDL 编译时完成,而不是在约束/表构造时完成。参考: #3067
[sql] [错误] ¶
修复了公用表表达式中的错误,由此,当 CTE 以某些方式嵌套时,位置绑定参数可能会以错误的最终顺序表示。
参考: #3090
[sql] [错误] ¶
修复了多值
Insert构造无法检查除给定的第一个值条目之外的后续值条目是否为文字 SQL 表达式的错误。参考: #3069
[sql] [错误] ¶
为 Python 版本 < 2.6.5 添加了 “str()” 步骤到 dialect_kwargs 迭代,解决了 “no unicode keyword arg” 错误,因为这些参数在某些反射过程中作为关键字参数传递。
参考: #3123
[sql] [错误] ¶
TypeEngine.with_variant()方法现在将接受类型类作为参数,该参数在内部转换为实例,使用与Column等其他构造长期建立的相同约定。参考: #3122
postgresql¶
[postgresql] [功能] ¶
为
ColumnOperators.match()运算符添加了 kw 参数postgresql_regconfig,允许为发出的to_tsquery()函数指定 “reg config” 参数。 拉取请求由 Jonathan Vanasco 提供。参考: #3078
[postgresql] [功能] ¶
通过
JSONB添加了对 PostgreSQL JSONB 的支持。 拉取请求由 Damian Dimmich 提供。[postgresql] [错误] [pg8000] ¶
修复了 0.9.5 中由新的 pg8000 隔离级别功能引入的错误,其中引擎级别的隔离级别参数会在连接时引发错误。
参考: #3134
mysql¶
sqlite¶
mssql¶
[mssql] [功能] ¶
为 SQL Server 2008 启用了 “多值插入”。 拉取请求由 Albert Cervin 提供。 还扩展了对 “IDENTITY INSERT” 模式的检查,以包括当标识键出现在语句的 VALUE 子句中时。
[mssql] [错误] ¶
将语句编码添加到 “SET IDENTITY_INSERT” 语句中,该语句在显式 INSERT 被插入到 IDENTITY 列中时操作,以支持 pyodbc + unix + py2k 等不支持 unicode 语句的驱动程序上的非 ASCII 表标识符。
此更改也 向后移植 到:0.8.7
[mssql] [错误] ¶
在 SQL Server pyodbc 方言中,修复了
description_encoding方言参数的实现,在结果集包含备用编码的名称的情况下,当未显式设置时,该参数会阻止正确解析 cursor.description。 今后应该不需要此参数。此更改也 向后移植 到:0.8.7
参考: #3091
[mssql] [错误] ¶
修复了 0.9.5 中由 #3025 引起的回归,其中用于确定 “默认 schema” 的查询在 SQL Server 2000 中无效。 对于 SQL Server 2000,我们回到方言的 “schema name” 参数的默认值,该参数是可配置的,但默认为 ‘dbo’。
参考: #3025
oracle¶
tests¶
[tests] [错误] ¶
修复了 “python setup.py test” 未正确调用 distutils 的错误,并且会在测试套件结束时发出错误。
misc¶
0.9.6¶
发布日期:2014年6月23日orm¶
0.9.5¶
发布日期:2014年6月23日orm¶
[orm] [功能] ¶
“primaryjoin” 模型已进一步扩展,以允许严格从单个列到自身的连接条件,通过某种 SQL 函数或表达式进行转换。这有点实验性,但第一个概念验证是“物化路径”连接条件,其中路径字符串使用 “like” 与自身进行比较。
ColumnOperators.like()运算符也已添加到可在 primaryjoin 条件中使用的有效运算符列表中。参考链接: #3029
[orm] [功能] ¶
添加了新的实用函数
make_transient_to_detached(),可用于制造行为类似于从会话加载然后分离的对象。不存在的属性被标记为过期,并且可以将对象添加到会话中,在会话中它将像持久对象一样运行。参考链接: #3017
[orm] [错误] ¶
修复了子查询预加载中的错误,其中跨多态子类边界的长链预加载与多态加载结合使用时,将无法在链中找到子类链接,从而在
AliasedClass上报错,提示缺少属性名称。此更改也 向后移植 到:0.8.7
参考链接: #3055
[orm] [错误] ¶
修复了 ORM 错误,其中
class_mapper()函数会屏蔽在映射器配置期间由于用户错误而应引发的 AttributeErrors 或 KeyErrors。对 attribute/keyerror 的捕获已变得更加具体,不包括配置步骤。此更改也 向后移植 到:0.8.7
参考链接: #3047
[orm] [错误] ¶
为继承映射器隐式地将其基于列的属性之一与其父级的属性组合在一起的情况添加了额外的检查,其中这些列通常不一定共享相同的值。这是通过 #1892 添加的现有检查的扩展;但是,这个新的检查仅发出警告,而不是异常,以允许可能依赖现有行为的应用程序。
参考链接: #3042
[orm] [错误] ¶
修改了
load_only()的行为,使得主键列始终添加到要 “取消延迟” 的列列表中;否则,ORM 无法加载行的标识。显然,可以延迟映射的主键,并且 ORM 将会失败,但这尚未更改。但是,由于 load_only 本质上是说 “延迟除 X 之外的所有内容”,因此主键列不应成为此延迟的一部分,这一点至关重要。参考链接: #3080
[orm] [错误] ¶
修复了所谓的 “行切换” 场景中出现的一些边缘情况,其中 INSERT/DELETE 可以转换为 UPDATE。在这种情况下,设置为 None 的多对一关系,或者在某些情况下设置为 None 的标量属性,可能不会被检测为值的净变化,因此 UPDATE 不会重置前一行上的内容。这是由于属性历史记录的工作方式在隐式地假设 None 对于先前未设置的属性实际上不是 “更改” 方面的一些尚未解决的副作用。另请参阅 #3061。
注意
此更改已在 0.9.6 中回滚。完整的修复将在 SQLAlchemy 1.0 版本中提供。
参考链接: #3060
[orm] [错误] ¶
与 #3060 相关,对工作单元进行了调整,使得在要删除的自引用对象图的情况下,相关多对一对象的加载稍微更积极;相关对象的加载是为了在未设置 passive_deletes 时帮助确定正确的删除顺序。
[orm] [错误] ¶
修复了 SQLite 连接重写中的错误,其中由于重复而匿名化的列名不会在子查询中正确重写。这将影响任何类型的子查询 + 连接的 SELECT 查询。
参考链接: #3057
[orm] [错误] [sql] ¶
修复了 #2804 中新增强的布尔强制转换,其中 “where” 和 “having” 的新规则对于
select()构造的 “whereclause” 和 “having” 关键字参数不起作用,这也是Query使用的,因此在 ORM 中也不起作用。参考链接: #3013
示例¶
[示例] [功能] ¶
添加了一个新示例,演示了物化路径,使用了最新的关系功能。示例由 Jack Zhou 提供。
引擎¶
[引擎] [错误] ¶
修复了当引擎首次连接并执行其初始检查时发生 DBAPI 异常,并且该异常不是断开连接异常,但当我们尝试关闭游标时游标引发错误时会发生的错误。在这种情况下,当我们尝试通过连接池记录游标关闭异常但失败时,真正的异常将被压制,因为我们尝试以在这种非常特定的场景中不适当的方式访问池的记录器。
参考链接: #3063
[引擎] [错误] ¶
检测到一些 “双重失效” 情况,其中连接失效可能发生在已经像 connection.close() 这样的关键部分内;最终,这些情况是由 #2907 中的更改引起的,因为 “返回时重置” 功能会调用 Connection/Transaction 以处理它,其中可能会捕获 “断开连接检测”。但是,#2985 中最近的更改可能使这种情况更容易被看到,因为 “连接失效” 操作要快得多,因为该问题在 0.9.4 上比 0.9.3 更容易重现。
现在在任何可能发生失效的部分内添加了检查,以阻止对失效连接的进一步不允许的操作。这包括引擎级别和连接池级别的两个修复。虽然该问题是在高度并发的 gevent 案例中观察到的,但理论上它可能发生在任何类型的场景中,其中断开连接发生在连接关闭操作中。
参考链接: #3043
sql¶
[sql] [功能] ¶
稍微放宽了
Index的约定,因为您可以将text()表达式指定为目标;如果索引要手动添加到表中,无论是通过内联声明还是通过Table.append_constraint()添加,则索引不再需要存在表绑定的列。参考链接: #3028
[sql] [功能] ¶
添加了新的标志
between.symmetric,当设置为 True 时,呈现 “BETWEEN SYMMETRIC”。还添加了新的否定运算符 “notbetween_op”,现在允许像~col.between(x, y)这样的表达式呈现为 “col NOT BETWEEN x AND y”,而不是带括号的 NOT 字符串。参考链接: #2990
[sql] [错误] ¶
修复了 INSERT..FROM SELECT 构造中的错误,其中从 UNION 中选择会将 union 包装在匿名(例如,未标记)子查询中。
此更改也 向后移植 到:0.8.7
参考链接: #3044
[sql] [错误] ¶
修复了当应用空的
and_()或or_()或其他空白表达式时,Table.update()和Table.delete()会产生空的 WHERE 子句的错误。现在这与select()的行为一致。此更改也 向后移植 到:0.8.7
参考链接: #3045
[sql] [错误] ¶
当
Column在该表的显式PrimaryKeyConstraint中被引用时,Column.nullable标志隐式设置为False。此行为现在与Column本身将Column.primary_key标志设置为True时的行为相匹配,这旨在成为完全等效的情况。参考链接: #3023
[sql] [错误] ¶
修复了
Operators.__and__(),Operators.__or__()和Operators.__invert__()运算符重载方法无法在自定义Comparator实现中被覆盖的错误。参考链接: #3012
[sql] [错误] ¶
修复了新的
DialectKWArgs.argument_for()方法中的错误,其中为先前未包含任何特殊参数的构造添加参数将失败。参考链接: #3024
[sql] [错误] ¶
修复了 0.9 中引入的回归,其中来自 #1068 的新 “ORDER BY <labelname>” 功能不会将引用规则应用于 ORDER BY 中呈现的标签名称。
[sql] [错误] ¶
恢复了
Function到sqlalchemy.sql.expression导入命名空间的导入,该导入在 0.9 的开头被删除。
postgresql¶
[postgresql] [功能] ¶
添加了在使用 pg8000 DBAPI 时对 AUTOCOMMIT 隔离级别的支持。拉取请求由 Tony Locke 提供。
[postgresql] [功能] ¶
为 PostgreSQL
ARRAY类型添加了新的标志ARRAY.zero_indexes。当设置为True时,将在传递到数据库之前将值 1 添加到所有数组索引值,从而实现 Python 风格的从零开始的索引和 PostgreSQL 的从一开始的索引之间更好的互操作性。拉取请求由 Alexey Terentev 提供。参考链接: #2785
[postgresql] [错误] ¶
将
hashable=False标志添加到 PGHSTORE类型,这是允许 ORM 在混合列/实体列表中请求 ORM 映射的 HSTORE 列时跳过尝试 “哈希” 它的操作所必需的。补丁由 Gunnlaugur Þór Briem 提供。此更改也 向后移植 到:0.8.7
参考链接: #3053
[postgresql] [错误] ¶
添加了新的 “断开连接” 消息 “connection has been closed unexpectedly”。这似乎与较新版本的 SSL 有关。拉取请求由 Antti Haapala 提供。
此更改也 向后移植 到:0.8.7
[postgresql] [错误] ¶
现在在确定异常是否为 “断开连接” 错误时会咨询 psycopg2
.closed访问器;理想情况下,这应该消除对异常消息进行任何其他检查以检测断开连接的需要,但是我们将保留这些现有消息作为后备。这应该能够处理更新的情况,例如 “SSL EOF” 条件。拉取请求由 Dirk Mueller 提供。参考: #3021
[postgresql] [增强] ¶
为 PostgreSQL 方言添加了新的类型
OID。虽然 “oid” 通常是 PG 中的私有类型,在现代版本中未公开,但存在一些 PG 用例(例如大对象支持)可能会公开这些类型,以及在一些用户报告的模式反射用例中。参考链接: #3002
mysql¶
mssql¶
测试¶
其他¶
[错误] [声明式] ¶
从声明式 mixin 或抽象类访问时,会复制
__mapper_args__字典,以便声明式本身对该字典所做的修改不会与其他映射的修改冲突。该字典针对version_id_col和polymorphic_on参数进行了修改,将内部的列替换为正式映射到本地类/表的列。此更改也 向后移植 到:0.8.7
参考链接: #3062
[错误] [ext] ¶
修复了可变扩展中的错误,其中
MutableDict未报告setdefault()字典操作的更改事件。此更改也 向后移植 到:0.8.7
[错误] [ext] ¶
修复了
MutableDict.setdefault()未返回现有值或新值的错误(此错误未在任何 0.8 版本中发布)。拉取请求由 Thomas Hervé 提供。此更改也 向后移植 到:0.8.7
[错误] [测试套件] ¶
在公共测试套件中,将
StringTest.test_literal_backslashes中的Text更改为使用不太受支持的String(40)。拉取请求由 Jan 提供。[错误] [firebird] ¶
修复了 “limit” 呈现为 “SELECT FIRST n ROWS” 使用绑定参数(只有 firebird 同时具有两者)的组合,与也具有 “limit” 以及 “位置” 绑定参数(例如 qmark 样式)的列级子查询相结合时,会错误地在封闭 SELECT 之前分配子查询级位置,从而返回顺序错误的参数的错误。
参考链接: #3038
0.9.4¶
发布日期:2014年3月28日通用¶
[通用] [功能] ¶
添加了对 pytest 运行测试的支持。此运行器目前除了 nose 之外还受到支持,并且很可能在未来优先于 nose。SQLAlchemy 使用的 nose 插件系统已被拆分出来,以便它也可以在 pytest 下工作。目前没有计划放弃对 nose 的支持,我们希望测试套件本身可以继续尽可能地与测试平台无关。请参阅文件 README.unittests.rst,以获取有关使用 pytest 运行测试的更新信息。
测试插件系统也得到了增强,通过多次指定
--db和/或--dburi标志,支持一次针对多个数据库 URL 运行测试。这不会为每个数据库运行整个测试套件,而是允许特定于某些后端的测试用例利用该后端作为测试运行。当使用 pytest 作为测试运行时,系统还将多次运行特定的测试套件,每个数据库运行一次,特别是 “方言套件” 中的那些测试。计划是增强的系统也将被 Alembic 使用,并允许 Alembic 在一次运行中针对多个后端(包括未包含在 Alembic 本身中的第三方后端)运行迁移操作测试。还鼓励第三方方言和扩展以 SQLAlchemy 的测试套件为基础进行标准化;有关从 SQLAlchemy 的测试平台构建的背景信息,请参阅文件 README.dialects.rst。[通用] [错误] ¶
调整了
setup.py文件以支持 setuptools 中可能在未来删除setuptools.Feature扩展。如果此关键字不存在,则 setup 仍然会使用 setuptools 成功,而不是回退到 distutils。现在还可以通过设置 DISABLE_SQLALCHEMY_CEXT 环境变量来禁用 C 扩展构建。无论 setuptools 是否可用,此变量都有效。此更改也向后移植到:0.8.6
参考链接: #2986
[通用] [错误] ¶
修复了 Python 3.4 中发生的一些测试/功能失败,特别是用于包装 “列默认值” 可调用对象的逻辑对于 Python 内置函数无法正常工作。
参考链接: #2979
orm¶
[orm] [功能] ¶
添加了新的参数
mapper.confirm_deleted_rows。默认为 True,表示一系列 DELETE 语句应确认游标行数与应匹配的主键数量相符;为了支持自引用 ON DELETE CASCADE 的不常见边缘情况,此行为在大多数情况下(版本 ID 使用时除外)已被移除;为了适应这种情况,该消息现在只是一个警告,而不是异常,并且可以使用此标志来指示预期此类自引用级联删除的映射。另请参阅 #2403 以了解原始更改的背景信息。参考链接:#3007
[orm] [功能] ¶
如果
MapperEvents.before_configured()或MapperEvents.after_configured()事件应用于特定的 mapper 或映射类,则会发出警告,因为这些事件仅在通用级别针对Mapper目标调用。[orm] [功能] ¶
为
listen()和listens_for()添加了新的关键字参数once=True。这是一个便捷功能,它将包装给定的监听器,使其仅被调用一次。[orm] [功能] ¶
为
relationship.innerjoin添加了一个新选项,用于指定字符串"nested"。当设置为"nested"而不是True时,“连接”链将在现有外连接的右侧用括号括起内连接,而不是像一系列外连接那样链接。当 0.9 版本发布时,这可能应该是默认行为,因为我们在 ORM 中引入了右嵌套连接的功能,但我们暂时将其保留为非默认行为,以避免进一步的意外。另请参阅
参考链接:#2976
[orm] [错误修复] ¶
修复了 ORM 错误,其中更改对象的主键,然后将其标记为 DELETE 将无法正确定位要删除的行。
此更改也向后移植到:0.8.6
参考链接:#3006
[orm] [错误修复] ¶
修复了由 #2818 导致的 0.8.3 版本回归,其中
Query.exists()无法在仅具有Query.select_from()条目但没有其他实体的查询上工作。此更改也向后移植到:0.8.6
参考链接:#2995
[orm] [错误修复] ¶
改进了当针对不可选对象(例如
literal_column())执行 query(),然后尝试使用Query.join()时发生的错误消息,使得 “left” 侧被确定为None并随后失败。现在已显式检测到这种情况。此更改也向后移植到:0.8.6
[orm] [错误修复] ¶
从
sqlalchemy.orm.interfaces.__all__中删除了过时的名称,并使用当前名称刷新,以便再次可以从该模块import *。此更改也向后移植到:0.8.6
参考链接:#2975
[orm] [错误修复] ¶
修复了一个非常旧的行为,其中为一对多关系发出的延迟加载可能会不恰当地拉取父表,并且当 primaryjoin 包括针对父表的某种鉴别器(例如
and_(parent.id == child.parent_id, parent.deleted == False))时,返回的结果与父表中的内容不一致。虽然此 primaryjoin 对于一对多关系而言意义不大,但在应用于多对一侧时稍微更常见,并且一对多关系是 backref 的结果。在这种情况下,从child加载行会将parent.deleted == False保留在查询中,从而将其拖入 FROM 子句并执行笛卡尔积。新行为现在将根据需要将本地 “parent.deleted” 的值替换为该参数。虽然通常,实际应用程序可能希望在任何情况下都为 o2m 侧使用不同的 primaryjoin。参考链接:#2948
[orm] [错误修复] ¶
改进了对 “如何从 A 连接到 B” 的检查,这样当一个表具有多个指向父表的复合外键时,
relationship.foreign_keys参数将被正确解释,以解决歧义;以前,当实际上 foreign_keys 参数应该确定预期路径时,这种情况会引发存在多个 FK 路径的错误。参考链接:#2965
[orm] [错误修复] ¶
为
listen()添加了对尚未完全文档化的insert=True标志的支持,以与 mapper / 实例事件一起使用。[orm] [错误修复] [引擎] ¶
修复了在类级别(例如在
Mapper或ClassManager级别,而不是在单个映射类上,以及在Connection上)设置监听的事件,并且也使用了内部参数转换(在这些类别中最为常见)的事件将无法移除的错误。参考链接:#2973
[orm] [错误修复] ¶
修复了 0.8 版本回归,其中使用类似
lazyload()的选项和 “通配符” 表达式(例如"*")会在查询不包含任何实际实体的情况下引发断言错误。此断言旨在用于其他情况,但无意中捕获了这种情况。[orm] [错误修复] [sqlite] ¶
更多针对 SQLite “连接重写” 的修复;在 0.9.3 版本发布之前实现的 #2967 中的修复影响了 UNION 包含嵌套连接的情况。“连接重写” 是一项功能,具有广泛的可能性,并且是我们多年来首次引入的复杂的 “SQL 重写” 功能,因此我们正在经历大量的迭代(与 0.2/0.3 系列中的迫切加载和 0.4/0.5 中的多态加载非常相似)。我们应该很快就能完成,感谢您的耐心配合 : )。
参考链接:#2969
示例¶
[示例] [错误修复] ¶
修复了 versioned_history 示例中的错误,其中列级别的 INSERT 默认值会阻止写入 NULL 的历史值。
引擎¶
[引擎] [功能] ¶
为方言级别事件添加了一些新的事件机制;初始实现允许事件处理程序重新定义任意方言在 DBAPI 游标上调用 execute() 或 executemany() 的特定机制。新的事件在目前是半公开和实验性的,旨在支持一些即将到来的与事务相关的扩展。
[引擎] [功能] ¶
现在可以将事件监听器与
Engine关联,在一个或多个Connection对象创建之后(例如通过 ormSession或通过显式连接),监听器将从这些连接中接收事件。以前,出于性能考虑,事件传输仅在初始化时从Engine推送到Connection,但我们已经内联了一系列条件检查,以在不进行任何额外函数调用的情况下实现此目的。参考链接:#2978
[引擎] [错误修复] ¶
对
Engine在检测到 “断开连接” 条件时回收连接池的机制进行了重大改进;不再是丢弃池并显式关闭连接,而是保留池并更新 “生成” 时间戳以反映当前时间,从而导致所有现有连接在下次检出时被回收。这大大简化了回收过程,消除了 “唤醒” 等待旧池的连接尝试的需要,并消除了在回收操作期间可能创建许多立即丢弃的 “池” 对象的竞争条件。参考链接:#2985
[引擎] [错误修复] ¶
现在为
Connection的 “_cursor_execute()” 方法发出ConnectionEvents.after_cursor_execute()事件;这是用于诸如在 INSERT 语句之前执行序列以及用于方言启动检查(如 unicode 返回、字符集等)的 “快速” 执行器。ConnectionEvents.before_cursor_execute()事件已经在此处调用。“executemany” 标志现在始终设置为 False,因为此事件始终对应于单个执行。以前,如果我们代表 executemany INSERT 语句执行操作,则该标志可能为 True。
sql¶
[sql] [功能] ¶
添加了对布尔值字面量渲染的支持,例如 “true” / “false” 或 “1” / “0”。
[sql] [功能] ¶
添加了一个新功能
conv(),其目的是将约束名称标记为已应用命名约定。从 Alembic 0.6.4 开始,Alembic 迁移将使用此令牌在迁移脚本中渲染约束,这些约束的名称已被标记为已遵守命名约定。[sql] [功能] ¶
方言级别架构级构造的新关键字参数系统已得到增强,以帮助依赖于向构造添加临时关键字参数的现有方案。
例如,诸如
Index之类的构造将在构造后再次接受Index.kwargs集合中的临时关键字参数idx = Index("a", "b") idx.kwargs["mysql_someargument"] = True
为了适应在构造时允许自定义参数的用例,
DialectKWArgs.argument_for()方法现在允许此注册Index.argument_for("mysql", "someargument", False) idx = Index("a", "b", mysql_someargument=True)
[sql] [错误修复] ¶
修复了
tuple_()构造中的错误,其中本质上第一个 SQL 表达式的 “type” 将被应用于比较的元组值作为 “比较类型”;这在某些情况下会产生不适当的 “类型强制转换”,例如,当具有 String 和 Binary 值的混合的元组不正确地将目标值强制转换为 Binary,即使它们在左侧不是 Binary。tuple_()现在期望其值列表中包含异构类型。此更改也向后移植到:0.8.6
参考链接:#2977
[sql] [错误修复] ¶
修复了 0.9 版本回归,其中未能正确反射的
Table不会从父MetaData中删除,即使它处于无效状态。感谢 Roman Podoliaka 提供 Pullreq。参考链接:#2988
[sql] [错误修复] ¶
MetaData.naming_convention功能现在也适用于直接与Column关联的CheckConstraint对象,而不仅仅是与Table关联。[sql] [错误修复] ¶
修复了新的
MetaData.naming_convention功能中的错误,其中使用 “%(constraint_name)s” 令牌的检查约束的名称对于由布尔或枚举类型生成的约束会重复出现,并且总体上重复事件会导致 “%(constraint_name)s” 令牌不断复合自身。参考链接:#2991
[sql] [错误修复] ¶
调整了将名称应用于 .c 集合的逻辑,当接收到无名称
BindParameter时,例如通过literal()或类似方法;绑定参数的 “key” 用作 .c 中的键,而不是渲染的名称。由于这些绑定在任何情况下都具有 “匿名” 名称,因此如果未标记,则允许单个绑定参数在可选对象中拥有自己的名称。参考链接:#2974
[sql] [错误修复] ¶
对
FromClause.c集合在遇到重复列时的行为进行了一些更改。发出警告并将旧列替换为同名列的行为在某种程度上仍然存在;特别地,替换是为了保持向后兼容性。但是,替换的列仍然与c集合关联,现在位于集合._all_columns中,别名和联合等构造使用该集合来处理c中的列集,更接近于列列表中的实际内容,而不是唯一的键名集。这有助于在联合等中使用具有同名列的 SELECT 语句的情况,以便联合可以按位置匹配列,并且FromClause.corresponding_column()仍然有可能在此处使用(它现在可以返回仅在 selectable.c._all_columns 中且未以其他方式命名的列)。新的集合带有下划线,因为我们仍然需要确定此列表可能最终出现的位置。理论上,它将成为 iter(selectable.c) 的结果,但这将意味着迭代的长度将不再与 keys() 的长度匹配,并且需要检查该行为。参考链接:#2974
[sql] [错误修复] ¶
修复了新的
TextClause.columns()方法中未保留按位置给出的列的顺序的问题。这可能会对位置情况产生潜在影响,例如将生成的TextAsFrom对象应用于联合。
postgresql¶
[postgresql] [功能] ¶
为 psycopg2 DBAPI 启用了 “合理的行数检查”,因为这似乎在 psycopg2 2.0.9 及更高版本中受支持。
此更改也向后移植到:0.8.6
[postgresql] [错误修复] ¶
修复了由 0.8.5 / 0.9.3 版本的兼容性增强功能引起的回归,其中特定于仅 8.1、8.2 系列的 PostgreSQL 版本上的索引反射再次中断,围绕着始终存在问题的 int2vector 类型。虽然 int2vector 从 8.1 开始支持数组操作,但显然仅从 8.3 开始支持 CAST 为 varchar。
此更改也向后移植到:0.8.6
参考链接:#3000
mysql¶
[mysql] [错误修复] ¶
调整了 mysql-connector-python 的设置;在 Py2K 中,“supports unicode statements” 标志现在为 False,以便 SQLAlchemy 在发送到数据库之前将 SQL 字符串(注意:不是 参数)编码为字节。这似乎允许 mysql-connector 通过所有与 unicode 相关的测试,包括那些使用非 ASCII 表/列名称的测试,以及一些使用 cursor.executemany() 下的 unicode 的 TEXT 类型的测试。
oracle¶
[oracle] [功能] ¶
为 cx_Oracle 方言添加了一个新的引擎选项
coerce_to_unicode=True,它恢复了 Python 2 下 cx_Oracle outputtypehandler 的 Python unicode 转换方法,该方法已在 0.9.2 版本中作为 #2911 的结果被删除。尽管存在性能问题,但某些用例可能更希望对所有字符串值无条件地执行 unicode 强制转换。感谢 Christoph Zwerschke 提供 Pull 请求。参考链接:#2911
[oracle] [错误修复] ¶
添加了新的数据类型
DATE,它是DateTime的子类。由于 Oracle 本身没有 “datetime” 类型,而只有DATE,因此 Oracle 方言中存在的DATE类型是DateTime的实例是合适的。此问题不会更改类型的行为,因为数据转换在任何情况下都由 DBAPI 处理,但是改进的子类布局将有助于检查类型以实现跨数据库兼容性的用例。还从 Oracle 方言中删除了大写DATETIME,因为此类型在该上下文中不起作用。参考链接:#2987
测试¶
其他¶
[错误修复] [扩展] ¶
修复了 mutable 扩展以及
flag_modified()中的错误,其中如果属性已重新分配给自己,则不会传播更改事件。此更改也向后移植到:0.8.6
参考链接:#2997
[错误修复] [automap] [扩展] ¶
为 automap 添加了对以下情况的支持:在连接继承关系中的两个类之间不应创建关系,对于那些将子类链接回超类的外键。
参考链接:#3004
[错误修复] [池] ¶
修复了
SingletonThreadPool中的小问题,其中要返回的当前连接可能会在 “清理” 过程中被意外清除。感谢 jd23 提供补丁。[错误修复] [扩展] [py3k] ¶
修复了 association proxy 中的错误,其中在 Py3k 上分配空切片(例如
x[:] = [...])会失败。[错误修复] [扩展] ¶
修复了由 #2810 引起的 association proxy 中的回归,该回归导致用户提供的 “getter” 在从不存在的目标获取标量值时不再接收
None值。此更改引入的 None 检查现在已移至默认 getter 中,因此用户提供的 getter 也将再次接收 None 值。参考链接:#2810
0.9.3¶
发布日期:2014 年 2 月 19 日orm¶
[orm] [功能] ¶
添加了新的
MapperEvents.before_configured()事件,该事件允许在configure_mappers()开始时触发事件,以及 declarative 中的__declare_first__()钩子,以补充__declare_last__()。[orm] [错误修复] ¶
修复了当使用现有条件查询
Query.get(),且给定的标识已存在于 identity map 中时,未能始终如一地引发InvalidRequestError错误的 bug。此更改也已向后移植到:0.8.5
参考链接:#2951
[orm] [bug] [sqlite] ¶
修复了 SQLite “join rewriting”(连接重写)中的 bug,即当 exists() 构造未被正确重写时,例如当 exists() 映射到复杂嵌套连接场景中的 column_property 时。 还修复了一个相关的 issue,即如果 SELECT 语句的 columns 子句的目标是别名表而不是单个别名列,则连接重写会失败。
参考链接:#2967
[orm] [bug] ¶
修复了 0.9 版本的一个回归错误,该错误导致应用于基类的 ORM 实例或 mapper 事件(例如带有 propagate=True 标志的声明性基类)无法应用于也使用继承的现有映射类,原因是断言失败。 此外,修复了一个属性错误,该错误可能在删除此类事件期间发生,具体取决于事件最初是如何分配的。
参考链接:#2949
[orm] [bug] ¶
改进了 composite 属性的初始化逻辑,使得调用
MyClass.attribute将不再要求已执行 configure mappers 步骤,例如,它可以正常工作而不会抛出任何错误。参考链接:#2935
[orm] [bug] ¶
更多与 [ticket:2932] 相关的问题首先在 0.9.2 中解决,其中使用
<tablename>_<columnname>形式的列键,与文本中别名列的列键匹配,在 ORM 级别仍然无法匹配,这最终是由于核心列匹配问题。 已添加其他规则,以便在使用TextAsFrom构造或文字列时,将列_label考虑在内。参考链接:#2932
orm declarative¶
[orm] [declarative] [bug] ¶
修复了
AbstractConcreteBase无法在声明性关系配置中完全使用的 bug,因为它的字符串类名在 mapper 配置时在类名注册表中不可用。 该类现在显式地将自身添加到类注册表中,并且AbstractConcreteBase和ConcreteBase都在configure_mappers()设置中在 mapper 配置之前设置自身,使用新的MapperEvents.before_configured()事件。参考链接:#2950
examples¶
[examples] [feature] ¶
向 versioned rows 示例添加了可选的 “changed” 列,以及对 versioned
Table具有显式Table.schema参数时的支持。 Pull request 由 jplaverdure 提供。
engine¶
sql¶
[sql] [bug] ¶
修复了使用空列表或元组调用
Insert.values()会引发 IndexError 的 bug。 现在它会生成一个空的 insert 构造,就像空字典的情况一样。此更改也已向后移植到:0.8.5
参考链接:#2944
[sql] [bug] ¶
修复了如果错误地将一个列表达式传递给
ColumnOperators.in_(),而该列表达式的比较器包含__getitem__()方法(例如,使用ARRAY类型的列)时,ColumnOperators.in_()会进入无限循环的 bug。此更改也已向后移植到:0.8.5
参考链接:#2957
[sql] [bug] ¶
修复了新 “naming convention”(命名约定)功能中的回归错误,其中如果外键中引用的表包含 schema 名称,则约定会失败。 Pull request 由 Thomas Farvour 提供。
[sql] [bug] ¶
修复了如果 bindparam 是使用 callable 而不是直接值构造的,则
bindparam()构造的所谓 “literal render”(字面渲染)会失败的 bug。 这阻止了 ORM 表达式使用 “literal_binds” 编译器标志进行渲染。
postgresql¶
[postgresql] [feature] ¶
在
ARRAY类型上添加了TypeEngine.python_type便利访问器。 Pull request 由 Alexey Terentev 提供。[postgresql] [bug] ¶
为 psycopg2 断开连接检测添加了一条额外的消息 “could not send data to server”(无法发送数据到服务器),以补充现有的 “could not receive data from server”(无法从服务器接收数据),并且已被用户观察到。
此更改也已向后移植到:0.8.5
参考链接:#2936
[postgresql] [bug] ¶
改进了对非常旧版本(8.1 之前)的 PostgreSQL 以及潜在的其他 PG 引擎(例如 Redshift,假设 Redshift 将版本报告为 < 8.1)的 PostgreSQL 反射行为的支持。“indexes”(索引)和 “primary keys”(主键)的查询依赖于检查所谓的 “int2vector” 数据类型,该数据类型在 8.1 之前拒绝强制转换为数组,从而导致与查询中使用的 “ANY()” 运算符相关的失败。 大量谷歌搜索找到了非常 hacky 但由 PG 核心开发人员推荐的查询,用于在 PG 版本 < 8.1 时使用,因此索引和主键约束反射现在在这些版本上起作用。
此更改也已向后移植到:0.8.5
[postgresql] [bug] ¶
修改了这个非常老旧的 issue,其中 PostgreSQL “get primary key”(获取主键)反射查询已更新为考虑已重命名的主键约束;较新的查询在非常旧版本的 PostgreSQL(例如版本 7)上失败,因此在检测到 server_version_info < (8, 0) 时,旧查询将被恢复。
此更改也已向后移植到:0.8.5
参考链接:#2291
[postgresql] [bug] ¶
为新添加的 “show standard_conforming_strings” 方言启动查询添加了服务器版本检测;由于此变量是在 PG 8.2 中添加的,因此我们跳过针对报告早于该版本的 PG 版本的查询。
参考链接:#2946
mysql¶
[mysql] [feature] ¶
添加了新的 MySQL 特有
DATETIME,其中包括小数秒支持;还为TIMESTAMP添加了小数秒支持。 DBAPI 支持有限,但已知 MySQL Connector/Python 支持小数秒。 Patch 由 Geert JM Vanderkelen 提供。此更改也已向后移植到:0.8.5
参考链接:#2941
[mysql] [bug] ¶
为
Table添加了对PARTITION BY和PARTITIONSMySQL 表关键字的支持,指定为mysql_partition_by='value'和mysql_partitions='value'。 Pull request 由 Marcus McCurdy 提供。此更改也已向后移植到:0.8.5
参考链接:#2966
[mysql] [bug] ¶
修复了阻止基于 MySQLdb 的方言(例如 pymysql)在 Py3K 中工作的 bug,其中对 “connection charset”(连接字符集)的检查由于 Py3K 更严格的值比较规则而失败。 在任何情况下,相关调用都没有考虑数据库版本,因为此时服务器版本仍然为 None,因此整个方法已简化为依赖于 connection.character_set_name()。
此更改也已向后移植到:0.8.5
参考链接:#2933
[mysql] [bug] [cymysql] ¶
修复了 cymysql 方言中的 bug,其中诸如
'33a-MariaDB'之类的版本字符串无法正确解析。 Pull request 由 Matt Schmidt 提供。参考链接:#2934
sqlite¶
[sqlite] [bug] ¶
SQLite 方言现在将跳过反射类型时不支持的参数; 例如,如果它遇到像
INTEGER(5)这样的字符串,则将实例化INTEGER类型,而不包含 “5”,这是基于在第一次尝试时检测到TypeError。[sqlite] [bug] ¶
已为 SQLite 类型反射添加支持,以完全支持 https://www.sqlite.org/datatype3.html 中指定的 “type affinity”(类型亲和性)约定。 在此方案中,类型名称中的
INT、CHAR、BLOB或REAL等关键字通常将类型与五种亲和性之一关联。 Pull request 由 Erich Blume 提供。另请参阅
misc¶
[bug] [ext] ¶
修复了如果类以单一或潜在的连接继承模式预先排列,则新的 automap 扩展的
AutomapBase类会失败的 bug。 修复后的连接继承问题也可能在使用DeferredReflection时应用。
0.9.2¶
发布日期:2014 年 2 月 2 日orm¶
[orm] [feature] ¶
添加了一个新的参数
Operators.op.is_comparison。 此标志允许将来自Operators.op()的自定义运算符视为 “comparison”(比较)运算符,因此可用于自定义relationship.primaryjoin条件。另请参阅
[orm] [feature] ¶
改进了对提供
join()构造作为relationship.secondary目标的的支持,目的是创建非常复杂的relationship()连接条件。 此更改包括对查询连接的调整,将连接的迫切加载调整为不渲染 SELECT 子查询,对延迟加载的更改,以便在 SELECT 中正确包含 “secondary” 目标,以及对声明性的更改,以更好地支持使用类作为目标的 join() 对象的规范。新的用例在某种程度上是实验性的,但已添加了新的文档部分。
[orm] [bug] ¶
修复了当迭代器对象传递给
class_mapper()或类似函数时,错误消息无法在字符串格式化中渲染的错误。 Pullreq 由 Kyle Stark 提供。此更改也已向后移植到:0.8.5
[orm] [bug] ¶
修复了新的
TextAsFrom构造中的 bug,其中面向Column的行查找与TextAsFrom生成的 ad-hocColumnClause对象不匹配,从而使其无法用作Query.from_statement()中的目标。 还修复了Query.from_statement()机制,使其不会将TextAsFrom误认为是Select构造。 此 bug 也是 0.9 版本的回归,因为调用了TextClause.columns()方法以适应text.typemap参数。参考链接:#2932
[orm] [bug] ¶
在属性 “set” 操作的范围内添加了一个新指令,以禁用 autoflush(自动刷新),以防属性需要延迟加载 “old” 值,例如在替换一对一值或某些类型的一对多值时。 否则,此时的 flush 会在属性为 None 时发生,并可能导致 NULL 违规。
参考链接:#2921
[orm] [bug] ¶
修复了 0.9 版本的一个回归错误,其中由
Query以及其他别名 selects 或 joins 的情况(例如连接表继承)应用的自动别名可能会失败,如果表达式中使用了用户定义的Column子类。 在这种情况下,子类将无法传播 adaptation 所需的 ORM 特定的 “annotations”(注解)。 “expression annotations”(表达式注解)系统已得到纠正以解决这种情况。参考链接:#2918
[orm] [bug] ¶
修复了一个涉及新的扁平化 JOIN 结构(与
joinedload()一起使用,从而导致连接迫切加载中的回归)以及aliased()结合flat=True标志和连接表继承的 bug; 基本上,跨越 “parent JOIN sub”(父 JOIN 子)实体的多个连接,使用不同的路径来访问目标类,将无法形成正确的 ON 条件。 在别名、连接继承类的情况下,在计算连接 “left side”(左侧)的机制中进行的调整/简化修复了此问题。参考链接:#2908
examples¶
[examples] [bug] ¶
对 “history_meta” 示例进行了一些调整,其中对关系绑定属性上的 “history”(历史记录)的检查,如果关系未加载,现在将不再发出任何 SQL。
engine¶
[engine] [feature] [pool] ¶
添加了一个新的连接池事件
PoolEvents.invalidate()。 当 DBAPI 连接要标记为 “invalidated”(无效)并从连接池中丢弃时调用。
sql¶
[sql] [feature] ¶
添加了
MetaData.reflect.dialect_kwargs以支持为所有反射的Table对象提供方言级别的反射选项。[sql] [feature] ¶
添加了一个新功能,允许将自动化命名约定应用于
Constraint和Index对象。 基于 wiki 中的一个 recipe,新功能使用 schema-events 在各种 schema 对象相互关联时设置名称。 然后,事件通过新的参数MetaData.naming_convention公开一个配置系统。 此系统允许为每个MetaData实例生成约束和索引的简单和自定义命名方案。另请参阅
参考链接:#2923
[sql] [feature] ¶
现在可以在
PrimaryKeyConstraint对象上独立于表中带有primary_key=True标志的列的规范来指定选项; 使用不包含任何列的PrimaryKeyConstraint对象来实现此结果。以前,显式的
PrimaryKeyConstraint会导致忽略标记为primary_key=True的列; 由于这种情况不再发生,PrimaryKeyConstraint现在将断言使用一种或另一种样式来指定列,或者如果两者都存在,则列列表完全匹配。 如果PrimaryKeyConstraint中和Table中标记为primary_key=True的列集不一致,则会发出警告,并且列列表仅从PrimaryKeyConstraint中获取,就像以前的版本一样。另请参阅
参考链接:#2910
[sql] [feature] ¶
schema 构造和某些 SQL 构造接受方言特定的关键字参数的系统已得到增强。 此系统通常包括
Table和Index构造(它们接受各种方言特定的参数,例如mysql_engine和postgresql_where),以及构造PrimaryKeyConstraint、UniqueConstraint、Update、Insert和Delete,以及新添加的 kwarg 功能到ForeignKeyConstraint和ForeignKey。 更改在于,参与的方言现在可以为这些构造指定可接受的参数列表,从而允许在为特定方言指定无效关键字时引发参数错误。 如果关键字的方言部分无法识别,则只会发出警告; 虽然该系统实际上将使用 setuptools entrypoints 来定位非本地方言,但在某些第三方方言未安装的环境中使用某些方言特定参数的用例仍然受支持。 方言也必须显式选择加入此系统,以便未使用此系统的外部方言将保持不受影响。参考链接:#2866
[sql] [bug] ¶
的
Table.tometadata()行为已调整,使得ForeignKey的 schema 目标除非该 schema 与父表的 schema 匹配,否则不会更改。也就是说,如果表 “schema_a.user” 具有指向 “schema_b.order.id” 的外键,则无论是否将 “schema” 参数传递给Table.tometadata(),“schema_b” 目标都将保持不变。但是,如果表 “schema_a.user” 引用 “schema_a.order.id”,则 “schema_a” 的存在性将在父表和被引用表上都进行更新。这是一个行为变更,因此不太可能向后移植到 0.8 版本;但假设之前的行为存在相当多的错误,并且不太可能有人依赖它。此外,还添加了一个新的参数
Table.tometadata.referred_schema_fn。这指的是一个可调用函数,该函数将用于确定在 tometadata 操作中遇到的任何ForeignKeyConstraint的新引用 schema。此可调用函数可用于恢复到之前的行为,或自定义如何基于每个约束处理引用的 schema。参考链接: #2913
[sql] [bug] ¶
修复了二进制类型在某些情况下与 “test” 方言(例如 DefaultDialect 或其他没有 DBAPI 的方言)一起使用时会失败的错误。
[sql] [bug] [py3k] ¶
修复了 “字面绑定” 无法与作为二进制类型的绑定参数一起使用的错误。0.8 版本中修复了一个类似但不同的问题。
[sql] [bug] ¶
修复了回归错误,ORM 使用的 “annotation” 系统泄漏到
sqlalchemy.sql.functions中的标准函数(例如func.coalesce()和func.max())使用的名称中。在 ORM 属性中使用这些函数,从而生成它们的带注释版本可能会破坏 SQL 中呈现的实际函数名称。参考链接: #2927
[sql] [bug] ¶
修复了 0.9 回归错误,其中
RowProxy的新可排序支持在与非元组类型进行比较时会导致TypeError,因为它试图无条件地将 tuple() 应用于 “other” 对象。RowProxy上现在已实现全套 Python 比较运算符,使用了一种保证比较系统等同于元组的方法,并且仅当 “other” 对象是 RowProxy 的实例时才进行强制转换。[sql] [bug] ¶
将跳过使用没有列的
Table内联创建的UniqueConstraint。Pullreq 由 Derek Harland 友情提供。[sql] [bug] [orm] ¶
修复了多表 “UPDATE..FROM” 构造(仅在 MySQL 上可用),以正确呈现跨多个表具有相同名称的列的 SET 子句。这也将 SET 子句中用于绑定参数的名称更改为 “<tablename>_<colname>”,仅适用于非主表;由于此参数通常使用
Column对象直接指定,因此不应影响应用程序。此修复程序对Table.update()和 ORM 中的Query.update()均有效。参考链接: #2912
schema¶
[schema] [bug] ¶
将
sqlalchemy.schema.SchemaVisitor恢复到.schema模块。Pullreq 由 Sean Dague 友情提供。
postgresql¶
[postgresql] [feature] ¶
添加了一个新的方言级参数
postgresql_ignore_search_path;Table构造函数和MetaData.reflect()方法都接受此参数。当针对 PostgreSQL 使用时,即使远程 schema 名称存在于search_path中,指定了远程 schema 名称的外键引用表也将保留该 schema 名称;自 0.7.3 以来的默认行为是,search_path中存在的 schema 不会复制到反射的ForeignKey对象。文档已更新,详细描述了pg_get_constraintdef()函数的行为,以及postgresql_ignore_search_path功能如何基本上决定我们是否会遵守此函数报告的 schema 限定。参考链接: #2922
mysql¶
[mysql] [bug] ¶
向 cymysql 方言添加了一些缺失的方法,包括 _get_server_version_info() 和 _detect_charset()。Pullreq 由 Hajime Nakagami 友情提供。
此更改也已向后移植到:0.8.5
[mysql] [bug] [sql] ¶
为 SQL 类型的所谓 “向下适配” 添加了新的测试覆盖率,其中更具体的类型被适配为更通用的类型 - 一些第三方工具(如
sqlacodegen)需要此用例。此测试套件中需要修复的具体案例是ENUM被向下转换为Enum,以及 SQLite 日期类型被转换为通用日期类型。adapt()方法需要在此处变得更具体,以抵消在 0.9 中删除的基类TypeEngine上的 “catch all”**kwargs集合。参考链接: #2917
[mysql] [bug] ¶
MySQL CAST 编译现在考虑了字符串类型的各个方面,例如 “charset” 和 “collation”。虽然 MySQL 希望所有基于字符的 CAST 调用都使用 CHAR 类型,但我们现在在 CAST 时创建一个真实的 CHAR 对象,并复制它拥有的所有参数,以便像
cast(x, mysql.TEXT(charset='utf8'))这样的表达式将呈现CAST(t.col AS CHAR CHARACTER SET utf8)。[mysql] [bug] ¶
向 MySQL 方言和默认方言系统整体添加了新的 “unicode 返回” 检测,以便任何方言都可以向首次连接时的 “此 DBAPI 是否直接返回 unicode?” 检测添加额外的 “测试”。在这种情况下,我们专门针对 “utf8” 编码和显式的 “utf8_bin” 排序规则类型(在检查此排序规则是否可用之后)添加了一个检查,以测试在 MySQLdb 版本 1.2.3 中观察到的一些错误 unicode 行为。虽然 MySQLdb 在 1.2.4 版本中已解决此问题,但此处的检查应防止回归。此更改还允许 “unicode” 检查记录在引擎日志中,而以前情况并非如此。
参考链接: #2906
[mysql] [bug] [engine] [pool] ¶
Connection现在将其新的RootTransaction或TwoPhaseTransaction与其直接的_ConnectionFairy关联,作为该事务跨度的 “重置处理程序”,如果事务未以其他方式完成,则接管为Pool的 “返回时重置” 行为调用 commit() 或 rollback() 的任务。这解决了像 MySQL 两阶段事务这样挑剔的事务在连接关闭时将正确关闭的问题,而无需显式的回滚或提交(例如,在这种情况下不再引发 “XAER_RMFAIL” - 请注意这仅在日志记录中显示,因为异常不会在池重置中传播)。例如,当使用 ormSession并设置twophase,然后在没有显式回滚或提交的情况下调用Session.close()时,就会出现此问题。此更改还具有以下效果:无论会话如何被丢弃,当在非自动提交模式下使用Session对象时,您现在都会在日志中看到显式的 “ROLLBACK”。感谢 Jeff Dairiki 和 Laurence Rowe 在此处隔离了问题。参考链接: #2907
sqlite¶
[sqlite] [bug] ¶
修复了 SQLite 编译器未能将编译器参数(例如 “字面绑定”)传播到 CAST 表达式中的错误。
mssql¶
[mssql] [feature] ¶
向
UniqueConstraint和PrimaryKeyConstraint构造添加了一个选项mssql_clustered;在 SQL Server 上,这会将CLUSTERED关键字添加到 DDL 中的约束构造中。Pullreq 由 Derek Harland 友情提供。
oracle¶
[oracle] [bug] ¶
据观察,在 Python 2.xx 中使用 cx_Oracle “outputtypehandler” 以强制将字符串值转换为 Unicode 非常昂贵;即使 cx_Oracle 是用 C 编写的,当您将 Python
unicode原始类型传递给 cursor.var() 并与输出处理程序关联时,库会将每次转换都计为一个 Python 函数调用,并记录所有必需的开销;这尽管在 Python 3 中运行时,所有字符串也无条件地强制转换为 unicode,但它不会产生这种开销,这意味着 cx_Oracle 在 Py2K 中未能使用高性能技术。由于 SQLAlchemy 无法轻松地为每列选择这种类型的类型处理程序,因此无条件地组装了处理程序,从而将开销添加到所有字符串访问中。因此,此逻辑已替换为 SQLAlchemy 自己的 unicode 转换系统,该系统现在仅在 Py2K 中对请求为 unicode 的列生效。当使用 C 扩展时,SQLAlchemy 的系统似乎比 cx_Oracle 的系统快 2-3 倍。此外,SQLAlchemy 的 unicode 转换已得到增强,以便当需要 “条件” 转换器时(现在 Oracle 后端需要),对 “已经是 unicode” 的检查现在在 C 中执行,不再引入明显的开销。
此更改对 cx_Oracle 后端有两个影响。一是 Py2K 中未专门使用 Unicode 类型或 convert_unicode=True 请求的字符串值现在将以
str而不是unicode形式返回 - 此行为类似于 MySQL 等后端。此外,当使用 cx_Oracle 后端请求 unicode 值时,如果未使用 C 扩展,则现在每列都会额外产生 isinstance() 检查的开销。做出此权衡是因为它可以被解决,并且不再对可能是非 unicode 字符串的大多数 Oracle 结果列造成性能负担。参考链接:#2911
misc¶
[bug] [pool] ¶
为了与所有其他池事件保持一致,
PoolEvents.reset()事件的参数名称已重命名为dbapi_connection和connection_record。预计此相对较新且很少使用的事件的任何现有侦听器都在使用位置样式来接收参数。[bug] [cextensions] [py3k] ¶
修复了 Py3K 中的 C 扩展使用错误的 API 来指定顶级模块函数的问题,这在 Python 3.4b2 中会中断。Py3.4b2 将 PyMODINIT_FUNC 更改为返回 “void” 而不是
PyObject *,因此我们现在确保使用 “PyMODINIT_FUNC” 而不是直接使用PyObject *。Pull request 由 cgohlke 友情提供。
0.9.1¶
发布日期:2014 年 1 月 5 日orm¶
[orm] [bug] [events] ¶
修复了回归错误,其中将
functools.partial()与事件系统一起使用会导致递归溢出,这是因为为了检测某些事件的旧式调用签名而在其上使用了 inspect.getargspec(),并且显然对于 partial 对象无法执行此操作。相反,我们跳过旧式检查并假定为新式;现在仅对 SessionEvents.after_bulk_update 和 SessionEvents.after_bulk_delete 事件进行检查。如果分配给 “partial” 事件侦听器,则这两个事件将需要新的签名样式。参考链接: #2905
[orm] [bug] ¶
修复了如果仅将
.info参数传递给sessionmaker创建调用,而不是传递给对象本身,则使用新的Session.info属性会失败的错误。感谢 Robin Schoonover 友情提供。[orm] [bug] ¶
修复了回归错误,其中我们在基于名称设置 backref 时,没有针对正确的字符串类检查给定的名称,因此导致错误 “解包的值过多”。这与 Py3k 转换有关。
参考链接: #2901
[orm] [bug] ¶
修复了回归错误,其中当说 query(B).join(B.cs) 时,我们显然仍然创建了一个隐式别名,其中 “C” 是一个连接的 inh 类;但是,此隐式别名仅考虑了直接左侧,而不是沿同一基类的不同连接的 inh 子类的更长连接链。只要我们仍然在这种情况下隐式地使用别名,行为就会稍微回调,以便它将在更广泛的情况下为右侧使用别名。
参考链接: #2903
orm declarative¶
[orm] [declarative] [bug] ¶
修复了一个极不可能发生的内存问题,其中当使用
DeferredReflection定义待反射的类时,如果在调用DeferredReflection.prepare()方法以反射和映射类之前丢弃了这些类中的某些子集,则对该类的强引用将保留在声明性内部结构中。此 “要映射的类” 的内部集合现在使用针对类本身的弱引用。[orm] [declarative] [bug] ¶
一个准回归错误,其中在 0.8 中,您可以在声明性类上设置一个类级属性,以简单地直接引用超类或类本身上的
InstrumentedAttribute,它的行为或多或少类似于同义词;在 0.9 中,这无法设置足够的簿记来跟上 #2789 中更自由化的 backref 逻辑。即使从未直接考虑过此用例,但声明性现在在 “setattr()” 级别以及设置子类时检测到它,并且镜像/重命名的属性现在设置为synonym()代替。参考链接: #2900
orm extensions¶
[orm] [extensions] [feature] ¶
添加了一个新的、实验性的扩展
sqlalchemy.ext.automap。此扩展扩展了 Declarative 以及DeferredReflection类的功能,以生成一个基类,该基类根据表元数据自动生成映射类和关系。
sql¶
schema¶
[schema] [feature] ¶
Table.extend_existing和Table.autoload_replace参数现在在MetaData.reflect()方法上可用。
0.9.0¶
发布日期:2013 年 12 月 30 日orm¶
[orm] [feature] ¶
StatementError或 DBAPI 相关的子类现在可以容纳有关异常 “原因” 的其他信息;当异常发生在自动刷新中时,Session现在会向其添加一些详细信息。采用这种方法是为了保持与 Py2K 代码以及已经捕获IntegrityError或类似错误的代码的兼容性,而不是将FlushError与 Python 3 样式的 “链式异常” 方法相结合。[orm] [feature] [backrefs] ¶
向
validates()函数添加了新参数include_backrefs=True;当设置为 False 时,如果事件是由另一侧的属性操作的反向引用启动的,则不会触发验证事件。参考链接: #1535
[orm] [feature] ¶
使用新的
Query.with_for_update()方法添加了一个新的 API,用于指定SELECT的FOR UPDATE子句,以补充新的GenerativeSelect.with_for_update()方法。Pull request 由 Mario Lassnig 友情提供。[orm] [bug] ¶
对
subqueryload()策略的调整,确保查询在加载过程开始后运行;这是为了使 subqueryload 优先于其他加载器,这些加载器可能会由于在错误时间出现的其他 eager/noload 情况而访问同一属性。此更改也已向后移植到:0.8.5
参考链接: #2887
[orm] [bug] ¶
修复了当使用从表到基表上的 select/alias 的连接表继承时,PK 列也不同名时的错误;持久性系统在 INSERT 时无法将主键值从基表复制到继承表。
此更改也已向后移植到:0.8.5
参考链接: #2885
[orm] [bug] ¶
当传递的列/属性(名称)无法解析为 Column 或映射属性(例如错误的元组)时,
composite()将引发信息性错误消息;之前引发了未绑定的局部变量。此更改也已向后移植到:0.8.5
参考链接: #2889
[orm] [bug] ¶
修复了由 #2818 引入的回归错误,其中生成的 EXISTS 查询将为具有两个同名列的语句生成 “列正在被替换” 警告,因为内部 SELECT 不会设置 use_labels。
此更改也已向后移植到:0.8.4
参考链接: #2818
[orm] [bug] [collections] [py3k] ¶
在 ORM 集合检测系统中添加了对 Python 3 方法
list.clear()的支持;pull request 由 Eduardo Schettino 友情提供。[orm] [bug] ¶
对
AliasedClass构造进行了一些改进,涉及描述符,例如 hybrids、synonyms、composites、用户定义的描述符等。已经使正在进行的属性适配更加健壮,这样如果描述符返回另一个检测到的属性,而不是复合 SQL 表达式元素,操作仍将继续进行。此外,“适配的” 运算符将保留其类;以前,从InstrumentedAttribute到QueryableAttribute(超类)的类更改将与 Python 的运算符系统交互,以便像aliased(MyClass.x) > MyClass.x这样的表达式会反转自身以读取myclass.x < myclass_1.x。适配的属性还将新的AliasedClass称为其父级,而以前情况并非总是如此。参考: #2872
[orm] [bug] ¶
现在,
relationship()上的viewonly标志将阻止代表目标属性写入属性历史记录。这会影响对象是否被写入 Session.dirty 列表,如果对象被修改。 以前,对象会出现在 Session.dirty 中,但在刷新期间不会代表修改后的属性进行任何更改。 该属性仍然会发出事件,例如反向引用事件和用户定义的事件,并且仍然会接收来自反向引用的修改。参考: #2833
[orm] [bug] ¶
为
scoped_session添加了对新的Session.info属性的支持。[orm] [bug] ¶
修复了使用新的
Bundle对象会导致Query.column_descriptions属性失败的 bug。[orm] [bug] [sql] [sqlite] ¶
修复了由 #2369 和 #2587 的 join 重写功能引入的回归错误,其中嵌套 join 的一侧已经是别名选择,将无法正确翻译外部的 ON 子句; 在 ORM 中,当使用 SELECT 语句作为“secondary”表时,可以看到这种情况。
参考: #2858
orm declarative¶
[orm] [declarative] [bug] ¶
Declarative 进行了额外的检查,以检测是否同一个
Column在不同的属性下被映射多次(通常应该是synonym()代替),或者是否两个或多个Column对象被赋予相同的名称,如果检测到这种情况,则会发出警告。参考: #2828
[orm] [declarative] [bug] ¶
DeferredReflection类已得到增强,为relationship()引用的 “secondary” 表提供自动反射支持。“secondary”,当指定为字符串表名,或指定为仅具有名称和MetaData对象的Table对象时,在调用DeferredReflection.prepare()时,也会包含在反射过程中。参考: #2865
[orm] [declarative] [bug] ¶
修复了 Py2K 中的一个 bug,即 unicode 字符串文字不会被接受为 declarative 中使用
relationship()的类或其他参数的字符串名称。
examples¶
[examples] [bug] ¶
修复了阻止 history_meta 配方与超过一级的 joined inheritance 方案一起工作的 bug。
engine¶
[engine] [feature] ¶
改进了
engine_from_config()函数,以便我们能够从字符串配置字典中解析特定于 dialect 的参数。 Dialect 类现在可以提供它们自己的参数类型和字符串转换例程列表。 但是,内置的 dialect 尚未使用此功能。参考: #2875
[engine] [bug] ¶
在
connect()上引发错误且不是 dbapi.Error 子类(例如TypeError,NotImplementedError等)的 DBAPI 将传播未更改的异常。 以前,特定于connect()例程的错误处理既不恰当地通过 dialect 的Dialect.is_disconnect()例程运行异常,又将其包装在sqlalchemy.exc.DBAPIError中。 现在,它以与 execute 过程内发生的方式相同的方式传播未更改的异常。此更改也已向后移植到:0.8.4
参考: #2881
[engine] [bug] [pool] ¶
QueuePool已得到增强,当现有的连接尝试正在阻塞时,不会阻止新的连接尝试。 以前,新连接的生产在监视溢出的块内被序列化; 溢出计数器现在在其自身的临界区内,在连接过程本身之外被更改。此更改也已向后移植到:0.8.4
参考: #2880
[engine] [bug] [pool] ¶
对等待池连接可用的逻辑进行了轻微调整,这样对于没有指定超时时间的连接池,它将每半秒跳出等待以检查所谓的“abort”标志,这允许等待者在整个连接池被转储的情况下跳出; 通常,等待者应该由于 notify_all() 而跳出,但在非常罕见的情况下,可能会错过此 notify_all()。 这是 0.8.0 中首次引入的逻辑的扩展,并且该问题仅在压力测试中偶尔观察到。
此更改也已向后移植到:0.8.4
参考: #2522
[engine] [bug] ¶
修复了当在
Connection.execute()中引发 pre-DBAPIStatementError时,SQL 语句会被错误地进行 ASCII 编码的 bug,从而导致非 ASCII 语句的编码错误。 字符串化现在保留在 Python unicode 中,从而避免了编码错误。此更改也已向后移植到:0.8.4
参考: #2871
[engine] [bug] ¶
create_engine()例程和相关的make_url()函数不再将+号视为密码字段中的空格。 此区域中的解析已调整为更紧密地匹配 RFC 1738 如何处理这些标记,其中username和password都只期望:,@和/被编码。参考: #2873
[engine] [bug] ¶
RowProxy对象现在在 Python 中可以像常规元组一样排序; 这是通过确保__eq__()方法中以及添加__lt__()方法中两侧的 tuple() 转换来实现的。另请参阅
参考: #2848
sql¶
[sql] [feature] ¶
对
text()构造的新改进,包括更灵活的方式来设置绑定参数和返回类型; 特别是,text()现在可以转换为完整的 FROM 对象,可以使用新的TextClause.columns()方法嵌入到其他语句中作为别名或 CTE。 当构造在 “literal bound” 上下文中编译时,text()构造也可以呈现 “inline” 绑定参数。另请参阅
[sql] [feature] ¶
使用新的
GenerativeSelect.with_for_update()方法添加了用于指定SELECT的FOR UPDATE子句的新 API。 与select()的for_update关键字参数相比,此方法支持更直接的系统来设置特定于 dialect 的选项,并且还包括对 SQL 标准FOR UPDATE OF子句的支持。 ORM 还包括一个新的对应方法Query.with_for_update()。 Pull request 由 Mario Lassnig 友情提供。[sql] [feature] ¶
现在可以配置通过字符串将返回的浮点值强制转换为 Python
Decimal时使用的精度。 所有Numeric和Float类型现在都支持标志decimal_return_scale,这将确保从本机浮点值转换为字符串时使用这么多位数字。 如果不存在,则类型将使用.scale的值,如果类型支持此设置且它不是 None。 否则,将使用原始默认长度 10。另请参阅
参考: #2867
[sql] [bug] ¶
修复了主键列上有一个 Sequence,但该列不是 “auto increment” 列的问题,这可能是因为它具有外键约束或设置了
autoincrement=False,当 INSERT 缺少主键值时,会在不支持 sequence 的后端上尝试触发 Sequence。 这将发生在非 sequence 后端(如 SQLite,MySQL)上。此更改也已向后移植到:0.8.5
参考: #2896
[sql] [bug] ¶
修复了
Insert.from_select()方法的 bug,其中在生成 INSERT 语句时不会考虑给定名称的顺序,因此会与给定 SELECT 语句中的列名产生不匹配。 另请注意,Insert.from_select()意味着不能使用 Python 端插入默认值,因为该语句没有 VALUES 子句。此更改也已向后移植到:0.8.5
参考: #2895
[sql] [bug] ¶
当给定一个纯文字值时,
cast()函数现在将根据给定的 cast 类型,在绑定参数侧将给定的类型应用于给定的文字值,其方式与type_coerce()函数相同。 但是,与type_coerce()不同,这仅在将非 clauseelement 值传递给cast()时才生效; 现有的类型化构造将保留其类型。[sql] [bug] ¶
ForeignKey类更积极地检查给定的 column 参数。 如果不是字符串,它会检查对象是否至少是一个ColumnClause,或者一个可以解析为一个 ColumnClause 的对象,以及.table属性(如果存在)是否引用TableClause或子类,而不是像Alias这样的东西。 否则,将引发ArgumentError。参考: #2883
[sql] [bug] ¶
修改了
ColumnOperators.collate()运算符的优先级规则,使得 COLLATE 运算符的优先级现在低于比较运算符。 这样做的效果是,应用于比较的 COLLATE 不会在比较周围呈现括号,这不会被 MSSQL 等后端解析。 对于那些通过将Operators.collate()应用于比较表达式的单个元素而不是整个比较表达式来解决此问题的设置,此更改是向后不兼容的。另请参阅
参考: #2879
[sql] [enhancement] ¶
当
BindParameter出现在没有值的已编译语句中时引发的异常现在包括错误消息中绑定参数的键名。此更改也已向后移植到:0.8.5
schema¶
postgresql¶
[postgresql] [feature] ¶
添加了对 PostgreSQL JSON 的支持,使用新的
JSON类型。 非常感谢 Nathan Rice 实现和测试此功能。参考: #2581
[postgresql] [feature] ¶
通过
TSVECTOR类型添加了对 PostgreSQL TSVECTOR 的支持。 Pull request 由 Noufal Ibrahim 友情提供。[postgresql] [bug] ¶
修复了当使用 pypostgresql 适配器时,索引反射会错误地解释 indkey 值(当使用 pypostgresql 适配器时,这些值作为列表返回,而不是 psycopg2 的字符串返回类型)的 bug。
此更改也已向后移植到:0.8.4
参考: #2855
[postgresql] [bug] ¶
现在使用 psycopg2 UNICODEARRAY 扩展来处理 psycopg2 + 普通 “native unicode” 模式下的 unicode 数组,其方式与使用 UNICODE 扩展的方式相同。
[postgresql] [bug] ¶
修复了 ENUM 中的值未针对单引号转义的 bug。 请注意,对于手动转义单引号的现有解决方法,这是向后不兼容的。
参考: #2878
mysql¶
mssql¶
[mssql] [bug] [firebird] ¶
与
Float类型一起使用的 “asdecimal” 标志现在也适用于 Firebird 以及 mssql+pyodbc dialect; 以前未发生十进制转换。此更改也已向后移植到:0.8.5
[mssql] [bug] [pymssql] ¶
将 “Net-Lib error during Connection reset by peer” 消息添加到 pymssql dialect 中检查 “disconnect” 的消息列表中。 由 John Anderson 友情提供。
此更改也已向后移植到:0.8.5
[mssql] [bug] ¶
修复了 0.8.0 中引入的 bug,其中 MSSQL 中索引的
DROP INDEX语句如果索引位于备用 schema 中,则会错误地呈现; schemaname/tablename 将被反转。 格式也已修改为与当前的 MSSQL 文档匹配。 由 Derek Harland 友情提供。此更改也已向后移植到:0.8.4
oracle¶
misc¶
[bug] [firebird] ¶
firebird dialect 将引用以下划线开头的标识符。 由 Treeve Jelbert 友情提供。
此更改也已向后移植到:0.8.5
参考: #2897
[bug] [firebird] ¶
修复了 Firebird 索引反射中的 bug,其中索引中的列未正确排序; 现在它们按 RDB$FIELD_POSITION 的顺序排序。
此更改也已向后移植到:0.8.5
[bug] [declarative] ¶
发送到
relationship()的字符串参数无法解析为类或 mapper 时的错误消息已得到纠正,使其与接收到非字符串参数时的行为方式相同,后者指示了具有配置错误的 relationship 的名称。此更改也已向后移植到:0.8.5
参考: #2888
[bug] [ext] ¶
修复了阻止
serializer扩展程序与包含非 ASCII 字符的表名或列名正确工作的 bug。此更改也已向后移植到:0.8.4
参考: #2869
[bug] [firebird] ¶
更改了 Firebird 用于列出表名和视图名称的查询,以从
rdb$relations视图而不是rdb$relation_fields和rdb$view_relations视图查询。 许多 FAQ 和博客中都提到了旧查询和新查询的变体,但是新查询直接取自 “Firebird FAQ”,这似乎是最权威的信息来源。参考: #2898
[removed] ¶
“informix” 和 “informixdb” dialect 已被移除; 代码现在可以作为 Bitbucket 上的单独存储库使用。 自首次添加 informixdb dialect 以来,IBM-DB 项目已提供生产级别的 Informix 支持。
0.9.0b1¶
发布日期:2013 年 10 月 26 日general¶
[general] [feature] [py3k] ¶
C 扩展已移植到 Python 3,并且将在任何受支持的 CPython 2 或 3 环境下构建。
参考: #2161
[general] [feature] [py3k] ¶
代码库现在对 Python 2 和 3 都是 “in-place” 的,不再需要运行 2to3。 现在兼容 Python 2.6 及更高版本。
参考: #2671
[general] ¶
软件包的大规模重构重新组织了许多 Core 模块以及 ORM 模块某些方面的导入结构。 特别是
sqlalchemy.sql已被分解为比以前更多的模块,以便现在缩小sqlalchemy.sql.expression的巨大尺寸。 该工作重点是大幅减少导入循环。 此外,sqlalchemy.sql.expression和sqlalchemy.orm中的 API 函数系统已重新组织,以消除函数与其生成的对象之间文档的冗余。
orm¶
[orm] [feature] ¶
为
relationship()添加了新选项distinct_target_key。 这使子查询 eager loader 策略能够将 DISTINCT 应用于最内层的 SELECT 子查询,以在最内层查询(对应于此 relationship)生成重复行的情况下提供帮助(对于子查询 eager 加载中重复行的问题,尚无通用解决方案,但是,当最内层子查询之外的 join 产生重复项时)。 当标志设置为True时,将无条件呈现 DISTINCT,当设置为None时,如果最内层 relationship 针对不包含完整主键的列,则呈现 DISTINCT。 该选项在 0.8 中默认为 False(例如,在所有情况下都默认关闭),在 0.9 中默认为 None(例如,默认自动)。 感谢 Alexander Koval 在这方面的帮助。此更改也已向后移植到:0.8.3
参考: #2836
[orm] [feature] ¶
当从标量 relationship 中获取标量属性时,如果标量 relationship 本身指向
None,则 association proxy 现在返回None,而不是引发AttributeError。参考链接:#2810
[orm] [feature] ¶
添加了新方法
AttributeState.load_history(),其工作方式类似于AttributeState.history,但也触发加载器可调用对象。参考: #2787
[orm] [feature] ¶
添加了一个新的加载选项
load_only()。 这允许指定一系列列名,以便 “仅” 加载这些属性,而延迟其余属性的加载。参考: #1418
[orm] [feature] ¶
加载器选项系统已完全重新架构,以建立在更全面的基础上,即
Load对象。 此基础允许任何常见的加载器选项(如joinedload()、defer()等)以“链式”风格使用,以便指定路径上的选项,例如joinedload("foo").subqueryload("bar")。 新系统取代了点分隔路径名称、选项内的多个属性以及_all()选项的用法。参考: #1418
[orm] [feature] ¶
composite()构造现在在面向列的Query中使用时,会维护返回对象,而不是展开为单独的列。 这在内部使用了新的Bundle功能。 此行为向后不兼容;要从将展开的复合列中进行选择,请使用MyClass.some_composite.clauses。参考:#2824
[orm] [feature] ¶
添加了一个新的构造
Bundle,允许为Query构造指定列表达式组。 默认情况下,列组作为单个元组返回。 但是,可以覆盖Bundle的行为,以便为返回的行提供任何类型的结果处理。 当复合属性在面向列的Query中使用时,Bundle的行为也嵌入到复合属性中。参考:#2824
[orm] [feature] ¶
Mapper的version_id_generator参数现在可以指定为依赖于服务器生成的版本标识符,使用触发器或其他数据库提供的版本控制功能,或者通过可选的编程值,通过设置version_id_generator=False。 当使用服务器生成的版本标识符时,ORM 将在可用时使用 RETURNING 来立即加载新的版本值,否则它将发出第二个 SELECT。参考:#2793
[orm] [feature] ¶
对于支持 RETURNING 的后端,
Mapper的eager_defaults标志现在允许使用内联 RETURNING 子句而不是第二个 SELECT 语句来获取新生成的默认值。参考:#2793
[orm] [feature] ¶
为
Session添加了一个新的属性Session.info;这是一个字典,应用程序可以在其中存储本地于Session的任意数据。 也可以使用Session或sessionmaker的info参数初始化Session.info的内容。[orm] [feature] ¶
现在已实现事件侦听器的删除。 此功能通过
remove()函数提供。另请参阅
参考:#2268
[orm] [feature] ¶
属性事件传递
AttributeImpl作为“发起者”令牌的机制已更改; 该对象现在是一个事件特定的对象,称为Event。 此外,属性系统不再基于匹配的“发起者”令牌来停止事件; 此逻辑已移动为特定于 ORM 反向引用事件处理程序,这是将属性事件重新传播到后续 append/set/remove 操作的典型来源。 模拟反向引用行为的最终用户代码现在必须确保递归事件传播方案已停止(如果该方案未使用反向引用处理程序)。 使用此新系统,当对象附加到集合、与新的多对一关联、与之前的多对一取消关联,然后从之前的集合中删除时,反向引用处理程序现在可以执行“两跳”操作。 在此更改之前,从先前集合中删除的最后一步不会发生。参考:#2789
[orm] [feature] ¶
关于 ORM 如何构造连接(其中右侧本身是连接或左外连接)的重大更改。 ORM 现在配置为允许简单嵌套形式的连接
a JOIN (b JOIN c ON b.id=c.id) ON a.id=b.id,而不是强制右侧进入SELECT子查询。 这应该可以显着提高大多数后端(尤其是 MySQL)的性能。 多年来一直阻碍此更改的唯一数据库后端 SQLite,现在通过将SELECT子查询的生成从 ORM 移动到 SQL 编译器来解决; 因此,SQLite 上的右嵌套连接仍然最终将使用SELECT呈现,而所有其他后端不再受此解决方法的影响。作为此更改的一部分,一个新的参数
flat=True已添加到aliased()、Join.alias()和with_polymorphic()函数中,这允许生成 JOIN 的“别名”,该别名将匿名别名应用于连接中的每个组件表,而不是生成子查询。参考:#2587
[orm] [bug] ¶
修复了列表检测在正确表示
[0:0]的 setslice 时会失败的错误,尤其是在使用关联代理时可能会发生这种情况。 由于 Python 集合中的某些怪癖,此问题在 Python 3 中比在 Python 2 中更可能发生。此更改也已向后移植到:0.8.3、0.7.11
参考:#2807
[orm] [bug] ¶
修复了在
Column上使用诸如remote()或foreign()之类的注释,然后在与父Table关联之前,可能会由于注释执行的固有复制操作而产生与父表未在连接中呈现相关的问题的错误。此更改也已向后移植到:0.8.3
参考:#2813
[orm] [bug] ¶
修复了
Query.exists()在没有任何 WHERE 条件的情况下无法正常工作的错误。 感谢 Vladimir Magamedov。此更改也已向后移植到:0.8.3
参考链接: #2818
[orm] [bug] ¶
修复了 ORM 使用的有序序列实现中可能存在的问题,用于迭代映射器层次结构; 在 Jython 解释器下,即使 cPython 和 PyPy 保持了顺序,此实现也不是有序的。
此更改也已向后移植到:0.8.3
参考:#2794
[orm] [bug] ¶
修复了 ORM 级别的事件注册中的错误,其中“raw”或“propagate”标志可能在某些“未映射基类”配置中配置错误。
此更改也已向后移植到:0.8.3
参考:#2786
[orm] [bug] ¶
与加载映射实体时
defer()选项的使用相关的性能修复。 在加载时将每个对象的延迟可调用对象应用于实例的函数开销远高于仅从行加载数据的开销(请注意,defer()旨在减少 DB/网络开销,而不一定是函数调用计数); 现在,在所有情况下,函数调用开销都小于从列加载数据的开销。 每次加载创建的“延迟可调用”对象的数量也从 N(结果中的延迟值总数)减少到 1(延迟列的总数)。此更改也已向后移植到:0.8.3
参考:#2778
[orm] [bug] ¶
修复了当使用
make_transient()函数将对象从“持久”移动到“待定”时,属性历史记录函数将失败的错误(对于涉及基于集合的反向引用的操作)。此更改也已向后移植到:0.8.3
参考:#2773
[orm] [bug] ¶
当尝试刷新继承类的对象时,如果多态鉴别器已分配给对该类无效的值,则会发出警告。
此更改也已向后移植到:0.8.2
参考:#2750
[orm] [bug] ¶
修复了多态 SQL 生成中的错误,其中针对同一基类的多个连接继承实体也相互连接时,如果连接字符串超过两个实体长度,则不会独立于彼此跟踪基表上的列。
此更改也已向后移植到:0.8.2
参考:#2759
[orm] [bug] ¶
修复了将复合属性发送到
Query.order_by()会产生某些数据库不接受的带括号的表达式的错误。此更改也已向后移植到:0.8.2
参考:#2754
[orm] [bug] ¶
修复了复合属性和
aliased()函数之间的交互。 以前,当应用别名时,复合属性在比较操作中无法正常工作。此更改也已向后移植到:0.8.2
参考:#2755
[orm] [bug] [ext] ¶
修复了当调用
clear()时MutableDict未报告更改事件的错误。此更改也已向后移植到:0.8.2
参考:#2730
[orm] [bug] ¶
与标量列映射属性一起使用时,
get_history()现在将遵循传递给它的“passive”标志; 由于默认设置为PASSIVE_OFF,因此如果该值不存在,则该函数默认将查询数据库。 这是相对于 0.8 的行为更改。参考: #2787
[orm] [bug] [associationproxy] ¶
为标量值的 ==、!= 比较器添加了额外的条件,用于与 None 的比较,以考虑关联记录本身不存在的情况,以及关联记录上的标量端点为 NULL 的现有测试。 以前,比较
Cls.scalar == None将返回Cls.associated存在且Cls.associated.scalar为 None 的记录,但不返回Cls.associated不存在的行。 更重要的是,逆运算Cls.scalar != None*将* 返回Cls行,其中Cls.associated不存在。还修改了
Cls.scalar != 'somevalue'的情况,使其行为更像直接 SQL 比较; 仅返回Cls.associated存在且Associated.scalar为非 NULL 且不等于'somevalue'的行。 以前,这将是一个简单的NOT EXISTS。还添加了一个特殊用例,您可以在
Cls.scalar是基于列的值时调用不带参数的Cls.scalar.has()- 这将返回Cls.associated是否存在任何行,无论Cls.associated.scalar是否为 NULL。另请参阅
参考:#2751
[orm] [bug] ¶
修复了一个晦涩的错误,当跨多对多关系连接/joinedloading到具有特定鉴别器值的单表继承子类时,由于会返回“辅助”行,因此会获取错误的结果。 现在,对于多对多关系上的所有 ORM 连接,在括号内对“辅助”表和右侧表进行内部连接,以便可以准确地过滤左侧->右侧连接。 此更改的实现得益于最终解决了 #2587 中概述的右嵌套连接问题。
参考:#2369
[orm] [bug] ¶
已关闭
Query.select_from()方法的“自动别名”行为。 现在可以通过新的方法Query.select_entity_from()获得特定行为。 此处的自动别名行为从未得到很好的记录,并且通常不是期望的行为,因为Query.select_from()变得更加面向控制 JOIN 的呈现方式。Query.select_entity_from()也将在 0.8 中提供,以便依赖于自动别名的应用程序可以将应用程序转移到使用此方法。参考:#2736
orm 声明式¶
[orm] [declarative] [feature] ¶
添加了一个方便的类装饰器
as_declarative(),它是declarative_base()的包装器,它允许使用简洁的类装饰方法应用现有的基类。此更改也已向后移植到:0.8.3
[orm] [declarative] [feature] ¶
除了列绑定属性之外,ORM 描述符(例如混合属性)现在可以通过
relationship()中与order_by、primaryjoin或类似物一起使用的字符串参数按名称引用。此更改也已向后移植到:0.8.2
参考:#2761
示例¶
[examples] [feature] ¶
改进了
examples/generic_associations中的示例,包括discriminator_on_association.py利用单表继承来使用“鉴别器”完成工作。 还添加了一个真正的“通用外键”示例,其工作方式与其他流行的框架类似,因为它使用开放式整数来指向任何其他表,从而放弃了传统的引用完整性。 虽然我们不推荐这种模式,但信息渴望自由流动。此更改也已向后移植到:0.8.3
[examples] [bug] ¶
在版本控制示例中创建的历史记录表中添加了“autoincrement=False”,因为在任何情况下此表都不应具有自动递增功能,感谢 Patrick Schmid。
此更改也已向后移植到:0.8.3
[examples] [bug] ¶
修复了“版本控制”配方中的一个问题,即当存在反向引用时,即使目标未更改,多对一引用也可能为目标生成无意义的版本。 补丁由 Matt Chisholm 提供。
此更改也已向后移植到:0.8.2
引擎¶
[engine] [feature] ¶
Engine的URL的repr()现在将使用星号隐藏密码。 感谢 Gunnlaugur Þór Briem。此更改也已向后移植到:0.8.3
参考:#2821
[engine] [feature] ¶
添加到
ConnectionEvents的新事件参考:#2770
[engine] [bug] ¶
make_url()函数使用的正则表达式现在解析 ipv6 地址,例如,用方括号括起来。此更改也已向后移植到:0.8.3、0.7.11
参考:#2851
[engine] [bug] [oracle] ¶
如果由于断开连接错误而重新创建
Engine,则不会第二次调用 Dialect.initialize()。 这修复了 Oracle 8 方言中的一个特殊问题,但通常 dialect.initialize() 阶段应每个方言仅执行一次。此更改也已向后移植到:0.8.3
参考:#2776
[engine] [bug] [pool] ¶
修复了如果现有池连接在无效或回收事件后无法重新连接,则
QueuePool会丢失正确的检出计数的错误。此更改也已向后移植到:0.8.3
参考:#2772
[engine] [bug] ¶
修复了当重新生成池时,
Pool的各种实现的reset_on_return参数未传播的错误。 感谢 Eevee。此更改也已向后移植到:0.8.2
[engine] [bug] ¶
Dialect.reflecttable()的方法签名(在所有已知情况下,都由DefaultDialect提供)已收紧为期望include_columns和exclude_columns参数,而没有任何 kw 选项,从而减少了歧义 - 以前缺少exclude_columns。参考:#2748
sql¶
[sql] [feature] ¶
添加了对“唯一约束”反射的支持,通过
Inspector.get_unique_constraints()方法。 感谢 Roman Podolyaka 的补丁。此更改也已向后移植到:0.8.4
参考:#1443
[sql] [feature] ¶
update()、insert()和delete()构造现在会将 ORM 实体解释为要操作的目标表,例如:from sqlalchemy import insert, update, delete ins = insert(SomeMappedClass).values(x=5) del_ = delete(SomeMappedClass).where(SomeMappedClass.id == 5) upd = update(SomeMappedClass).where(SomeMappedClass.id == 5).values(name="ed")
此更改也已向后移植到:0.8.3
[sql] [feature] [mysql] [postgresql] ¶
PostgreSQL 和 MySQL 方言现在支持外键选项的反射/检查,包括 ON UPDATE 和 ON DELETE。PostgreSQL 还支持 MATCH、DEFERRABLE 和 INITIALLY。感谢 ijl 的贡献。
参考: #2183
[sql] [feature] ¶
当在类型表达式中使用带有 “null” 类型(例如,未指定类型)的
bindparam()构造时,现在会进行复制,并且新副本会被分配比较列的实际类型。 以前,此逻辑会在给定的bindparam()上就地发生。 此外,对于传递给ValuesBase.values()的bindparam()构造(用于Insert或Update构造),在构造的编译阶段也会发生类似的过程。这些都是细微的行为更改,可能会影响某些用法。
参考: #2850
[sql] [feature] ¶
对特殊符号(特别是连词)的表达式处理进行了全面改进,例如
Nonenull()true()false(),包括在连词中渲染 NULL 的一致性,包含布尔常量的and_()和or_()表达式的“短路”行为,以及对于不具备true/false常量的后端,布尔常量和表达式的渲染方式(与 “1” 或 “0” 相比)。[sql] [feature] ¶
类型系统现在负责渲染 “字面绑定 (literal bind)” 值,例如,通常是绑定参数的值,但由于上下文,必须作为字符串渲染,通常在 DDL 构造中,如 CHECK 约束和索引(请注意,从 #2742 起,DDL 开始使用 “字面绑定” 值)。 新方法
TypeEngine.literal_processor()作为基础,并且添加了TypeDecorator.process_literal_param()以允许包装原生的字面渲染方法。另请参阅
参考: #2838
[sql] [feature] ¶
Table.tometadata()方法现在会复制结构中所有SchemaItem对象(包括列、约束、外键等)的所有SchemaItem.info字典。 由于这些字典是副本,因此它们独立于原始字典。 以前,此操作中仅传输Column的.info字典,并且它只是就地链接,而不是复制。参考: #2716
[sql] [feature] ¶
Column的default参数现在接受类方法或对象方法作为参数,以及独立的函数; 将正确检测是否接受 “context” 参数。[sql] [feature] ¶
为
insert()构造添加了新方法Insert.from_select()。 给定列列表和一个可选择对象,渲染INSERT INTO (table) (columns) SELECT ..。 虽然此功能作为 0.9 的一部分突出显示,但它也已向后移植到 0.8.3。另请参阅
参考: #722
[sql] [feature] ¶
为
TypeDecorator提供了一个新的属性TypeDecorator.coerce_to_is_types,以更轻松地控制如何使用==或!=与None和布尔类型进行比较,从而生成IS表达式,或者使用绑定参数的普通相等表达式。[sql] [feature] ¶
如果
label()构造的名称也在 select 的列子句中被引用,则该构造现在将在ORDER BY子句中仅渲染其名称,而不是重写完整的表达式。 这使数据库有更好的机会优化在两个不同上下文中对同一表达式的求值。参考: #1068
[sql] [bug] ¶
修复了追溯到 0.7.9 的回归错误,其中 CTE 的名称如果在多个 FROM 子句中引用,可能无法正确引用。
此更改也已向后移植到:0.8.3、0.7.11
参考: #2801
[sql] [bug] [cte] ¶
修复了公用表表达式系统中的错误,如果 CTE 仅用作
alias()构造,则不会使用 WITH 关键字渲染。此更改也已向后移植到:0.8.3、0.7.11
参考: #2783
[sql] [bug] ¶
修复了
CheckConstraintDDL 中的错误,其中Column对象的 “quote” 标志不会被传播。此更改也已向后移植到:0.8.3、0.7.11
参考: #2784
[sql] [bug] ¶
修复了
type_coerce()无法正确解释带有__clause_element__()方法的 ORM 元素的错误。此更改也已向后移植到:0.8.3
参考: #2849
[sql] [bug] ¶
Enum和Boolean类型现在在为 “非原生” 类型生成 CHECK 约束时,会绕过任何自定义(例如 TypeDecorator)类型。 这是为了使自定义类型不参与 CHECK 中的表达式,因为此表达式是针对 “impl” 值而不是 “decorated” 值。此更改也已向后移植到:0.8.3
参考: #2842
[sql] [bug] ¶
Index上的.unique标志如果从未指定unique的Column生成(其中默认为None),则可能生成为None。 该标志现在将始终为True或False。此更改也已向后移植到:0.8.3
参考: #2825
[sql] [bug] ¶
修复了默认编译器以及 postgresql、mysql 和 mssql 的编译器中的错误,以确保任何字面 SQL 表达式值在 CREATE INDEX 语句中都直接渲染为字面值,而不是作为绑定参数。 这也更改了其他 DDL(例如约束)的渲染方案。
此更改也已向后移植到:0.8.3
参考: #2742
[sql] [bug] ¶
如果
select()在其 FROM 子句中引用自身(通常通过就地修改),则会引发信息丰富的错误消息,而不是导致递归溢出。此更改也已向后移植到:0.8.3
参考: #2815
[sql] [bug] ¶
修复了使用
column_reflect事件更改传入的Column的.key会阻止正确反射主键约束、索引和外键约束的错误。此更改也已向后移植到:0.8.3
参考: #2811
[sql] [bug] ¶
在 0.8 中添加的
ColumnOperators.notin_()运算符现在在针对空集合使用时,可以正确生成表达式 “IN” 返回值的否定。此更改也已向后移植到:0.8.3
[sql] [bug] [postgresql] ¶
修复了表达式系统依赖于
select()构造上的.c集合的str()形式的错误,但str()形式不可用,因为该元素依赖于方言特定的编译构造,特别是与 PostgreSQLARRAY元素一起使用的__getitem__()运算符。 此修复程序还添加了一个新的异常类UnsupportedCompilationError,当编译器被要求编译它不知道如何编译的内容时,会引发该异常。此更改也已向后移植到:0.8.3
参考: #2780
[sql] [bug] ¶
对
Select构造的相关行为进行了多项修复,这些构造首次在 0.8.0 中引入为了满足 FROM 条目应向外关联到包含另一个 SELECT 的 SELECT,然后包含此 SELECT 的用例,当通过
Select.correlate()建立显式关联时,关联现在可以跨多个级别工作,前提是目标 select 位于 WHERE/ORDER BY/columns 子句包含的链中的某个位置,而不仅仅是嵌套的 FROM 子句中。 这使得Select.correlate()的行为再次与 0.7 的行为更兼容,同时仍然保持新的 “智能” 关联。当不使用显式关联时,通常的 “隐式” 关联将其行为限制为仅限直接封闭的 SELECT,以最大限度地提高与 0.7 应用程序的兼容性,并且在这种情况下也防止跨嵌套 FROM 的关联,从而保持与 0.8.0/0.8.1 的兼容性。
Select.correlate_except()方法并非在所有情况下都阻止给定 FROM 子句的关联,并且还会导致 FROM 子句被完全错误地省略(更像 0.7 的行为),这已得到修复。调用 select.correlate_except(None) 将按预期将所有 FROM 子句输入到关联中。
此更改也已向后移植到:0.8.2
[sql] [bug] ¶
修复了将表 “A” 的 select() 与到表 “B” 的多个外键路径连接到表 “B” 时,将无法生成 “ambiguous join condition” 错误(如果您将表 “A” 直接连接到 “B”,则会报告该错误)的错误; 它将改为生成具有多个条件的连接条件。
此更改也已向后移植到:0.8.2
参考: #2738
[sql] [bug] [reflection] ¶
修复了在远程模式以及本地模式中使用
MetaData.reflect()可能会在两个模式都具有同名表的情况下产生错误结果的错误。此更改也已向后移植到:0.8.2
参考: #2728
[sql] [bug] ¶
从基本
ColumnOperators类中删除了 “未实现” 的__iter__()调用,虽然这是在 0.8.0 中引入的,目的是防止当您还在自定义运算符上实现__getitem__()方法,然后错误地在该对象上调用list()时,出现无限的、内存不断增长的循环,但它的效果是导致列元素报告它们实际上是可迭代类型,然后在您尝试迭代时抛出错误。 这里没有真正两全其美的方法,因此我们坚持 Python 的最佳实践。 请谨慎在您的自定义运算符上实现__getitem__()!此更改也已向后移植到:0.8.2
参考: #2726
[sql] [bug] ¶
在调用 “attach” 事件之前,在
Index上设置了 “name” 属性,以便可以使用附加事件根据父表和/或列动态生成索引的名称。参考: #2835
[sql] [bug] ¶
已从
ForeignKey对象中删除了错误的 kw 参数 “schema”。 这是一个意外的提交,没有任何作用; 当使用此 kw 参数时,0.8.3 中会引发警告。参考: #2831
[sql] [bug] ¶
对处理 “quoted” 标识符的方式进行了返工,不再依赖于各种
quote=True标志的传递,而是将这些标志转换为富字符串对象,并在将其传递给公共模式构造(如Table、Column等)时包含引用信息。 这解决了各种不正确地遵守 “quote” 标志的方法的问题,例如Engine.has_table()和相关方法。quoted_name对象是字符串子类,如果需要,也可以显式使用; 该对象将保留传递的引用首选项,并且还将绕过方言(例如 Oracle、Firebird 和 DB2)执行的标准化为大写符号的 “名称规范化”。 结果是 “大写” 后端现在可以使用强制引用的名称,例如小写引用名称和新的保留字。另请参阅
参考: #2812
[sql] [bug] ¶
已返工
ForeignKey对象到其目标Column的解析,使其尽可能立即生效,基于目标Column与此ForeignKey关联到同一MetaData的时刻,而不是等待首次构造连接或类似操作。 这与其他改进一起,允许更早地检测到某些外键配置问题。 这里还包括类型传播系统的返工,因此现在可以可靠地将类型设置为None在任何通过ForeignKey引用另一个的Column上 - 类型将尽快从目标列复制,并且现在也适用于复合外键。参考: #1765
postgresql¶
[postgresql] [feature] ¶
已添加对 PostgreSQL 9.2 范围类型的支持。 目前,未提供类型转换,因此目前直接使用字符串或 psycopg2 2.5 范围扩展类型。 补丁由 Chris Withers 提供。
此更改也已向后移植到:0.8.2
[postgresql] [feature] ¶
在使用 psycopg2 DBAPI 时,添加了对 “AUTOCOMMIT” 隔离级别的支持。 关键字可通过
isolation_level执行选项获得。 补丁由 Roman Podolyaka 提供。此更改也已向后移植到:0.8.2
参考: #2072
[postgresql] [feature] ¶
当在主键自增列上使用
SmallInteger类型时,基于 PostgreSQL 版本 9.2 或更高版本的服务器版本检测,添加了对渲染SMALLSERIAL的支持。参考: #2840
[postgresql] [bug] ¶
从列的服务器默认值的反射中删除了 128 个字符的截断; 此代码最初来自 PG 系统视图,该视图截断了字符串以提高可读性。
此更改也已向后移植到:0.8.3
参考: #2844
[postgresql] [bug] ¶
括号将应用于 CREATE INDEX 语句的列列表中渲染的复合 SQL 表达式。
此更改也已向后移植到:0.8.3
参考: #2742
[postgresql] [bug] ¶
修复了在单词 “PostgreSQL” 或 “EnterpriseDB” 之前的 PostgreSQL 版本字符串带有前缀时无法解析的错误。 感谢 Scott Schaefer 的贡献。
此更改也已向后移植到:0.8.3
参考: #2819
[postgresql] [bug] ¶
已简化 PostgreSQL 方言上的
extract()的行为,不再将硬编码的::timestamp或类似的强制转换注入到给定的表达式中,因为这会干扰时区感知日期时间等类型,但对于现代版本的 psycopg2 而言,似乎根本没有必要。此更改也已向后移植到:0.8.2
参考: #2740
[postgresql] [bug] ¶
修复了 HSTORE 类型中的错误,其中在使用 “非原生” (即非 psycopg2)方式翻译 HSTORE 数据时,包含反斜杠引号的键/值无法正确转义。 补丁由 Ryan Kelly 提供。
此更改也已向后移植到:0.8.2
参考: #2766
[postgresql] [bug] ¶
修复了多列 PostgreSQL 索引中的列顺序将以错误顺序反射的错误。 感谢 Roman Podolyaka 的贡献。
此更改也已向后移植到:0.8.2
参考: #2767
mysql¶
[mysql] [feature] ¶
与
Index一起使用的mysql_length参数现在可以作为列名/长度的字典传递,用于复合索引。 非常感谢 Roman Podolyaka 的补丁。此更改也已向后移植到:0.8.2
参考: #2704
[mysql] [feature] ¶
MySQL
SET类型现在具有与ENUM相同的自动引用行为。 设置值时不需要引号,但存在的引号将被自动检测到,并发出警告。 这也有助于 Alembic,其中 SET 类型不使用引号渲染。参考: #2817
[mysql] [bug] ¶
MySQL 5.5、5.6 版本的保留字更新,感谢 Hanno Schlichting 的贡献。
此更改也已向后移植到:0.8.3、0.7.11
参考: #2791
[mysql] [bug] ¶
#2721 中的更改是 MySQL 后端上
ForeignKeyConstraint的deferrable关键字被静默忽略,这将在 0.9 中恢复; 此关键字现在将再次渲染,并在 MySQL 上引发错误,因为它不被理解 - 相同的行为也将应用于initially关键字。 在 0.8 中,关键字将保持忽略状态,但会发出警告。 此外,match关键字现在在 0.9 上引发CompileError,并在 0.8 上发出警告; 此关键字不仅被 MySQL 静默忽略,而且还会破坏 ON UPDATE/ON DELETE 选项。要使用在 MySQL 上不渲染或以不同方式渲染的
ForeignKeyConstraint,请使用自定义编译选项。 文档中已添加此用法的示例,请参阅 MySQL / MariaDB 外键。此更改也已向后移植到:0.8.3
[mysql] [bug] ¶
MySQL-connector 方言现在允许 create_engine 查询字符串中的选项覆盖 connect 中设置的默认值,包括 “buffered” 和 “raise_on_warnings”。
此更改也已向后移植到:0.8.3
参考: #2515
[mysql] [bug] ¶
修复了当使用多表 UPDATE 时,补充表是一个带有自身绑定参数的 SELECT 时,在使用 MySQL 的特殊语法时,绑定参数的定位将与语句本身相反的错误。
此更改也已向后移植到:0.8.2
参考: #2768
[mysql] [bug] ¶
为
mysql+gaerdbms方言添加了另一个条件,以检测所谓的“开发”模式,在这种模式下,我们应该使用rdbms_mysqldbDBAPI。补丁由 Brett Slatkin 提供。此更改也已向后移植到:0.8.2
References: #2715
[mysql] [bug] ¶
ForeignKey和ForeignKeyConstraint上的deferrable关键字参数不会在 MySQL 方言上呈现DEFERRABLE关键字。长期以来,我们一直保持这样,因为不可延迟的外键与可延迟的外键的行为会非常不同,但某些环境只是禁用了 MySQL 上的外键,因此我们将减少在此问题上的主观臆断。此更改也已向后移植到:0.8.2
References: #2721
[mysql] [bug] ¶
修复并测试了反射中 MySQL 外键选项的解析;这补充了 #2183 中的工作,我们在其中开始支持外键选项的反射,例如 ON UPDATE/ON DELETE cascade。
References: #2839
[mysql] [bug] ¶
改进了对 cymysql 驱动程序的支持,支持 0.6.5 版本,由 Hajime Nakagami 提供。
sqlite¶
mssql¶
oracle¶
misc¶
[feature] ¶
为
Column添加了一个新的标志system=True,它将列标记为数据库自动呈现的“系统”列(例如 PostgreSQLoid或xmin)。该列将从CREATE TABLE语句中省略,但仍可用于查询。此外,CreateColumn构造可以应用于自定义编译规则,该规则允许跳过列,方法是生成一个返回None的规则。此更改也已向后移植到:0.8.3
[feature] [firebird] ¶
为 kinterbasdb 和 fdb 方言添加了新的标志
retaining=True。这控制发送到 DBAPI 连接的commit()和rollback()方法的retaining标志的值。由于历史原因,此标志在 0.8.2 中默认为True,但在 0.9.0b1 中,此标志默认为False。此更改也已向后移植到:0.8.2
References: #2763
[feature] [core] ¶
为
UpdateBase.returning()添加了一个新的变体,称为ValuesBase.return_defaults();这允许将任意列添加到语句的 RETURNING 子句中,而不会干扰编译器通常的“隐式返回”功能,该功能用于有效地获取新生成的主键值。对于支持的后端,所有获取的值的字典都存在于ResultProxy.returned_defaults中。参考:#2793
[feature] [pool] ¶
为“rollback-on-return”和较少使用的“commit-on-return”添加了池日志记录。这与其余池“debug”日志记录一起启用。
References: #2752
[feature] [firebird] ¶
现在,当指定时不带方言限定符时,
fdb方言是默认方言,即firebird://,根据 Firebird 项目发布fdb作为其官方 Python 驱动程序。References: #2504
[bug] [firebird] ¶
修复了反射 Firebird 类型 LONG 和 INT64 时的类型查找,以便将 LONG 视为 INTEGER,将 INT64 视为 BIGINT,除非该类型具有“precision”,在这种情况下,它将被视为 NUMERIC。补丁由 Russell Stuart 提供。
此更改也已向后移植到:0.8.2
References: #2757
[bug] [ext] ¶
修复了以下错误:如果使用函数而不是类设置复合类型,则当可变扩展试图检查该列是否为
MutableComposite时会出错(实际上它不是)。由 asldevi 提供。此更改也已向后移植到:0.8.2
[requirements] ¶
现在需要 Python mock 库才能运行单元测试套件。虽然自 Python 3.3 起已成为标准库的一部分,但以前的 Python 安装需要安装此库才能运行单元测试或将
sqlalchemy.testing包用于外部方言。此更改也已向后移植到:0.8.2
flambé! the dragon and The Alchemist image designs created and generously donated by Rotem Yaari.
Created using Sphinx 7.2.6. Documentation last generated: Tue 11 Mar 2025 02:40:17 PM EDT