SqlAlchemy 2.0 中文文档(六十三)(4)https://developer.aliyun.com/article/1560864
1.0.0b1
发布日期:2015 年 3 月 13 日
版本 1.0.0b1 是 1.0 系列的第一个发布版本。这里描述的许多更改也存在于 0.9 系列,有时也存在于 0.8 系列。对于特定于 1.0 且强调兼容性问题的更改,请参阅 SQLAlchemy 1.0 中的新功能是什么?。
通用
- [通用] [功能]
通过更多地使用__slots__
来改进结构内存使用,特别针对具有大量表和列的大型应用程序的基本内存大小进行了优化,并大大减少了各种高容量对象的内存大小,包括事件监听内部、比较器对象以及 ORM 属性和加载器策略系统的部分。
另请参阅
结构内存使用方面的显著改进 - [通用] [错误]
现在为所有那些作为“公共工厂”符号派生的 SQL 和 ORM 函数设置了__module__
属性,这应有助于文档工具能够报告目标模块。
参考:#3218
orm
- [orm] [功能]
向Query.column_descriptions
返回的字典中添加了一个新条目"entity"
。这指的是由表达式引用的主 ORM 映射类或别名类。与现有的"type"
条目相比,它将始终是一个映射实体,即使从列表达式中提取,或者如果给定表达式是纯核心表达式,则为 None。另请参阅修复了此功能中的回归的 #3403,该功能未在 0.9.10 中发布,但在 1.0 版本中发布。
此更改也被回溯到:0.9.10
参考:#3320 - [orm] [功能]
添加了新参数Session.connection.execution_options
,可用于在首次检出连接之前设置Connection
上的执行选项,事务开始之前。这用于在事务开始之前在连接上设置隔离级别等选项。
另请参阅
设置事务隔离级别 / DBAPI AUTOCOMMIT - 新文档部分详细介绍了使用会话设置事务隔离的最佳实践。
此更改也回溯到:0.9.9
参考:#3296 - [orm] [功能]
添加了新方法Session.invalidate()
,功能类似于Session.close()
,但还调用所有连接的Connection.invalidate()
,确保它们不会返回到连接池。在处理 gevent 超时等情况时非常有用,此时进一步使用连接是不安全的,即使是用于回滚。
此更改也回溯到:0.9.9 - [orm] [功能]
“primaryjoin”模型已经进一步扩展,允许一个严格从单个列到自身的连接条件,通过某种 SQL 函数或表达式进行转换。这有点实验性,但第一个概念验证是一个“材料化路径”连接条件,其中一个路径字符串与自身使用“like”进行比较。ColumnOperators.like()
操作符也已添加到可在 primaryjoin 条件中使用的有效操作符列表中。
此更改也回溯到:0.9.5
参考:#3029 - [orm] [功能]
添加了新的实用函数make_transient_to_detached()
,可用于制造行为就像从会话加载然后分离的对象。不存在的属性被标记为过期,并且对象可以添加到一个会话中,它将表现得像一个持久对象。
此更改也回溯到:0.9.5
参考:#3017 - [orm] [功能]
添加了一个新的事件套件QueryEvents
。QueryEvents.before_compile()
事件允许创建函数,在构建 SELECT 语句之前对Query
对象进行额外修改。希望通过引入一个新的检查系统,使这个事件变得更加有用,该系统将允许对Query
对象进行详细的自动修改。
另请参阅QueryEvents
参考:#3317 - [orm] [功能]
当使用连接预加载与具有 LIMIT、OFFSET 或 DISTINCT 的一对多查询时,如果一对一关系也被禁用,即一对多关系中relationship.uselist
设置为 False,将禁用子查询包装。这将在这些情况下产生更有效的查询。
另请参阅
子查询不再适用于 uselist=False 的连接预加载
参考:#3249 - [orm] [功能]
映射状态内部已经重新设计,以允许将对象的“过期”(如Session.commit()
和Session.expire_all()
中的“自动过期”功能)以及在对象状态被垃圾回收时发生的“清理”步骤的调用次数减少 50%。
参考:#3307 - [orm] [功能]
当将相同的多态标识分配给同一层次结构中的两个不同的映射器时,会发出警告。这通常是用户错误,意味着在加载时无法正确区分两种不同的映射类型。感谢 Sebastian Bank 的拉取请求。
参考:#3262 - [orm] [功能]
创建了一系列新的Session
方法,直接提供钩子到工作单元的功能,用于发出 INSERT 和 UPDATE 语句。当正确使用时,这种面向专家的系统可以允许使用 ORM 映射生成批量插入和更新语句,批量分组执行语句,使语句的速度与直接使用 Core 相媲美。
另请参阅
批量操作
参考:#3100 - [orm] [feature]
添加了一个参数Query.join.isouter
,它与调用Query.outerjoin()
是同义的;此标志旨在提供与 CoreFromClause.join()
更一致的接口。感谢 Jonathan Vanasco 提供的拉取请求。
参考:#3217 - [orm] [feature]
添加了新的事件处理程序AttributeEvents.init_collection()
和AttributeEvents.dispose_collection()
,用于跟踪集合首次与实例关联以及替换集合的情况。这些处理程序取代了collection.linker()
注释。旧的钩子通过事件适配器仍然受支持。 - [orm] [feature]
当Query
与映射或选项一起使用Query.yield_per()
时,将引发异常,其中子查询急加载或与集合一起的连接急加载将发生。这些加载策略目前与 yield_per 不兼容,因此通过引发此错误,该方法更安全。可以使用lazyload('*')
选项或Query.enable_eagerloads()
来禁用急加载。
另请参阅
使用 yield_per 明确禁止连接/子查询急加载 - [orm] [feature]
Query
对象使用的KeyedTuple
的新实现在获取大量面向列的行时提供了显著的速度改进。
另请参阅
新的 KeyedTuple 实现速度显著提升
参考:#3176 - [orm] [feature]
当内连接的 eager load 链接到外连接的 eager load 时,joinedload.innerjoin
和relationship.innerjoin
的行为现在默认使用“嵌套”内连接,即右嵌套。
另请参阅
右内连接嵌套现在是 joinedload 的默认设置,innerjoin=True
参考:#3008 - [orm] [功能]
现在可以将 UPDATE 语句批量处理到更高效的 executemany() 调用中,类似于 INSERT 语句的批量处理;这将在 flush 中被调用,前提是后续的 UPDATE 语句针对相同的映射和表涉及相同的列在 VALUES 子句中,没有嵌入 SET 级别的 SQL 表达式,并且映射的版本要求与后端方言能够返回 executemany 操作的正确行数的兼容性。 - [orm] [功能]
info
参数已添加到SynonymProperty
和ComparableProperty
的构造函数中。
参考:#2963 - [orm] [功能]
InspectionAttr.info
集合现在移动到InspectionAttr
,除了在所有MapperProperty
对象上可用外,现在还可以在混合属性、关联代理上使用,通过Mapper.all_orm_descriptors
访问。
参考:#2971 - [orm] [变更]
如果映射属性标记为延迟加载而没有明确取消延迟加载,则即使它们的列以某种方式出现在结果集中,它们现在仍将保持“延迟加载”。这是一个性能增强,因为 ORM 加载不再花费时间搜索每个延迟加载列,当结果集被获取时。然而,对于一直依赖于此的应用程序,现在应该使用显式的undefer()
或类似选项。 - [orm] [更改]
传递给自定义Bundle
类的create_row_processor()
方法的proc()
可调用现在只接受一个“row”参数。
另请参阅
当使用自定义行加载程序时,新 Bundle 功能的 API 更改 - [orm] [更改]
已弃用的事件钩子已移除:populate_instance
、create_instance
、translate_row
、append_result
另请参阅
已弃用的 ORM 事件钩子已移除 - [orm] [bug]
修复了子查询急加载中的 bug,其中在跨多态子类边界的一长串急加载中,与多态加载一起会无法找到链中的子类链接,导致在AliasedClass
上出现缺少属性名称的错误。
此更改也已回溯到:0.9.5、0.8.7
参考:#3055 - [orm] [bug]
修复了 ORM 中的 bug,class_mapper()
函数会掩盖应在映射器配置期间引发的 AttributeErrors 或 KeyErrors,因为用户错误。捕获属性/键错误的方式更具体,不包括配置步骤。
此更改也已回溯到:0.9.5、0.8.7
参考:#3047 - [orm] [bug]
修复了 ORM 对象比较中的 bug,其中对于多对一的!= None
比较,如果源是一个别名类,或者查询需要对表达式应用特殊别名,因为别名连接或多态查询,比较多对一与对象状态会失败;还修复了比较多对一与对象状态时的 bug,如果查询需要应用特殊别名,因为别名连接或多态查询。
此更改也已回溯到:0.9.9
参考:#3310 - [orm] [bug]
修复了一个 bug,在after_rollback()
处理程序为Session
错误地在处理程序内向该Session
添加状态时,内部断言会失败,并且尝试警告和移除此状态的任务(由 #2389 确定)会继续进行。
此更改也已回溯到:0.9.9
参考:#3309 - [orm] [bug]
修复了一个 bug,当调用Query.join()
时,带有未知关键字参数会由于格式错误而引发自己的 TypeError 错误。感谢 Malthe Borch 提交的拉取请求。
此更改也已回溯到:0.9.9 - [orm] [bug]
修复了懒加载 SQL 构造中的 bug,其中一个复杂的 primaryjoin 在“指向自身的列”的自引用连接风格中多次引用相同的“本地”列时,在所有情况下都不会被替换。这里重新设计了确定替换的逻辑,使其更加开放。
此更改也回溯到:0.9.9
参考:#3300 - [orm] [bug]
“通配符”加载器选项,特别是由load_only()
选项设置的选项,以覆盖未明确提及的所有属性,现在考虑到给定实体的超类,如果该实体使用继承映射进行映射,则超类中的属性名称也将从加载中省略。此外,多态鉴别器列无条件地包含在列表中,就像主键列一样,因此即使设置了 load_only(),子类型的多态加载仍将正常工作。
此更改也回溯到:0.9.9
参考:#3287 - [orm] [bug] [pypy]
修复了一个错误,即如果在Query
在获取结果之前抛出异常,特别是当无法形成行处理器时,游标将保持打开状态,结果仍在等待中,实际上并未关闭。这通常只在像 PyPy 这样的解释器上出现问题,其中游标不会立即被 GC 回收,并且在某些情况下可能导致事务/锁定打开时间过长。
此更改也回溯到:0.9.9
参考:#3285 - [orm] [bug]
修复了一个泄漏问题,该问题会在不支持且极不推荐的情况下多次替换固定映射类上的关系时发生,涉及任意增长数量的目标映射器。在替换旧关系时会发出警告,但如果映射已用于查询,则旧关系仍将在某些注册表中被引用。
此更改也回溯到:0.9.9
参考:#3251 - [orm] [bug] [sqlite]
修复了关于表达式变异的错误,当使用Query
从多个匿名列实体中选择时,在针对 SQLite 进行查询时,可能会表现为“找不到列”错误,这是 SQLite 方言使用的“联接重写”功能的副作用。
此更改也回溯到:0.9.9
参考:#3241 - [orm] [bug]
修复了一个错误,即对于使用of_type()
连接到单继承子类的Query.join()
和Query.outerjoin()
的 ON 子句,如果设置了from_joinpoint=True
标志,则不会在 ON 子句中呈现“单表条件”。
此更改也已回溯至:0.9.9
参考:#3232 - [orm] [bug] [engine]
修复了一个 bug,影响了与#3199相同类别的事件,当使用named=True
参数时会出现问题。一些事件将无法注册,而其他事件将无法正确调用事件参数,通常在事件被“包装”以适应其他方式时。已重新排列“named”机制,以不干扰内部包装函数所期望的参数签名。
此更改也已回溯至:0.9.8
参考:#3197 - [orm] [bug]
修复了一个 bug,影响了许多类别的事件,特别是 ORM 事件,但也包括引擎事件,其中“去重复”冗余调用listen()
的通常逻辑失败,对于那些监听函数被包装的事件。在 registry.py 中会触发一个断言。现在,这个断言已经整合到去重复检查中,额外的好处是更简单地检查整体的去重复。
此更改也已回溯至:0.9.8
参考:#3199 - [orm] [bug]
修复了一个警告,当一个复杂的自引用的主连接包含函数时,同时指定了remote_side
时会发出警告;警告会建议设置“remote side”。现在只有在remote_side
不存在时才会发出警告。
此更改也已回溯至:0.9.8
参考:#3194 - [orm] [bug] [eagerloading]
修复了一个由#2976引起的回归,发布于 0.9.4,其中沿着一系列连接的连接贪婪加载的“外连接”传播会错误地将一个“内连接”沿着兄弟连接路径转换为外连接,当只有后代路径应该接收“外连接”传播时;此外,修复了相关问题,即“嵌套”连接传播会不适当地发生在两个兄弟连接路径之间。
此更改也已回溯至:0.9.7
参考:#3131 - [orm] [bug]
由于#2736导致从 0.9.0 中的一个回归,Query.select_from()
方法不再正确设置Query
对象的“from entity”,因此随后的Query.filter_by()
或Query.join()
调用将无法在按字符串名称搜索属性时检查适当的“from”实体。
此更改也回溯到:0.9.7
参考:#2736,#3083 - [orm] [bug]
修复了在保存点块内持久化、删除或主键更改的项目在外部事务回滚后不参与恢复到其先前状态(不在会话中、在会话中、先前 PK)的错误。
此更改也回溯到:0.9.7
参考:#3108 - [orm] [bug]
修复了与with_polymorphic()
结合使用的子查询急加载中的错误,在子查询加载中对实体和列的定位相对于此类型的实体和其他实体更加准确。
此更改也回溯到:0.9.7
参考:#3106 - [orm] [bug]
已添加额外的检查,用于在继承映射器隐式组合其基于列的属性与父级的属性之一时,其中这些列通常不一定共享相同的值。这是通过#1892添加的现有检查的扩展;但是,这个新检查只发出警告,而不是异常,以允许依赖于现有行为的应用程序。
另请参阅
我收到关于“隐式组合列 X 在属性 Y 下”的警告或错误
此更改也回溯到:0.9.5
参考:#3042 - [orm] [bug]
修改了load_only()
的行为,使得主键列始终被添加到“未延迟加载”列的列表中;否则,ORM 无法加载行的标识。显然,可以推迟映射的主键,ORM 将失败,这一点没有改变。但是,由于 load_only 本质上是在说“除了 X 之外都推迟”,因此 PK 列不参与此推迟更为关键。
此更改也回溯到:0.9.5
参考:#3080 - [orm] [bug]
修复了在所谓的“行切换”场景中出现的一些边缘情况,其中 INSERT/DELETE 可以转换为 UPDATE。在这种情况下,将多对一关系设置为 None,或在某些情况下将标量属性设置为 None,可能不会被检测为值的净变化,因此 UPDATE 不会重置前一行上的内容。这是由于属性历史记录的一些尚未解决的副作用导致的,隐式地假定 None 对于先前未设置的属性实际上不是一个“变化”。另请参见#3061。
注意
此更改已在 0.9.6 中撤销。完整的修复将在 SQLAlchemy 的 1.0 版本中实现。
此更改也回溯到:0.9.5
参考:#3060 - [orm] [bug]
与#3060相关,对工作单元进行了调整,以便在要删除的自引用对象图中,加载相关的多对一对象更加积极,以帮助确定删除顺序,如果未设置passive_deletes
。
此更改也回溯到:0.9.5 - [orm] [bug]
修复了 SQLite 连接重写中的错误,由于重复导致的匿名列名不会在子查询中正确重写。这会影响带有任何类型的子查询 + 连接的 SELECT 查询。
此更改也回溯到:0.9.5
参考:#3057 - [orm] [bug] [sql]
修复了在#2804中对新增增强的布尔强制转换规则的修复,其中“where”和“having”的新规则不会对select()
构造函数的“whereclause”和“having”关键字参数生效,而Query
也使用了这个构造函数,因此在 ORM 中也无法正常工作。
此更改也回溯到:0.9.5
参考:#3013 - [orm] [bug]
修复了会话附加错误“对象已附加到会话 X”无法阻止对象在错误引发后继续执行的情况下也附加到新会话的错误。
参考:#3301 - [orm] [bug]
当调用Query.count()
、Query.update()
、Query.delete()
以及针对映射列、column_property
对象以及从映射列派生的 SQL 函数和表达式的查询时,现在Query
的主要Mapper
将传递给Session.get_bind()
方法。这使得依赖于自定义Session.get_bind()
方案或“绑定”元数据的会话在所有相关情况下都能正常工作。
另请参阅
Session.get_bind()将在所有相关的查询情况下接收到 Mapper
参考:#1326, #3227, #3242 - [orm] [bug]
PropComparator.of_type()
修饰符已经与加载指令(如joinedload()
和contains_eager()
)一起改进,以便如果遇到两个相同基本类型/路径的PropComparator.of_type()
修饰符,它们将被合并为单个“多态”实体,而不是用类型 B 的实体替换类型 A 的实体。例如,A.b.of_type(BSub1)->BSub1.c
的 joinedload 与A.b.of_type(BSub2)->BSub2.c
的 joinedload 将创建一个单个的 joinedloadA.b.of_type((BSub1, BSub2)) -> BSub1.c, BSub2.c
,而不需要在查询中显式使用with_polymorphic
。
另请参阅
多态子类型的急加载 - 包含一个更新的示例,展示了新的格式。
参考:#3256 - [orm] [bug]
修复了当CascadeOptions
参数使用copy.deepcopy()
调用时的支持,这种情况发生在relationship()
与copy.deepcopy()
一起使用时(这不是官方支持的用例)。感谢 duesenfranz 的拉取请求。 - [orm] [bug]
修复了Session.expunge()
在对象经历了已刷新但未提交的删除操作后,无法完全分离给定对象的错误。这也会影响到make_transient()
等相关操作。
另请参阅
session.expunge() 现在会完全分离已删除的对象
参考:#3139 - [orm] [bug]
在多个关系最终将填充与另一个冲突的外键列的情况下,会发出警告,其中关系试图从不同源列复制值。这发生在将具有重叠列的复合外键映射到每个引用列不同的关系的情况下。一个新的文档部分说明了示例以及如何通过在每个关系上明确指定“外键”列来克服该问题。
另请参阅
重叠的外键
参考:#3230 - [orm] [bug]
Query.update()
方法现在会将给定值字典中的字符串键名转换为正在更新的映射类的映射属性名称。以前,字符串名称直接被接受并传递给核心更新语句,没有任何方法可以解析到映射实体。Query.update()
的主题属性也支持同义词和混合属性。
另请参阅
query.update() 现在将字符串名称解析为映射的属性名称
参考:#3228 - [orm] [bug]
改进了Session
用于定位“绑定”(例如要使用的引擎)的机制,这些引擎可以与混合类、具体子类以及更广泛的表元数据(如联合继承表)关联。
另请参阅
Session.get_bind() 处理更广泛的继承场景
参考:#3035 - [orm] [bug]
修复了单表继承中的一个 bug,其中包含了多次包含相同单一继承实体的连接链(通常应该引发错误)的情况,可能会在某些情况下,取决于从何处连接,隐式别名第二个单一继承实体的情况,生成一个“有效”的查询。但由于这种隐式别名并不是单表继承的意图,它并没有完全“有效”,并且非常具有误导性,因为它并不总是出现。
另请参阅
处理重复连接目标中的更改和修复
参考:#3233 - [orm] [bug]
当使用Query.join()
、Query.outerjoin()
或独立的join()
/outerjoin()
函数连接到单一继承子类时,生成的 ON 子句现在将包括“单表条件”,即使 ON 子句是手动编写的;它现在使用 AND 将条件添加到 ON 子句中,方式与使用 relationship 或类似方法连接到单表目标时相同。
这在功能和 bug 之间有些模糊。
另请参阅
单表继承条件已无条件地添加到所有 ON 子句中
参考:#3222 - [orm] [bug]
对表达式标签的行为进行了重大改进,特别是在与具有自定义 SQL 表达式的 ColumnProperty 构造一起使用时,以及与首次在 0.9 中引入的“按标签排序”逻辑结合使用时。修复包括,现在order_by(Entity.some_col_prop)
将即使 Entity 经过别名处理(通过继承渲染或通过使用aliased()
构造)也将使用“按标签排序”规则;使用别名多次渲染相同的列属性(例如query(Entity.some_prop, entity_alias.some_prop)
)将为实体的每次出现标记一个不同的标签,并且此外,“按标签排序”规则将适用于两者(例如order_by(Entity.some_prop, entity_alias.some_prop)
)。在 0.9 中可能阻止“按标签排序”逻辑工作的其他问题,尤其是标签的状态可能会发生变化,以至于“按标签排序”会根据调用方式停止工作的问题已经修复。
另请参阅
ColumnProperty 构造与别名、order_by 更好地配合
参考:#3148, #3188 - [orm] [bug]
改变了使用Query.from_self()
或其常见用户Query.count()
时应用“单一继承标准”的方法。现在,将限制行数为特定类型的标准指示在内部子查询中,而不是外部子查询中,因此即使“type”列不在列子句中可用,我们也可以在“内部”查询中对其进行过滤。
另请参阅
使用 from_self()、count()时单表继承标准的更改
参考:#3177 - [orm] [bug]
对懒加载机制进行了小的调整,以减少在极为罕见的情况下干扰joinload()
的可能性,即对象指向自身;在这种情况下,对象在加载其属性时会引用自身,这可能会导致加载器之间的混乱。“对象指向自身”的用例并未得到完全支持,但修复也减少了一些开销,因此目前是测试的一部分。
参考:#3145 - [orm] [bug]
已删除“复活”ORM 事件。自从 0.8 版本中删除了旧的“可变属性”系统后,此事件挂钩就没有任何目的了。
参考:#3171 - [orm] [bug]
修复了一个 bug,当属性“set”事件或带有@validates
的列在刷新过程中触发事件时,当这些列是“获取和填充”操作的目标时,例如自增主键、Python 端默认值或通过 RETURNING“急切”获取的服务器端默认值。
参考:#3167 - [orm] [bug] [py3k]
从Session.identity_map
暴露的IdentityMap
现在在 Py3K 中为items()
和values()
返回列表。早期移植到 Py3K 时,这些返回迭代器,但从技术上讲应该是“可迭代视图”…目前,列表是可以的。 - [orm] [bug]
查询.update()/delete()的“评估器”不适用于多表更新,并且需要设置为 synchronize_session=False 或 synchronize_session=’fetch’;现在会引发异常,并显示更改同步设置的消息。这是从 0.9.7 开始发出的警告升级。
参考:#3117 - [orm] [enhancement]
调整属性机制,关于何时通过首次访问隐式初始化值为 None;这一操作,一直导致属性的填充,但现在不再这样;返回 None 值,但底层属性不接收设置事件。这与集合的工作方式一致,并允许属性机制更一致地行为;特别是,获取一个没有值的属性不会压制事件,如果值实际上被设置为 None,则事件应该继续。
请参见
关于没有预先存在值的属性事件和其他操作的更改
其中绑定参数根据编译时选项作为字符串内联呈现。此功能的工作由 Dobes Vandermeer 提供。
请参见
Select/Query LIMIT / OFFSET 可以指定为任意 SQL 表达式。
- 参考:#3061
orm declarative
- [orm] [declarative] [feature]
declared_attr
构造在与 declarative 结合使用时具有新的改进行为和特性。装饰的函数在调用时将有权访问本地 mixin 上存在的最终列副本,并且将确保为每个映射类仅调用一次,返回的结果将被缓存。还添加了一个新的修饰符declared_attr.cascading
。
请参见
对 declarative mixins、@declared_attr 和相关特性的改进
参考:#3150 - [orm] [declarative] [bug]
修复了在使用AbstractConcreteBase
与声明__abstract__
的子类时出现的“‘NoneType’ 对象没有 ‘concrete’ 属性”错误。
此更改也回溯到:0.9.8
参考:#3185 - [orm] [declarative] [bug]
修复了在声明继承层次结构中间使用__abstract__
mixin 会阻止属性和配置正确从基类传播到继承类的错误。
参考:#3219, #3240 - [orm] [declarative] [bug]
使用declared_attr
在AbstractConcreteBase
基类上建立的关系现在将自动配置在抽象基类映射上,除了像往常一样在后代具体类上设置。
另请参阅
改进声明性混合,@declared_attr 和相关功能
参考:#2670
示例
- [示例] [特性]
添加了一个使用最新关系特性说明材料化路径的新示例。示例由 Jack Zhou 提供。
这个更改也被回溯到:0.9.5 - [示例] [特性]
一个新的示例套件,专门提供了对 SQLAlchemy ORM 和 Core 以及 DBAPI 性能的详细研究,从多个角度进行。该套件在一个容器内运行,通过控制台输出以及通过 RunSnake 工具图形化显示内置的性能分析。
另请参阅
性能 - [示例] [错误]
更新了带有历史表的版本控制示例,使映射列重新映射以匹配列名以及列的分组;特别是,这允许在同名列连接继承场景中明确分组的列在历史映射中以相同方式映射,避免了 0.9 系列中关于此模式的警告,并允许属性键的相同视图。
这个更改也被回溯到:0.9.9 - [示例] [错误]
修复了示例/generic_associations/discriminator_on_association.py 示例中的一个 bug,其中 AddressAssociation 的子类没有被映射为“单表继承”,导致在尝试进一步使用映射时出现问题。
这个更改也被回溯到:0.9.9
引擎
- [引擎] [特性]
添加了用于查看事务隔离级别的新用户空间访问器;Connection.get_isolation_level()
,Connection.default_isolation_level
.
这个更改也被回溯到:0.9.9 - [引擎] [特性]
添加了新的事件ConnectionEvents.handle_error()
,这是ConnectionEvents.dbapi_error()
的更全面和全面的替代品。
这个更改也被回溯到:0.9.7
参考:#3076 - [引擎] [特性]
可以发出新的警告样式,这些警告样式将“过滤”掉参数化字符串的最多 N 次出现。这允许参数化警告可以引用它们的参数,直到允许 Python 警告过滤器将它们压制,并防止 Python 的警告注册表内存无限增长。
另请参阅
Session.get_bind() 处理更多种类的继承情况
参考:#3178 - [引擎] [错误]
修复了Connection
和池中的错误,当使用Connection.execution_options()
时,Connection.invalidate()
方法或由于数据库断开而使连接无效时,如果isolation_level
参数已被使用;将在不再打开的连接上调用重置隔离级别的“finalizer”。
此更改也已回溯至:0.9.9
参考:#3302 - [引擎] [错误]
如果在进行Transaction
时使用了isolation_level
参数,将发出警告;DBAPI 和/或 SQLAlchemy 方言(如 psycopg2、MySQLdb)可能会隐式回滚或提交事务,或者在下一次事务中不更改设置,因此这绝不安全。
此更改也已回溯至:0.9.9
参考:#3296 - [引擎] [错误]
通过create_engine.execution_options
或Engine.update_execution_options()
传递给Engine
的执行选项不会传递给用于在“第一次连接”事件中初始化方言的特殊Connection
;方言通常会在此阶段执行自己的查询,并且当前可用的选项不应该应用于此处。特别是,“autocommit”选项导致在这种初始连接中尝试自动提交,这将由于Connection
的非标准状态而导致 AttributeError。
这个更改也被回溯到:0.9.8
参考:#3200 - [引擎] [错误]
用于确定 INSERT 或 UPDATE 受影响列的字符串键现在在它们对“编译缓存”缓存键的贡献时进行排序。在以前,这些键没有确定性地排序,这意味着相同的语句可能会根据等效键多次被缓存,这既会在内存和性能方面造成损失。
这个更改也被回溯到:0.9.8
参考:#3165 - [引擎] [错误]
修复了一个 bug,当引擎首次连接并进行初始检查时发生 DBAPI 异常,并且异常不是断开连接异常,但是当我们尝试关闭光标时光标引发错误时,会发生 bug。在这种情况下,由于我们试图通过连接池记录光标关闭异常并失败,因为我们试图以不适合这种非常特定情况的方式访问池的记录器,真正的异常将被扼杀。
这个更改也被回溯到:0.9.5
参考:#3063 - [引擎] [错误]
修复了一些检测到的“双重失效”情况,其中连接失效可能发生在已经处于关键部分的情况下,比如连接关闭(); 最终,这些条件是由于#2907中的更改引起的,因为“返回时重置”功能调用 Connection/Transaction 来处理它,其中可能会被捕获“断开连接检测”。然而,最近在#2985中的更改可能使得这种情况更容易被视为“连接失效”操作更快,因为在 0.9.4 上更容易复现这个问题,而在 0.9.3 上不太容易。
现在在发生任何可能发生 invalidate 的部分内添加了检查,以阻止对无效连接进行进一步的不允许的操作。这包括在引擎级别和池级别都有两个修复。虽然问题在高度并发的 gevent 情况下观察到,但理论上可以在任何发生连接关闭操作时发生断开连接的情况下发生。
此更改也被反向移植至:0.9.5
参考:#3043 - [引擎] [错误]
引擎级错误处理和包装例程现在将在所有引擎连接用例中生效,包括当用户自定义连接例程通过create_engine.creator
参数使用时,以及当Connection
在重新验证时遇到连接错误时。
另请参阅
DBAPI 异常包装和 handle_error()事件改进
参考:#3266 - [引擎] [错误]
在事件监听器正在运行时删除(或添加)事件监听器,无论是从监听器内部还是从并发线程中,现在都会引发 RuntimeError,因为现在使用的集合是collections.deque()
的实例,并且不支持在迭代时进行更改。以前,使用的是简单的 Python 列表,其中从事件内部删除将产生静默失败。
参考:#3163
sql
- [sql] [特性]
在一定程度上放宽了Index
的约定,如果要手动将索引添加到表中,则可以将text()
表达式指定为目标;如果索引要通过内联声明或通过Table.append_constraint()
添加到表中,则索引不再需要存在表绑定列。
此更改也被反向移植至:0.9.5
参考:#3028 - [sql] [特性]
添加了新的标志between.symmetric
,当设置为 True 时渲染“BETWEEN SYMMETRIC”。还添加了一个新的否定运算符“notbetween_op”,现在允许像~col.between(x, y)
这样的表达式渲染为“col NOT BETWEEN x AND y”,而不是带括号的 NOT 字符串。
此更改也被反向移植至:0.9.5
参考:#2990 - [sql] [特性]
SQL 编译器现在生成预期列的映射,使其按位置与接收到的结果集匹配,而不是按名称。最初,这被视为一种处理返回具有难以预测名称的列的情况的方法,尽管在现代使用中,这个问题已经通过匿名标记得以解决。在这个版本中,该方法基本上通过减少每个结果的函数调用次数几十次,或者对于更大的结果列集合来说更多,来降低函数调用次数。如果编译的列集合与接收到的列存在大小上的任何差异,该方法仍然会退化为旧方法的现代版本,因此在部分或完全文本编译场景中,这些列表可能不会对齐时不会出现问题。
参考:#918 - [sql] [feature]
在DefaultClause
中的字面值,当使用Column.server_default
参数时调用时,现在将使用“内联”编译器进行呈现,以便它们按原样呈现,而不是作为绑定参数。
另请参阅
列服务器默认值现在呈现字面值
参考:#3087 - [sql] [feature]
当传递给 SQL 表达式单元的对象无法解释为 SQL 片段时,报告表达式的类型;感谢 Ryan P. Kelly 提交的拉取请求。 - [sql] [feature]
向Table.tometadata()
方法添加了一个新参数Table.tometadata.name
。与Table.tometadata.schema
类似,此参数导致新复制的Table
使用新名称而不是现有名称。这种功能的一个有趣之处在于,它可以将Table
对象复制到相同的MetaData
目标中并使用新名称。感谢 n.d. parker 提交的拉取请求。 - [sql] [feature]
异常消息稍作调整。如果为 None,则不显示 SQL 语句和参数,减少与语句无关的错误消息的混淆。显示了 DBAPI 级别异常的完整模块和类名,明确表明这是一个包装的 DBAPI 异常。语句和参数本身被限定在括号内,以更好地将它们与错误消息和彼此隔离开来。
参考:#3172 - [sql] [feature]
Insert.from_select()
现在包括 Python 和 SQL 表达式默认值,如果未指定;解除了非服务器列默认值不包括在 INSERT FROM SELECT 中的限制,并将这些表达式作为常量呈现到 SELECT 语句中。
请参阅
INSERT FROM SELECT 现在包括 Python 和 SQL 表达式默认值 - [sql] [feature]
当反射一个Table
对象时,现在包括了UniqueConstraint
构造,适用于这些数据库。为了以足够的准确性实现这一点,MySQL 和 PostgreSQL 现在包含了纠正索引和唯一约束重复的功能,当反射表、索引和约束时。对于 MySQL,实际上没有独立于“唯一索引”的“唯一约束”概念,因此对于这个后端,UniqueConstraint
仍然不会出现在反射的Table
中。对于 PostgreSQL,用于检测pg_index
中的索引的查询已经改进,以检查pg_constraint
中的相同构造,并且隐式构建的唯一索引不包含在反射的Table
中。
在这两种情况下,Inspector.get_indexes()
和Inspector.get_unique_constraints()
方法分别返回这两种构造,但在 PostgreSQL 的情况下包含一个新的标记duplicates_constraint
,在 MySQL 的情况下包含一个新的标记duplicates_index
,以指示检测到此条件时。感谢 Johannes Erdfelt 的拉取请求。
请参阅
UniqueConstraint 现在是表反射过程的一部分
参考:#3184 - [sql] [feature]
添加了新方法Select.with_statement_hint()
和 ORM 方法Query.with_statement_hint()
,以支持不特定于表的语句级提示。
参考:#3206 - [sql] [feature]
info
参数已添加为所有模式构造函数的构造参数,包括MetaData
、Index
、ForeignKey
、ForeignKeyConstraint
、UniqueConstraint
、PrimaryKeyConstraint
、CheckConstraint
。
参考:#2963 - [sql] [feature]
Table.autoload_with
标志现在意味着Table.autoload
应为True
。感谢 Malik Diarra 的拉取请求。
参考:#3027 - [sql] [feature]
Select.limit()
和Select.offset()
方法现在接受任何 SQL 表达式作为参数,而不仅仅是整数值。通常用于允许传递绑定参数,稍后可以用值替换,从而允许在 Python 端缓存 SQL 查询。这里的实现完全向后兼容现有的第三方方言,但那些实现特殊 LIMIT/OFFSET 系统的方言需要修改以利用新功能。Limit 和 offset 还支持“literal_binds”模式,
参考:#3034 - [sql] [changed]
column()
和table()
构造现在可以从“from sqlalchemy”命名空间导入,就像每个其他 Core 构造一样。 - [sql] [changed]
当传递给select()
的大多数构建器方法以及Query
时,将字符串隐式转换为text()
构造时,现在只发送纯字符串会发出警告。文本转换仍然正常进行。唯一不会发出警告的方法是“标签引用”方法,如 order_by(),group_by();这些函数现在在编译时将尝试将单个字符串参数解析为可选择的列或标签表达式;如果找不到任何内容,则表达式仍然呈现,但您会再次收到警告。这里的理由是,从字符串到文本的隐式转换现在比以往更加意外,当用户将原始字符串传递给 Core / ORM 时,最好让用户提供更多方向。Core/ORM 教程已更新,以更深入地介绍文本的处理方式。
参见
将完整 SQL 片段强制转换为 text()时发出的警告
参考:#2992 - [sql] [bug]
修复了Enum
和其他SchemaType
子类中的错误,直接将类型与MetaData
关联会导致在MetaData
上发出事件(如创建事件)时挂起。
这个更改也被回溯到:0.9.7, 0.8.7
参考:#3124 - [sql] [bug]
修复了自定义操作符加TypeEngine.with_variant()
系统中的错误,当使用TypeDecorator
与 variant 结合使用时,当使用比较运算符时会出现 MRO 错误。
这个更改也被回溯到:0.9.7, 0.8.7
参考:#3102 - [sql] [bug]
修复了在从 UNION 中选择时,INSERT…FROM SELECT 构造中的错误,会将 UNION 包装在一个匿名的子查询中。
此更改也被回溯到:0.9.5, 0.8.7
参考:#3044 - [sql] [bug]
修复了当应用空的and_()
或or_()
或其他空表达式时,Table.update()
和Table.delete()
会生成空的 WHERE 子句的错误。现在这与select()
的行为一致。
此更改也被回溯到:0.9.5, 0.8.7
参考:#3045 - [sql] [bug]
在Enum
的__repr__()
输出中添加了native_enum
标志,当与 Alembic autogenerate 一起使用时,这是非常重要的。感谢 Dimitris Theodorou 的拉取请求。
此更改也被回溯到:0.9.9 - [sql] [bug]
修复了使用实现了也是TypeDecorator
的类型的TypeDecorator
会在针对使用此类型的对象使用任何类型的 SQL 比较表达式时,导致 Python 的“无法创建一致的方法解析顺序(MRO)”错误的错误。
此更改也被回溯到:0.9.9
参考:#3278 - [sql] [bug]
修复了在 INSERT 中嵌入 SELECT 时,通过值子句或作为“from select”时,来自两个语句的列共享相同名称时,污染由 RETURNING 子句产生的结果集中使用的列类型,导致在检索返回行时可能出现错误或错误适应。
此更改也被回溯到:0.9.9
参考:#3248 - [sql] [bug]
修复了 sql 包中的相当数量的 SQL 元素无法成功执行__repr__()
的错误,由于缺少description
属性,然后会在内部 AttributeError 再次调用__repr__()
时引发递归溢出。
此更改也被回溯到:0.9.8
参考:#3195 - [sql] [bug]
调整表/索引反射,如果索引报告一个在表中找不到的列,则会发出警告并跳过该列。这可能发生在一些特殊的系统列情况下,如在 Oracle 中观察到的情况。
此更改也回溯到:0.9.8
参考:#3180 - [sql] [bug]
修复了 CTE 中的错误,当一个 CTE 引用语句中的另一个别名 CTE 时,literal_binds
编译器参数不会始终正确传播。
此更改也回溯到:0.9.8
参考:#3154 - [sql] [bug]
修复了由#3067引起的 0.9.7 回归,与一个命名错误的单元测试一起导致所谓的“模式”类型如Boolean
和Enum
无法再被 pickle。
此更改也回溯到:0.9.8
参考:#3067, #3144 - [sql] [bug]
修复了命名约定功能中的错误,其中使用包含constraint_name
的检查约定会强制所有Boolean
和Enum
类型也需要名称,因为这些隐式创建约束,即使最终目标后端不需要生成约束,比如 PostgreSQL。这些特定约束的命名约定机制已经重新组织,使得命名确定在 DDL 编译时完成,而不是在约束/表构建时完成。
此更改也回溯到:0.9.7
参考:#3067 - [sql] [bug]
修复了公共表达式中的错误,其中当 CTE 以某种方式嵌套时,位置绑定参数可能以错误的最终顺序表示。
此更改也回溯到:0.9.7
参考:#3090 - [sql] [bug]
修复了多值Insert
构造失败检查后续值条目的错误,超出第一个给定的字面 SQL 表达式。
此更改也回溯到:0.9.7
参考:#3069 - [sql] [bug]
为 Python 版本 < 2.6.5 的 dialect_kwargs 迭代添加了一个“str()”步骤,解决了“无 unicode 关键字参数”错误,因为这些参数在某些反射过程中作为关键字参数传递。
此更改也回溯到:0.9.7
参考:#3123 - [sql] [bug]
TypeEngine.with_variant()
方法现在将接受一个类型类作为参数,该参数在内部转换为一个实例,使用其他构(如Column
)长期以来建立的相同约定。
此更改也被回溯到:0.9.7
参考:#3122 - [sql] [bug]
当表中的Column
在显式的PrimaryKeyConstraint
中被引用时,Column.nullable
标志会被隐式设置为False
。这种行为现在与Column
本身的Column.primary_key
标志设置为True
时的行为相匹配,这是一个完全等效的情况。
此更改也被回溯到:0.9.5
参考:#3023 - [sql] [bug]
修复了Operators.__and__()
、Operators.__or__()
和Operators.__invert__()
运算符重载方法无法在自定义Comparator
实现中被覆盖的 bug。
此更改也被回溯到:0.9.5
参考:#3012 - [sql] [bug]
修复了新的DialectKWArgs.argument_for()
方法中的一个 bug,之前未包含任何特殊参数的构造添加参数将失败的问题。
此更改也被回溯到:0.9.5
参考:#3024 - [sql] [bug]
修复了 0.9 版本中引入的回归问题,即从#1068中的新“ORDER BY ”功能不会将标签名称在 ORDER BY 中呈现时应用引用规则。
此更改也被回溯到:0.9.5
参考:#1068, #3020 - [sql] [bug]
恢复了Function
的导入到sqlalchemy.sql.expression
导入命名空间,该导入在 0.9 初始时被移除。
此更改也已回溯至:0.9.5 - [sql] [bug]
Insert.values()
的多值版本已修复,可以更有效地与具有 Python 端默认值和/或函数以及服务器端默认值的表一起使用。该功能现在可以与使用“位置”参数的方言一起工作;Python 可调用对象也将像“executemany”样式调用一样为每一行单独调用;服务器端默认列将不再隐式接收明确为第一行指定的值,而是拒绝在没有明确值的情况下调用。
另请参阅
使用多值插入时为每行单独调用 Python 端默认值
参考:#3288 - [sql] [bug]
修复了Table.tometadata()
方法中的 bug,其中与Boolean
或Enum
类型对象关联的CheckConstraint
将在目标表中重复。现在的复制过程跟踪此约束对象的生成作为类型对象的本地对象。
参考:#3260 - [sql] [bug]
ForeignKeyConstraint.columns
集合的行为契约已经一致化;此属性现在像所有其他约束一样是一个ColumnCollection
,并在约束与Table
关联时初始化。
另请参阅
ForeignKeyConstraint.columns 现在是 ColumnCollection
参考:#3243 - [sql] [bug]
Column.key
属性现在用作表达式中匿名绑定参数名称的来源,以匹配此值在 INSERT 或 UPDATE 语句中呈现时的现有用法。这允许Column.key
用作“替代”字符串,以解决一个难以转换为绑定参数名称的困难列名。请注意,无论如何,paramstyle 在create_engine()
中是可配置的,并且今天大多数 DBAPI 都支持命名和位置样式。
参考:#3245 - [sql] [bug]
修复了传递给此事件的PoolEvents.reset.dbapi_connection
参数的名称;特别是这会影响此事件的“命名”参数样式的使用。感谢 Jason Goldberger 提交的拉取请求。 - [sql] [bug]
恢复了在 0.9 版本中所做的更改,即“常量”null()
、true()
和false()
的“单例”特性已被还原。这些函数返回一个“单例”对象的效果是,不同的实例将被视为相同,而不考虑其词法使用,这特别会影响 SELECT 语句的列子句的渲染。
另请参阅
null()、false() 和 true() 常量不再是单例
参考:#3170 - [sql] [bug] [engine]
修复了一个 bug,即“分支”连接(当您调用Connection.connect()
时获得的连接)不会与父连接共享失效状态。分支连接的架构稍作调整,使分支连接在所有失效状态和操作上都遵从父连接。
参考:#3215 - [sql] [bug] [engine]
修复了一个 bug,即“分支”连接(当您调用Connection.connect()
时获得的连接)不会与父连接共享事务状态。分支连接的架构稍作调整,使分支连接在所有事务状态和操作上都遵从父连接。
参考:#3190 - [sql] [bug]
使用Insert.from_select()
现在隐含在insert()
上使用inline=True
。这有助于修复一个 bug,即在支持的后端上,INSERT…FROM SELECT 结构会被错误地编译为“隐式返回”,这会导致在插入零行的情况下出现故障(因为隐式返回期望一行),以及在插入多行的情况下出现任意返回数据(例如,只有许多行中的第一行)。类似的更改也适用于具有多个参数集的 INSERT…VALUES;对于此语句,隐式 RETURNING 也不再发出。由于这两个构造处理可变数量的行,因此ResultProxy.inserted_primary_key
访问器不适用。以前,有一个文档注释,即对于一些数据库不支持返回并且因此无法执行“隐式”返回的情况,可能更喜欢在 INSERT…FROM SELECT 中使用inline=True
,但无论如何,INSERT…FROM SELECT 都不需要隐式返回。如果需要返回插入的数据的可变数量的结果行,则应使用常规的显式Insert.returning()
。
参考:#3169 - [SQL] [增强]
实现了GenericTypeCompiler
的自定义方言现在可以构造,以便访问方法接收所属表达式对象的指示,如果有的话。大多数情况下,接受关键字参数(例如,**kw
)的访问方法将接收一个关键字参数type_expression
,指的是类型所包含的表达式对象。对于 DDL 中的列,方言的编译器类可能需要修改其get_column_specification()
方法以支持此功能。如果UserDefinedType.get_col_spec()
在其参数签名中提供了**kw
,则还将接收type_expression
。
参考:#3074
模式
- [模式] [特性]
MetaData.create_all()
和MetaData.drop_all()
的 DDL 生成系统已经增强,以自动处理大多数情况下的互相依赖的外键约束;对于约束,极大地减少了对ForeignKeyConstraint.use_alter
标志的需求。该系统还适用于没有预先给定名称的约束;只有在 DROP 情况下,才需要至少一个约束的名称与循环相关联。
另请参阅
ForeignKeyConstraint 上的 use_alter 标志(通常)不再需要
参考:#3282 - [模式] [特性]
添加了一个新的访问器Table.foreign_key_constraints
来补充Table.foreign_keys
集合,以及ForeignKeyConstraint.referred_table
。 - [模式] [错误]
CheckConstraint
构造现在支持包含令牌%(column_0_name)s
的命名约定;约束表达式会扫描列。此外,不包括%(constraint_name)s
令牌的检查约束的命名约定现在也适用于SchemaType
生成的约束,例如Boolean
和Enum
的约束;这在 0.9.7 中停止工作,原因是 #3067。
另请参阅
命名 CHECK 约束
配置布尔值、枚举和其他模式类型的命名
参考:#3067,#3299
postgresql
- [postgresql] [特性]
添加了对使用postgresql_concurrently
建立的 PostgreSQL 索引的CONCURRENTLY
关键字的支持。拉取请求由 Iuri de Silvio 提供。
另请参阅
CONCURRENTLY 创建索引
此更改也被 回溯 至:0.9.9 - [postgresql] [特性] [pg8000]
为 pg8000 驱动程序添加了“合理的多行计数”支持,主要适用于在 ORM 中使用版本控制时。该功能基于使用 pg8000 1.9.14 或更高版本进行版本检测。感谢 Tony Locke 的拉取请求。
此更改也回溯到:0.9.8 - [postgresql] [feature]
在ColumnOperators.match()
操作符中添加了 kw 参数postgresql_regconfig
,允许指定“reg config”参数传递给to_tsquery()
函数。感谢 Jonathan Vanasco 的拉取请求。
此更改也回溯到:0.9.7
参考:#3078 - [postgresql] [feature]
通过JSONB
添加了对 PostgreSQL JSONB 的支持。感谢 Damian Dimmich 的拉取请求。
此更改也回溯到:0.9.7 - [postgresql] [feature]
在使用 pg8000 DBAPI 时,添加了对“AUTOCOMMIT”隔离级别的支持。感谢 Tony Locke 的拉取请求。
此更改也回溯到:0.9.5 - [postgresql] [feature]
为 PostgreSQLARRAY
类型添加了一个新标志ARRAY.zero_indexes
。当设置为True
时,将在传递给数据库之前将所有数组索引值加一,从而在 Python 风格的从零开始索引和 PostgreSQL 从一开始索引之间实现更好的互操作性。感谢 Alexey Terentev 的拉取请求。
此更改也回溯到:0.9.5
参考:#2785 - [postgresql] [feature]
PG8000 方言现在支持create_engine.encoding
参数,通过在连接上设置客户端编码,然后被 pg8000 拦截。感谢 Tony Locke 的拉取请求。 - [postgresql] [feature]
支持 PG8000 的原生 JSONB 功能。感谢 Tony Locke 的拉取请求。 - [postgresql] [feature] [pypy]
支持在 pypy 上使用 psycopg2cffi DBAPI。感谢 shauns 的拉取请求。
另请参阅sqlalchemy.dialects.postgresql.psycopg2cffi
参考:#3052 - [postgresql] [feature]
添加了对聚合函数应用的 FILTER 关键字的支持,由 PostgreSQL 9.4 支持。感谢 Ilja Everilä的拉取请求。
另请参阅
PostgreSQL FILTER 关键字 - [postgresql] [feature]
添加了对物化视图和外部表的反射支持,以及对Inspector.get_view_names()
中的物化视图的支持,以及在 PostgreSQL 版本的Inspector
上可用的新方法PGInspector.get_foreign_table_names()
。拉取请求由 Rodrigo Menezes 提供。
另请参阅
PostgreSQL 方言反映了物化视图、外部表
参考:#2891 - [postgresql] [feature]
在通过Table
构造渲染 DDL 时,添加了对 PG 表选项 TABLESPACE、ON COMMIT、WITH(OUT) OIDS 和 INHERITS 的支持。拉取请求由 malikdiarra 提供。
另请参阅
PostgreSQL 表选项
参考:#2051 - [postgresql] [feature]
添加了新方法PGInspector.get_enums()
,在使用 PostgreSQL 检查器时将提供 ENUM 类型列表。拉取请求由 Ilya Pekelny 提供。 - [postgresql] [bug]
在 PGHSTORE
类型中添加了hashable=False
标志,这是为了允许 ORM 在请求混合列/实体列表中的 ORM 映射的 HSTORE 列时跳过“哈希”操作所需的。补丁由 Gunnlaugur Þór Briem 提供。
此更改也被回溯到:0.9.5, 0.8.7
参考:#3053 - [postgresql] [bug]
添加了一个新的“断开连接”消息“连接意外关闭”。这似乎与较新版本的 SSL 有关。拉取请求由 Antti Haapala 提供。
此更改也被回溯到:0.9.5, 0.8.7 - [postgresql] [bug]
修复了在使用 psycopg2 时与 ARRAY 类型一起支持 PostgreSQL UUID 类型的问题。psycopg2 方言现在使用 psycopg2.extras.register_uuid()钩子,以便始终将 UUID 值作为 UUID()对象传递到/从 DBAPI。UUID.as_uuid
标志仍然受到尊重,但是对于 psycopg2,当禁用此标志时,我们需要将返回的 UUID 对象转换回字符串。
此更改也被回溯到:0.9.9
参考:#2940 - [postgresql] [bug]
在使用 psycopg2 2.5.4 或更高版本时,添加了对postgresql.JSONB
数据类型的支持,该版本具有原生的 JSONB 数据转换,因此必须禁用 SQLAlchemy 的转换器;此外,还使用了新添加的 psycopg2 扩展extras.register_default_jsonb
来建立通过json_deserializer
参数传递给方言的 JSON 反序列化器。还修复了 PostgreSQL 集成测试,这些测试实际上并没有往返传输 JSONB 类型,而是 JSON 类型。感谢 Mateusz Susik 的拉取请求。
此更改也被回溯到:0.9.9 - [postgresql] [bug]
修复了在使用旧的 psycopg2 版本< 2.4.3 注册 HSTORE 类型时使用“array_oid”标志的问题,该版本不支持此标志,以及在 psycopg2 版本< 2.5 上使用本机 json 序列化器钩子“register_default_json”与用户定义的json_deserializer
时的问,该版本不包括本机 json。
此更改也被回溯到:0.9.9 - [postgresql] [bug]
修复了 PostgreSQL 方言在Index
中无法正确渲染表绑定列之外的表达式的错误;通常情况下,如果text()
构造是索引中的表达式之一,或者如果其中一个或多个表达式是这样的构造,则可能会误解表达式列表。
此更改也被回溯到:0.9.9
参考:#3174 - [postgresql] [bug]
重新审视了首次在 0.9.5 中修补的此问题,显然 psycopg2 的.closed
访问器并不像我们所认为的那样可靠,因此我们已经添加了一个显式检查异常消息“SSL SYSCALL error: Bad file descriptor”和“SSL SYSCALL error: EOF detected”以检测断开连接的情况。我们将继续将 psycopg2 的 connection.closed 作为第一次检查。
此更改也被回溯到:0.9.8
参考:#3021 - [postgresql] [bug]修复了 PostgreSQL JSON 类型无法持久化或以其他方式渲染 SQL NULL 列值而不是 JSON 编码的
'null'
的错误。为支持此情况,更改如下:
- 现在可以指定值
null()
,这将始终导致语句中的 NULL 值。 - 添加了一个新参数
JSON.none_as_null
,当为 True 时表示 Python 的None
值应该被持久化为 SQL NULL,而不是 JSON 编码的'null'
。
- 对于除了 psycopg2 之外的其他 DBAPI,如 pg8000,也修复了将 NULL 检索为 None 的问题。
此更改也被回溯到:0.9.8
参考:#3159 - [postgresql] [bug]
用于 DBAPI 错误的异常包装系统现在可以容纳非标准的 DBAPI 异常,例如 psycopg2 的 TransactionRollbackError。这些异常现在将使用sqlalchemy.exc
中最接近的可用子类引发,在 TransactionRollbackError 的情况下,使用sqlalchemy.exc.OperationalError
。
此更改也回溯到:0.9.8
参考:#3075 - [postgresql] [bug]
修复了array
对象中的错误,其中与普通 Python 列表的比较将无法使用正确的数组构造函数。感谢 Andrew 的拉取请求。
此更改也回溯到:0.9.8
参考:#3141 - [postgresql] [bug]
为函数添加了支持的FunctionElement.alias()
方法,例如func
构造。先前,此方法的行为是未定义的。当前行为模仿了 0.9.4 之前的行为,即将函数转换为具有给定别名的单列 FROM 子句,其中列本身是匿名命名的。
此更改也回溯到:0.9.8
参考:#3137 - [postgresql] [bug] [pg8000]
修复了 0.9.5 中由新的 pg8000 隔离级别功能引入的错误,其中引擎级隔离级别参数在连接时会引发错误。
此更改也回溯到:0.9.7
参考:#3134 - [postgresql] [bug]
现在在确定异常是否为“断开连接”错误时,将咨询 psycopg2 的.closed
访问器;理想情况下,这应该消除对异常消息的任何其他检查以检测断开连接的需要,但我们将保留这些现有消息作为备用。这应该能够处理新的情况,如“SSL EOF”条件。感谢 Dirk Mueller 的拉取请求。
此更改也回溯到:0.9.5
参考:#3021 - [postgresql] [bug]
PostgreSQLENUM
类型在调用普通的table.drop()
时将发出 DROP TYPE 指令,假设对象没有直接与MetaData
对象关联。为了适应在多个表之间共享枚举类型的用例,该类型应直接与MetaData
对象关联;在这种情况下,该类型仅在元数据级别创建,或者如果直接创建。一般来说,已经对 PostgreSQL 枚举类型的创建/删除规则进行了高度改进。
另请参阅
ENUM 类型创建/删除规则的全面改进
参考:#3319 - [postgresql] [bug]
PGDialect.has_table()
方法现在将查询pg_catalog.pg_table_is_visible(c.oid)
,而不是在模式名称为 None 时测试精确的模式匹配;这样该方法也将显示临时表的存在。请注意,这是一项行为更改,因为 PostgreSQL 允许非临时表悄悄地覆盖同名的现有临时表,因此这会改变在这种不寻常情况下checkfirst
的行为。
另请参阅
PostgreSQL 的 has_table() 现在适用于临时表
参考:#3264 - [postgresql] [enhancement]
在 PostgreSQL 方言中添加了一个新类型OID
。虽然“oid”通常是 PG 中的私有类型,在现代版本中不会暴露,但在某些 PG 使用情况下(如大对象支持)可能会暴露这些类型,以及在一些用户报告的模式反射使用情况中。
此更改也已回溯至:0.9.5
参考:#3002
mysql
- [mysql] [feature]
MySQL 方言现在在所有情况下都使用 NULL / NOT NULL 渲染 TIMESTAMP,因此启用了explicit_defaults_for_timestamp
标志的 MySQL 5.6.6 将允许 TIMESTAMP 在nullable=False
时继续按预期工作。现有应用程序不受影响,因为 SQLAlchemy 一直为nullable=True
的 TIMESTAMP 列发出 NULL。
另请参阅
MySQL TIMESTAMP 类型现在在所有情况下都渲染 NULL / NOT NULL
TIMESTAMP 列和 NULL
参考:#3155 - [mysql] [feature]
将“supports_unicode_statements”标志更新为 True,适用于 Python 2 下的 MySQLdb 和 Pymysql。这指的是 SQL 语句本身,而不是参数,影响到使用非 ASCII 字符的表和列名等问题。这两个驱动程序在现代版本中似乎都支持 Python 2 Unicode 对象而没有问题。
参考:#3121 - [mysql] [change]
gaerdbms
方言不再必要,并发出弃用警告。Google 现在建议直接使用 MySQLdb 方言。
这个更改也被回溯到:0.9.9
参考:#3275 - [mysql] [bug]
MySQL 错误 2014“commands out of sync”似乎在现代 MySQL-Python 版本中被提升为 ProgrammingError,而不是 OperationalError;所有被测试为“is disconnect”的 MySQL 错误代码现在都在 OperationalError 和 ProgrammingError 中进行检查。
这个更改也被回溯到:0.9.7, 0.8.7
参考:#3101 - [mysql] [bug]
修复了一个 bug,即在索引的mysql_length
参数上添加列名时,需要对带引号的名称使用相同的引号才能被识别。修复使引号变为可选,但也为那些使用这种解决方法的人提供了旧的行为以保持向后兼容。
这个更改也被回溯到:0.9.5, 0.8.7
参考:#3085 - [mysql] [bug]
添加了对包含 KEY_BLOCK_SIZE 的索引的表进行反射的支持,使用等号。感谢 Sean McGivern 的拉取请求。
这个更改也被回溯到:0.9.5, 0.8.7 - [mysql] [bug]
在 MySQLdb 方言周围添加了一个版本检查,用于检查‘utf8_bin’排序规则,因为这在 MySQL 服务器<5.0 上失败。
这个更改也被回溯到:0.9.9
参考:#3274 - [mysql] [bug] [mysqlconnector]
Mysqlconnector 在 2.0 版本中,可能是由于 Python 3 合并的副作用,现在不再期望百分号(例如用作模运算符和其他用途)被加倍,即使使用“pyformat”绑定参数格式(这个更改没有被 Mysqlconnector 记录)。方言现在在检测模运算符应该呈现为%%
还是%
时,检查 py2k 和 mysqlconnector 小于 2.0 版本。
这个更改也被回溯到:0.9.8 - [mysql] [bug] [mysqlconnector]
现在对于 MySQLconnector 2.0 及以上版本传递 Unicode SQL;对于 Py2k 和 MySQL < 2.0,字符串被编码。
这个更改也被回溯到:0.9.8 - [mysql] [bug]
MySQL 方言现在支持在构造为TypeDecorator
对象的类型上进行 CAST。 - [mysql] [bug]
当在 MySQL 方言上使用cast()
转换不支持的类型时,会发出警告;MySQL 仅支持对部分数据类型进行转换。长期以来,SQLAlchemy 在 MySQL 的情况下仅省略了不支持类型的 CAST。虽然我们现在不希望改变这一点,但我们发出警告以显示已经发生的情况。当使用不支持 CAST 的旧版 MySQL(< 4)时,也会发出警告,在这种情况下也会被跳过。
参考:#3237 - [mysql] [bug]
SET
类型已经重构,不再假设空字符串或包含单个空字符串值的集合实际上是包含单个空字符串的集合;相反,默认情况下将其视为空集。为了处理实际上希望包含空白值''
作为合法值的SET
的持久性,添加了一种新的位操作模式,该模式通过SET.retrieve_as_bitwise
标志启用,该标志将使用它们的位标志位置明确地持久化和检索值。还修复了对于不本地转换 Unicode 的驱动程序配置的 Unicode 值的存储和检索。
另请参阅
MySQL SET 类型重构以支持空集合、Unicode、空值处理
参考:#3283 - [mysql] [bug]
ColumnOperators.match()
运算符现在处理方式不再严格假定返回类型为布尔值;现在返回一个名为MatchType
的Boolean
子类。当在 Python 表达式中使用时,该类型仍然会产生布尔行为,但是方言可以在结果时间覆盖其行为。在 MySQL 的情况下,虽然 MATCH 运算符通常在表达式的布尔上下文中使用,但如果实际上查询匹配表达式的值,则返回一个浮点值;此值与 SQLAlchemy 的基于 C 的布尔处理器不兼容,因此 MySQL 的结果集行为现在遵循Float
类型的行为。还添加了一个新的运算符对象notmatch_op
,以更好地允许方言定义匹配操作的否定。
另请参阅
match()运算符现在返回与 MySQL 的浮点返回值兼容的 MatchType
参考:#3263 - [mysql] [bug]
MySQL 布尔符号“true”、“false”再次有效。0.9 版本中的#2682更改禁止了 MySQL 方言在“IS”/“IS NOT”的上下文中使用“true”和“false”符号,但 MySQL 支持这种语法,尽管它没有布尔类型。MySQL 仍然是“非本机布尔”,但true()
和false()
符号再次生成关键字“true”和“false”,因此像column.is_(true())
这样的表达式在 MySQL 上再次有效。
另请参阅
MySQL 布尔符号“true”、“false”再次有效
参考:#3186 - [mysql] [bug]
MySQL 方言现在将禁用ConnectionEvents.handle_error()
事件,以便对于其内部用于检测表是否存在的语句,不会触发该事件。这是通过使用一个执行选项skip_user_error_events
来实现的,该选项在该执行范围内禁用了处理错误事件。通过这种方式,重写异常的用户代码不需要担心 MySQL 方言或其他偶尔需要捕获 SQLAlchemy 特定异常的方言。 - [mysql] [bug]
将“raise_on_warnings”的默认值更改为 False 以适用于 MySQLconnector。由于某种原因,这被设置为 True。不幸的是,“buffered”标志必须保持为 True,因为 MySQLconnector 不允许关闭游标,除非所有结果都被完全获取。
参考:#2515
sqlite
- [sqlite] [feature]
添加了对 SQLite 上的部分索引(例如带有 WHERE 子句)的支持。感谢 Kai Groner 的拉取请求。
另请参阅
部分索引
此更改也回溯到:0.9.9 - [sqlite] [feature]
为 SQLCipher 后端添加了一个新的 SQLite 后端。该后端使用 pysqlcipher Python 驱动程序提供加密的 SQLite 数据库,该驱动程序与 pysqlite 驱动程序非常相似。
另请参阅pysqlcipher
此更改也回溯到:0.9.9 - [sqlite] [bug]
当使用附加数据库文件从 UNION 中进行选择时,pysqlite 驱动程序将列名报告为 ‘dbname.tablename.colname’,而不是通常对于 UNION 的 ‘tablename.colname’(请注意,对于两者,应该只是 ‘colname’,但我们对此进行了处理)。此处的列翻译逻辑已经调整为检索最右边的标记,而不是第二个标记,因此在两种情况下都有效。感谢 Tony Roberts 提供的解决方法。
此更改也被回溯到:0.9.8
参考:#3211 - [sqlite] [bug]
修复了 SQLite 连接重写问题,其中一个作为标量子查询嵌入的子查询(例如在 IN 中)会从包含查询中接收不适当的替换,如果相同的表在子查询中存在,如在连接继承场景中。
此更改也被回溯到:0.9.7
参考:#3130 - [sqlite] [bug]
现在在 SQLite 上完全反映了唯一约束和外键约束,无论是否有名称。之前,外键名称被忽略,未命名的唯一约束被跳过。感谢 Jon Nelson 的帮助。
参考:#3244, #3261 - [sqlite] [bug]
当使用DATE
、TIME
或DATETIME
类型的 SQLite 方言,并给定一个只呈现数字的storage_format
,将在 DDL 中将类型呈现为DATE_CHAR
、TIME_CHAR
和DATETIME_CHAR
,以便尽管值中缺少字母字符,列仍会提供“文本亲和性”。通常情况下,这是不需要的,因为默认存储格式中的文本值已经暗示了文本。
另请参阅
日期和时间类型
参考:#3257 - [sqlite] [bug]
SQLite 现在支持从临时表反射唯一约束;之前,这会导致 TypeError 错误。感谢 Johannes Erdfelt 提交的拉取请求。
另请参阅
SQLite/Oracle 有不同的临时表/视图名称报告方法 - 有关 SQLite 临时表和视图反射的更改。
参考:#3203 - [sqlite] [bug]
添加了Inspector.get_temp_table_names()
和Inspector.get_temp_view_names()
;目前,只有 SQLite 和 Oracle 方言支持这些方法。临时表和视图名称的返回已从 SQLite 和 Oracle 的版本Inspector.get_table_names()
和Inspector.get_view_names()
中移除;其他数据库后端不支持此信息(如 MySQL),操作范围也不同,因为表可以是会话本地的,通常不支持远程模式中的表。
另请参阅
SQLite/Oracle 有不同的临时表/视图名称报告方法
参考:#3204
mssql
- [mssql] [feature]
为 SQL Server 2008 启用了“多值插入”。感谢 Albert Cervin 提交的拉取请求。还扩展了“IDENTITY INSERT”模式的检查,以包括当标识键出现在语句的 VALUEs 子句中时。
此更改还反向移植到:0.9.7 - [mssql] [feature]
SQL Server 2012 现在推荐对于大文本/二进制类型使用 VARCHAR(max), NVARCHAR(max), VARBINARY(max)。MSSQL 方言现在会根据版本检测以及新的deprecate_large_types
标志来尊重这一点。
另请参阅
大文本/二进制类型弃用
参考:#3039 - [mssql] [changed]
当使用 pyodbc 时,基于主机名的 SQL Server 连接格式将不再指定默认的“驱动程序名称”,如果缺少此项将发出警告。SQL Server 的最佳驱动程序名称经常更改,并且是每个平台的,因此基于主机名的连接需要指定此项。优先使用 DSN-based 连接。
另请参阅
基于主机名的 SQL Server 连接需要 PyODBC 驱动程序名称
参考:#3182 - [mssql] [bug]
添加了对“SET IDENTITY_INSERT”语句的语句编码,当明确在 IDENTITY 列中插入时进行操作,以支持在不支持 Unicode 语句的驱动程序(如 pyodbc + unix + py2k)上使用非 ASCII 表标识符。
此更改还反向移植到:0.9.7, 0.8.7 - [mssql] [bug]
在 SQL Server pyodbc 方言中,修复了description_encoding
方言参数的实现,当未明确设置时,会导致无法正确解析包含其他编码名称的结果集中的 cursor.description。未来不应该需要此参数。
此更改也已回溯至:0.9.7, 0.8.7
参考:#3091 - [mssql] [bug]
修复了在 pymssql 方言中检测版本字符串以与 Microsoft SQL Azure 一起使用的问题,后者将“SQL Server”更改为“SQL Azure”。
此更改也已回溯至:0.9.8
参考:#3151 - [mssql] [bug]
修订了用于确定当前默认模式名称的查询,使用database_principal_id()
函数与sys.database_principals
视图结合使用,以便我们可以独立于正在进行的登录类型(例如,SQL Server,Windows 等)确定默认模式。。
此更改也已回溯至:0.9.5
参考:#3025
oracle
- [oracle] [feature]
增加了对 cx_oracle 连接到特定服务名称的支持,而不是传递?service_name=
到 URL 的 tns 名称。感谢 Sławomir Ehlert 的拉取请求。 - [oracle] [feature]
为表和索引添加了新的 Oracle DDL 功能:COMPRESS,BITMAP。补丁由 Gabor Gombas 提供。 - [oracle] [feature]
增加了对 Oracle 下 CTE 的支持。这包括对别名语法的一些调整,以及一个新的 CTE 功能CTE.suffix_with()
,用于向 CTE 添加特殊的 Oracle 特定指令。
另请参阅
改进了 Oracle 中 CTE 的支持
参考:#3220 - [oracle] [feature]
增加了对 Oracle 表选项 ON COMMIT 的支持。 - [oracle] [bug]
修复了 Oracle 方言中长期存在的 bug,即以数字开头的绑定参数名称不会被引用,因为 Oracle 不喜欢绑定参数名称中的数字。
此更改也已回溯至:0.9.8
参考:#2138 - [oracle] [bug] [tests]
修复了 oracle 方言测试套件中的 bug,在一个测试中,假定‘username’在数据库 URL 中,即使这可能并非如此。
此更改也已回溯至:0.9.7
参考:#3128 - [oracle] [bug]
当在Select.with_hint()
方法中使用%(name)s
标记引用别名时,别名将被正确引用。之前,Oracle 后端尚未实现此引用。
测试
- [tests] [bug]
修复了“python setup.py test”未适当调用 distutils 的错误,错误将在测试套件结束时发出。
此更改也回溯至:0.9.7 - [测试] [bug] [py3k]
修正了涉及imp
模块和 Python 3.3 或更高版本的一些弃用警告,在运行测试时。感谢 Matt Chisholm 的拉取请求。
此更改也回溯至:0.9.5
参考:#2830
杂项
- [功能] [扩展]
添加了一个新的扩展套件sqlalchemy.ext.baked
。这个简单但不寻常的系统允许在构建和处理 ormQuery
对象时大大节省 Python 开销,从查询构建到渲染字符串 SQL 语句。
另请参见
烘焙查询
参考:#3054 - [功能] [扩展]
sqlalchemy.ext.automap
扩展现在将自动在检测到包含一个或多个非空列的外键的一对多关系/backref 上设置cascade="all, delete-orphan"
。在这种情况下,此参数存在于传递给generate_relationship()
的关键字中,仍然可以被覆盖。此外,如果ForeignKeyConstraint
为非空列指定了ondelete="CASCADE"
或为可空列指定了ondelete="SET NULL"
,则还会将参数passive_deletes=True
添加到关系中。请注意,并非所有后端都支持 ondelete 的反射,但支持反射的后端包括 PostgreSQL 和 MySQL。
参考:#3210 - [bug] [声明性]
当访问__mapper_args__
字典时,会从声明性 mixin 或抽象类中复制,以便声明性本身对该字典所做的修改不会与其他映射发生冲突。该字典在version_id_col
和polymorphic_on
参数方面进行修改,用本地类/表正式映射的列替换其中的列。
此更改也回溯至:0.9.5,0.8.7
参考:#3062 - [bug] [扩展]
修复了可变扩展中的一个 bug,MutableDict
未对setdefault()
字典操作报告更改事件。
此更改也回溯至:0.9.5,0.8.7
参考:#3051,#3093 - [bug] [扩展]
修复了MutableDict.setdefault()
没有返回现有值或新值的错误(这个 bug 没有在任何 0.8 版本中发布)。感谢 Thomas Hervé提供的拉取请求。
这个更改也被回溯到:0.9.5, 0.8.7
参考:#3051, #3093 - [bug] [ext] [py3k]
修复了在 Py3K 下关联代理列表类无法正确解释切片的错误。感谢 Gilles Dartiguelongue 提供的拉取请求。
这个更改也被回溯到:0.9.9 - [bug] [declarative]
修复了一种在一些奇特的最终用户设置中观察到的不太可能的竞争条件,其中在声明中尝试检查“重复类名”时会遇到与其他被移除的类相关的未完全清理的弱引用;这里的检查现在确保在进一步调用之前弱引用仍然引用一个对象。
这个更改也被回溯到:0.9.8
参考:#3208 - [bug] [ext]
修复了在排序列表中的一个错误,其中如果将 reorder_on_append 标志设置为 True,则在集合替换事件期间项目的顺序会被打乱。修复确保排序列表仅影响与对象明确关联的列表。
这个更改也被回溯到:0.9.8
参考:#3191 - [bug] [ext]
修复了MutableDict
未实现update()
字典方法的错误,因此未捕获更改。感谢 Matt Chisholm 提供的拉取请求。
这个更改也被回溯到:0.9.8 - [bug] [ext]
修复了MutableDict
的自定义子类在“强制”操作中不会显示,并且会返回一个普通的MutableDict
的错误。感谢 Matt Chisholm 提供的拉取请求。
这个更改也被回溯到:0.9.8 - [bug] [pool]
修复了连接池日志记录中的错误,其中“连接已检出”调试日志记录消息不会在使用logging.setLevel()
设置日志记录而不是使用echo_pool
标志时发出。已添加用于断言此日志记录的测试。这是在 0.9.0 中引入的一个回退。
这个更改也被回溯到:0.9.8
参考:#3168 - [bug] [declarative]
修复了当声明的__abstract__
标志未被区分为实际上是值False
时的错误。__abstract__
标志需要在被测试的级别实际上评估为 True 值。
此更改也被回溯到:0.9.7
参考:#3097 - [错误] [测试套件]
在公共测试套件中,从不太受支持的Text
更改为使用String(40)
在StringTest.test_literal_backslashes
中。Pullreq 由 Jan 提供。
此更改也被回溯到:0.9.5 - [已移除]
Drizzle 方言已从核心中移除;现在作为sqlalchemy-drizzle提供,这是一个独立的第三方方言。该方言几乎完全基于 SQLAlchemy 中存在的 MySQL 方言。
另请参见
Drizzle 方言现在是外部方言
通用
- [通用] [特性]
通过更多地使用__slots__
来改进结构内存使用。这种优化特别针对具有大量表和列的大型应用程序的基本内存大小,并大大减少了各种高容量对象的内存大小,包括事件监听内部、比较器对象以及 ORM 属性和加载器策略系统的部分。
另请参见
结构内存使用的显着改进 - [通用] [错误]
对于所有那些作为“公共工厂”符号派生的 SQL 和 ORM 函数,现在设置了__module__
属性,这应有助于文档工具能够报告目标模块。
参考:#3218
ORM
- [ORM] [特性]
在Query.column_descriptions
返回的字典中添加了一个新条目"entity"
。这指的是由表达式引用的主要 ORM 映射类或别名类。与现有的"type"
条目相比,它将始终是一个映射实体,即使从列表达式中提取,或者如果给定表达式是一个纯核心表达式,则为 None。另请参见#3403,修复了此功能中的一个回归,该回归在 0.9.10 中未发布,但在 1.0 版本中发布。
此更改也被回溯到:0.9.10
参考:#3320 - [ORM] [特性]
添加了新参数Session.connection.execution_options
,可用于在事务开始之前首次检出Connection
时设置执行选项。这用于在事务开始之前在连接上设置选项,如隔离级别。
另请参见
设置事务隔离级别 / DBAPI AUTOCOMMIT - 新的文档章节详细介绍了使用会话设置事务隔离的最佳实践。
这个更改也回溯到:0.9.9
参考:#3296 - [orm] [feature]
添加了新的方法Session.invalidate()
,功能类似于Session.close()
,除了还调用所有连接上的Connection.invalidate()
,以确保它们不会返回到连接池中。这在处理 gevent 超时等情况时非常有用,此时不安全继续使用连接,即使是用于回滚也是如此。
这个更改也回溯到:0.9.9 - [orm] [feature]
“primaryjoin”模型被进一步扩展,允许一个严格从单个列到其自身的连接条件,通过某种 SQL 函数或表达式转换。这有点是实验性的,但第一个概念验证是一个“材料化路径”连接条件,其中一个路径字符串与自身使用“like”进行比较。ColumnOperators.like()
操作符也已添加到在 primaryjoin 条件中使用的有效操作符列表中。
这个更改也回溯到:0.9.5
参考:#3029 - [orm] [feature]
添加了新的实用函数make_transient_to_detached()
,可用于制造行为就像从会话加载然后分离的对象。不存在的属性标记为过期,对象可以添加到会话中,在那里它将表现得像持久对象一样。
这个更改也回溯到:0.9.5
参考:#3017 - [orm] [feature]
添加了一个新的事件套件QueryEvents
。QueryEvents.before_compile()
事件允许创建函数,在构建 SELECT 语句之前对Query
对象进行额外修改。希望通过引入一个新的检查系统,使这个事件变得更加有用,该系统将允许对Query
对象进行详细的自动修改。
另请参阅QueryEvents
参考:#3317 - [orm] [功能]
当使用一对多查询并且还包含 LIMIT、OFFSET 或 DISTINCT 时,与一对一关系一起使用连接预加载时发生的子查询包装已在一对多关系中禁用,即一对多关系中relationship.uselist
设置为 False。这将在这些情况下产生更有效的查询。
另请参阅
不再应用子查询于 uselist=False 的连接预加载
参考:#3249 - [orm] [功能]
映射状态内部已经重新设计,以允许在对象“过期”时(如Session.commit()
和Session.expire_all()
的“自动过期”功能中)以及在对象状态被垃圾回收时发生的“清理”步骤中减少 50%的调用次数。
参考:#3307 - [orm] [功能]
当在同一层次结构中为两个不同的映射器分配相同的多态标识时,会发出警告。这通常是用户错误,意味着在加载时无法正确区分这两种不同的映射类型。感谢 Sebastian Bank 的 Pull 请求。
参考:#3262 - [orm] [功能]
创建了一系列新的Session
方法,直接提供钩子进入工作单元的插入和更新语句发射设施。当正确使用时,这个面向专家的系统可以允许 ORM 映射生成批量插入和更新语句,分批执行,使语句的执行速度以与直接使用 Core 相媲美。
另请参阅
批量操作
参考:#3100 - [orm] [功能]
添加了一个参数Query.join.isouter
,它与调用Query.outerjoin()
是同义的;此标志旨在提供与 CoreFromClause.join()
更一致的接口。感谢 Jonathan Vanasco 提供的拉取请求。
参考:#3217 - [orm] [功能]
添加了新的事件处理程序AttributeEvents.init_collection()
和AttributeEvents.dispose_collection()
,用于跟踪何时首次将集合与实例关联以及何时替换集合。这些处理程序取代了collection.linker()
注释。通过事件适配器仍支持旧钩子。 - [orm] [功能]
当在映射或选项中使用Query.yield_per()
时,Query
将引发异常。这些加载策略目前与yield_per
不兼容,因此通过引发此错误,该方法更安全。可以使用lazyload('*')
选项或Query.enable_eagerloads()
来禁用急加载。
另请参阅
使用 yield_per 明确禁止连接/子查询急加载 - [orm] [功能]
由Query
对象使用的KeyedTuple
的新实现在获取大量基于列的行时提供了显著的速度改进。
另请参阅
新的 KeyedTuple 实现速度显著提升
参考:#3176 - [orm] [功能]
joinedload.innerjoin
以及relationship.innerjoin
的行为现在是使用“嵌套”内连接,即右嵌套,作为外连接贪婪加载链接到内连接贪婪加载时的默认行为。
另请参阅
使用 innerjoin=True 的 joinedload 现在默认为右内连接嵌套
参考:#3008 - [orm] [特性]
现在可以将 UPDATE 语句批处理到 ORM 刷新中,以更高效地执行 executemany()调用,类似于可以将 I