SqlAlchemy 2.0 中文文档(六十三)(1)https://developer.aliyun.com/article/1560859
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] [功能]
映射状态内部已经重新设计,以允许将与对象的“过期”相关的调用次数减少 50%,例如Session.commit()
的“自动过期”功能以及Session.expire_all()
中发生的“清理”步骤,当对象状态被垃圾回收时。
参考:#3307 - [orm] [功能]
当在同一层次结构中为两个不同的映射器分配相同的多态标识时,会发出警告。这通常是用户错误,意味着在加载时无法正确区分这两种不同的映射类型。感谢 Sebastian Bank 的 Pull 请求。
参考:#3262 - [orm] [功能]
一个新系列的Session
方法已经被创建,这些方法直接提供了钩子,可以直接进入工作单元的发出 INSERT 和 UPDATE 语句的设施。当正确使用时,这个面向专家的系统可以允许使用 ORM 映射来生成批量插入和更新语句,分组成 executemany 组,使语句的执行速度可以与直接使用 Core 相媲美。
另请参阅
批量操作
参考:#3100 - [orm] [功能]
添加了一个参数Query.join.isouter
,它与调用Query.outerjoin()
是同义的;这个标志旨在提供一个更一致的接口,与 CoreFromClause.join()
相比。感谢 Jonathan Vanasco 的 Pull 请求。
参考:#3217 - [orm] [功能]
添加了新的事件处理程序AttributeEvents.init_collection()
和AttributeEvents.dispose_collection()
,用于跟踪集合何时首次与实例关联以及何时被替换。这些处理程序取代了collection.linker()
注释。通过事件适配器仍支持旧钩子。 - [orm] [功能]
当Query.yield_per()
与会发生子查询急加载或使用集合的连接急加载的映射或选项一起使用时,Query
将引发异常。这些加载策略目前与 yield_per 不兼容,因此通过引发此错误,该方法更安全。可以使用lazyload('*')
选项或Query.enable_eagerloads()
来禁用急加载。
另请参阅
使用 yield_per 明确禁止 Joined/Subquery 急加载 - [orm] [功能]
Query
对象使用的KeyedTuple
的新实现在获取大量面向列的行时提供了显著的速度改进。
另请参阅
新的 KeyedTuple 实现速度显著提高
参考:#3176 - [orm] [功能]
当内连接的急加载链接到外连接的急加载时,joinedload.innerjoin
以及relationship.innerjoin
的行为现在是使用“嵌套”内连接,即右嵌套,作为默认行为。
另请参阅
右内连接嵌套现在是使用 innerjoin=True 的 joinedload 的默认设置
参考:#3008 - [orm] [功能]
现在可以在 ORM 刷新中将 UPDATE 语句批处理为更高效的 executemany()调用,类似于可以批处理 INSERT 语句;这将在刷新中被调用,以便后续对相同映射和表的 UPDATE 语句涉及相同列在 VALUES 子句中,没有嵌入 SET 级别的 SQL 表达式,并且映射的版本要求与后端方言能够为 executemany 操作返回正确的行数兼容。 - [orm] [feature]
构造函数中已添加info
参数给SynonymProperty
和ComparableProperty
。
参考:#2963 - [orm] [feature]
InspectionAttr.info
集合现在已移至InspectionAttr
,除了在所有MapperProperty
对象上可用外,现在还可在混合属性、关联代理上通过Mapper.all_orm_descriptors
访问。
参考:#2971 - [orm] [change]
标记为延迟加载的映射属性如果没有明确取消延迟加载,即使它们的列以某种方式出现在结果集中,也将保持“延迟加载”。这是一个性能增强,ORM 加载不再在获取结果集时花费时间搜索每个延迟加载列。但是,对于一直依赖于此的应用程序,现在应该使用显式的undefer()
或类似选项。 - [orm] [changed]
自定义Bundle
类的create_row_processor()
方法传递给proc()
可调用对象现在只接受单个“row”参数。
另请参阅
在使用自定义行加载器时,新 Bundle 功能的 API 更改 - [orm] [changed]
已移除弃用的事件钩子:populate_instance
、create_instance
、translate_row
、append_result
另请参阅
已移除弃用的 ORM 事件钩子 - [orm] [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 对象比较中的错误,其中多对一的!= None
比较将失败,如果源是一个别名类,或者如果查询需要对表达式应用特殊别名处理,原因是别名连接或多态查询;还修复了以下情况的错误:如果比较多对一与对象状态,则如果查询需要对别名连接或多态查询应用特殊别名,则会失败。
此更改也已回溯至:0.9.9
参考:#3310 - [orm] [bug]
修复了在after_rollback()
处理程序为一个Session
不正确地在处理程序中添加状态,并且尝试警告和删除此状态的任务(由#2389建立)的情况下,内部断言会失败的错误。
此更改也已回溯至:0.9.9
参考:#3309 - [orm] [bug]
修复了当Query.join()
调用具有未知 kw 参数时引发 TypeError 的错误,由于格式错误,会引发自己的 TypeError。感谢 Malthe Borch 提供的拉取请求。
此更改也已回溯至:0.9.9 - [orm] [bug]
修复了惰性加载 SQL 构造中的错误,其中复杂的 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 子句不会在 ON 子句中呈现“单表条件”,如果设置了from_joinpoint=True
标志。
此更改也回溯到:0.9.9
参考:#3232 - [orm] [bug] [engine]
修复了通常影响与#3199相同类事件的错误,当使用named=True
参数时。一些事件将无法注册,而其他事件将无法正确调用事件参数,通常在事件以某种其他方式“包装”以适应时。已重新排列“命名”机制,以不干扰内部包装函数期望的参数签名。
这个更改也被回溯到:0.9.8
参考:#3197 - [orm] [bug]
修复了影响许多类事件的错误,特别是 ORM 事件,但也包括引擎事件,其中“去重复”冗余调用listen()
的通常逻辑会失败,对于那些监听器函数被包装的事件,registry.py 中会触发一个断言。现在,这个断言已经整合到去重复检查中,另外还有一个更简单的方法来全面检查去重复。
这个更改也被回溯到:0.9.8
参考:#3199 - [orm] [bug]
修复了当复杂的自引用主连接包含函数时会发出警告的问题,同时指定了 remote_side;警告会建议设置“remote side”。现在只有在 remote_side 不存在时才会发出警告。
这个更改也被回溯到:0.9.8
参考:#3194 - [orm] [bug] [eagerloading]
修复了在 0.9.4 中发布的#2976引起的回归,其中沿着一系列连接的急加载链传播“外连接”会错误地将兄弟连接路径上的“内连接”也转换为外连接,当只有后代路径应该接收“外连接”传播时;另外,修复了相关问题,即“嵌套”连接传播会不恰当地发生在两个兄弟连接路径之间。
这个更改也被回溯到: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添加的现有检查的扩展;然而,这个新检查只发出警告,而不是异常,以允许可能依赖现有行为的应用程序。
另请参见
我收到关于“在属性 Y 下隐式组合列 X”警告或错误
此更改也回溯到: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” kw 参数产生影响,这也是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]
与joinedload()
和contains_eager()
等加载器指令一起,PropComparator.of_type()
修饰符已经改进,以便在遇到两个相同基本类型/路径的PropComparator.of_type()
修饰符时,它们将被合并为单个“多态”实体,而不是用类型 A 的实体替换类型 B 的实体。例如,A.b.of_type(BSub1)->BSub1.c
的 joinedload 与A.b.of_type(BSub2)->BSub2.c
的 joinedload 将创建一个单个 joinedload,即A.b.of_type((BSub1, BSub2)) -> BSub1.c, BSub2.c
,而不需要在查询中显式使用with_polymorphic
。
另请参阅
多态子类型的急加载 - 包含一个更新的示例,说明了新的格式。
参考:#3256 - [orm] [bug]
修复了当由CascadeOptions
参数使用时copy.deepcopy()
调用的支持,这种情况发生在relationship()
使用copy.deepcopy()
时(不是官方支持的用例)。请求已经由 duesenfranz 提出。 - [orm] [bug]
修复了一个 bug,即当对象经历了刷新但未提交的删除操作时,Session.expunge()
不会完全分离给定的对象。这也会影响到像make_transient()
这样的相关操作。
另请参阅
session.expunge() 现在会完全分离已删除的对象
参考文献:#3139 - [orm] [bug]
如果多个关系最终将填充与另一个冲突的外键列,则会发出警告,其中关系试图从不同的源列复制值。这种情况发生在将具有重叠列的复合外键映射到每个引用列都不同的关系时。新的文档部分演示了示例以及如何通过在每个关系基础上明确指定“foreign”列来克服此问题。
另请参阅
重叠的外键
参考文献:#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 结构一起使用时,以及与首次引入的“order by labels”逻辑结合使用时。修复包括,现在order_by(Entity.some_col_prop)
将即使 Entity 经过别名处理,也会使用“order by label”规则;多次使用别名渲染相同的列属性(例如query(Entity.some_prop, entity_alias.some_prop)
) 将为实体的每次出现标记一个不同的标签,并且此外,“order by label”规则将适用于两者(例如order_by(Entity.some_prop, entity_alias.some_prop)
)。在 0.9 版本中可能阻止“order by label”逻辑工作的其他问题,特别是标签的状态可能会发生变化,以至于“order by label”会停止工作,具体取决于如何调用,已经修复。
另请参阅
ColumnProperty 结构在别名、order_by 方面工作得更好
参考:#3148, #3188 - [orm] [bug]
更改了使用Query.from_self()
或其常用用户Query.count()
时应用“单继承条件”的方法。现在,在内部子查询中指示将行限制为具有特定类型的标准,而不是在外部子查询中指示,因此即使“类型”列不在列子句中可用,我们也可以在“内部”查询中对其进行过滤。
另见
在使用 from_self()、count() 时更改为单表继承条件
参考:#3177 - [orm] [bug]
对延迟加载的机制进行了微小调整,以使其在非常罕见的情况下几乎不会干扰 joinload();在这种情况下,对象在加载其属性时会引用自身,这可能会导致加载程序之间的混淆。目前不完全支持“对象指向自身”的用例,但此修复还删除了一些开销,因此目前是测试的一部分。
参考:#3145 - [orm] [bug]
已删除“复活” ORM 事件。自从在 0.8 版本中删除了旧的“可变属性”系统以来,此事件挂钩已经没有作用。
参考:#3171 - [orm] [bug]
修复了一个 bug,在该 bug 中,“set” 事件或带有@validates
的列在刷新过程中会触发事件,当这些列是“获取和填充”操作的目标时,例如自动增量主键、Python 端默认值或通过 RETURNING “急切地”获取的服务器端默认值。
参考:#3167 - [orm] [bug] [py3k]
从Session.identity_map
中暴露的IdentityMap
现在在 Py3K 中为items()
和values()
返回列表。此处的早期移植到 Py3K 将这些返回迭代器,但它们在技术上应该是“可迭代视图”。暂时,列表是可以的。 - [orm] [bug]
用于 query.update()/delete() 的“评估器”在多表更新时不起作用,需要设置为 synchronize_session=False 或 synchronize_session=’fetch’;现在会引发异常,并显示更改同步设置的消息。这是从 0.9.7 版本开始发出的警告升级为异常。
参考:#3117 - [orm] [enhancement]
调整属性机制,关于何时通过首次访问隐式初始化值为 None;此操作,通常导致属性的填充,不再这样做;返回 None 值,但底层属性不接收设置事件。这与集合的工作方式一致,并允许属性机制更一致地行为;特别是,获取没有值的属性不会压制事件,如果实际上将值设置为 None,则应该继续进行。
另请参阅
属性事件和其他操作更改,涉及没有预先存在值的属性
在编译时选项基础上,绑定参数作为字符串内联呈现。此功能的工作由 Dobes Vandermeer 提供。
另请参阅
选择/查询 LIMIT/OFFSET 可以指定为任意 SQL 表达式。
- 参考:#3061
orm 声明性
- [orm] [declarative] [feature]
declared_attr
结构在与声明性结合使用时具有新的改进行为和特性。装饰的函数现在在调用时将有权访问本地混合上存在的最终列副本,并且对于每个映射的类,将确切地调用一次,返回的结果被缓存。还添加了一个新的修饰符declared_attr.cascading
。
另请参阅
改进声明性混合,@declared_attr 和相关功能
参考:#3150 - [orm] [declarative] [bug]
修复了在与声明__abstract__
的子类一起使用AbstractConcreteBase
时,“‘NoneType’对象没有属性’concrete’”错误。
此更改也被回溯到:0.9.8
参考:#3185 - [orm] [declarative] [bug]
修复了在声明性继承层次结构的中间使用__abstract__
混合时,属性和配置无法从基类正确传播到继承类的错误。
参考:#3219, #3240 - [orm] [declarative] [bug]
使用declared_attr
在AbstractConcreteBase
基类上设置的关系现在将自动配置在抽象基础映射上,除了像往常一样在后代具体类上设置。
另请参阅
对声明性混合、@declared_attr 和相关功能的改进
参考:#2670
示例
- [examples] [feature]
添加了一个新示例,演示了使用最新的关系特性的物化路径。示例由 Jack Zhou 提供。
此更改也回溯到:0.9.5 - [examples] [feature]
一个新的示例套件,专门提供了对 SQLAlchemy ORM 和 Core 以及 DBAPI 性能的详细研究,从多个角度进行。该套件在一个容器中运行,通过控制台输出以及通过 RunSnake 工具图形显示提供内置的性能分析显示。
另请参阅
性能 - [examples] [bug]
更新了带有历史表的版本控制示例,使映射列重新映射以匹配列名以及列分组;特别是,这允许在同名列继承场景中明确分组的列在历史映射中以相同方式映射,避免了 0.9 系列中关于此模式的警告,并允许属性键的相同视图。
此更改也回溯到:0.9.9 - [examples] [bug]
修复了示例/generic_associations/discriminator_on_association.py 中的一个错误,其中 AddressAssociation 的子类未被映射为“单表继承”,导致在尝试进一步使用映射时出现问题。
此更改也回溯到:0.9.9
engine
- [engine] [feature]
添加了用于查看事务隔离级别的新用户空间访问器;Connection.get_isolation_level()
,Connection.default_isolation_level
。
此更改也回溯到:0.9.9 - [engine] [feature]
添加了新事件ConnectionEvents.handle_error()
,这是对ConnectionEvents.dbapi_error()
更全面和全面的替代。
此更改也回溯到:0.9.7
参考:#3076 - [engine] [feature]
可以发出一种新的警告样式,该样式将“过滤”掉最多 N 次出现的参数化字符串。这允许参数化警告引用其参数,以便在固定次数内传递,直到允许 Python 警告过滤器将其消除,并防止内存在 Python 的警告注册表中无限增长。
另请参见
Session.get_bind() 处理更广泛的继承场景
参考:#3178 - [engine] [bug]
修复了Connection
和池中的错误,当使用Connection.execution_options()
时,如果使用了isolation_level
参数,则Connection.invalidate()
方法或由于数据库断开连接而使连接无效时会失败;重置隔离级别的“finalizer”将在不再打开的连接上调用。
此更改也回溯至:0.9.9
参考:#3302 - [engine] [bug]
如果在进行Transaction
时使用isolation_level
参数与Connection.execution_options()
一起使用,则会发出警告;DBAPIs 和/或 SQLAlchemy 方言(如 psycopg2、MySQLdb)可能会隐式回滚或提交事务,或者在下一个事务中不更改设置,因此这永远不安全。
此更改也回溯至:0.9.9
参考:#3296 - [engine] [bug]
通过create_engine.execution_options
或Engine.update_execution_options()
传递给Engine
的执行选项不会传递给用于在“首次连接”事件中初始化方言的特殊Connection
;方言通常会在此阶段执行自己的查询,并且不应在此处应用任何当前可用的选项。特别是,“autocommit” 选项导致在此初始连接中尝试自动提交,这将由于Connection
的非标准状态而导致 AttributeError 失败。
此更改也已回溯至:0.9.8
参考:#3200 - [引擎] [错误]
用于确定受 INSERT 或 UPDATE 影响的列的字符串键现在在它们对“编译缓存”缓存键的贡献时进行排序。这些键以前是没有确定性顺序的,这意味着相同的语句可能会根据等效键被多次缓存,这样做既消耗内存又影响性能。
此更改也已回溯至:0.9.8
参考:#3165 - [引擎] [错误]
修复了一个错误,该错误可能会在引擎首次连接并执行其初始检查时发生 DBAPI 异常,并且异常不是断开连接异常,但是当我们尝试关闭游标时,游标引发错误。在这种情况下,由于我们试图通过连接池记录游标关闭异常并失败,因为我们试图以这种非常特定的方式访问池的记录器,因此真正的异常将被压制。
此更改也已回溯至:0.9.5
参考:#3063 - [引擎] [错误]
修复了一些“双重失效”情况,其中可能会检测到连接失效,而这些连接失效可能会在已经是关键部分的情况下发生,例如连接关闭;最终,这些条件是由 #2907 中的更改引起的,该更改在“返回时重置”功能中调用 Connection/Transaction 以处理它,在那里可能会被“断开连接检测”捕获。但是,可能最近对 #2985 的更改使这更有可能被视为“连接失效”操作更快,因为在 0.9.4 上更容易复现该问题而不是在 0.9.3 上。
现在在可能发生无效操作的任何部分都添加了检查,以阻止在无效连接上进一步禁止的操作。这包括引擎级别和池级别的两个修复。虽然这个问题在高度并发的 gevent 情况下被观察到,但理论上在任何连接关闭操作中发生断开连接的情况下都可能发生。
这个更改也被回溯到:0.9.5
参考:#3043 - [engine] [bug]
引擎级别的错误处理和包装程序现在将在所有引擎连接使用情况下生效,包括当用户自定义连接例程通过create_engine.creator
参数使用时,以及当Connection
在重新验证时遇到连接错误时。
另请参阅
DBAPI 异常包装和 handle_error()事件改进
参考:#3266 - [engine] [bug]
现在,在事件监听器被运行时同时移除(或添加)事件监听器,无论是从监听器内部还是从并发线程中,都会引发 RuntimeError,因为现在使用的集合是collections.deque()
的实例,不支持在迭代时进行更改。以前使用的是普通的 Python 列表,其中在事件本身内部移除将导致静默失败。
参考:#3163
sql
- [sql] [feature]
在Index
的合同中稍微放宽了一点,现在可以将text()
表达式指定为目标;如果要手动将索引添加到表中,则索引不再需要存在绑定列,可以通过内联声明或通过Table.append_constraint()
添加到表中。
这个更改也被回溯到:0.9.5
参考:#3028 - [sql] [feature]
添加了新标志between.symmetric
,当设置为 True 时,会呈现“BETWEEN SYMMETRIC”。还添加了一个新的否定运算符“notbetween_op”,现在允许像~col.between(x, y)
这样的表达式呈现为“col NOT BETWEEN x AND y”,而不是带括号的 NOT 字符串。
这个更改也被回溯到:0.9.5
参考:#2990 - [sql] [feature]
现在 SQL 编译器生成预期列的映射,使它们按位置与接收到的结果集匹配,而不是按名称。最初,这被视为处理列返回具有难以预测名称的情况的一种方式,尽管在现代使用中,通过匿名标记已经克服了这个问题。在这个版本中,该方法基本上通过减少每个结果的函数调用次数几十次,或者对于更大的结果列集合可能更多。如果编译的列集与接收到的列存在大小上的差异,该方法仍会退化为旧方法的现代版本,因此在这些列表可能不对齐的部分或完全文本编译场景中没有问题。
参考:#918 - [sql] [功能]
在DefaultClause
中的字面值,当使用Column.server_default
参数时被调用,现在将使用“内联”编译器进行呈现,以便它们按原样呈现,而不是作为绑定参数。
另请参阅
列服务器默认值现在呈现字面值
参考:#3087 - [sql] [功能]
当传递给 SQL 表达式单元的对象无法解释为 SQL 片段时,将报告表达式的类型;感谢 Ryan P. Kelly 提交的拉取请求。 - [sql] [功能]
向Table.tometadata()
方法添加了一个新参数Table.tometadata.name
。类似于Table.tometadata.schema
,此参数使新复制的Table
采用新名称而不是现有名称。这样做的一个有趣功能是可以将Table
对象复制到具有新名称的相同MetaData
目标中。感谢 n.d. parker 提交的拉取请求。 - [sql] [功能]
异常消息已经稍微改进。如果为 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,实际上没有独立于“唯一索引”的“唯一约束”概念,因此对于这个后端,反射的Table
中仍然不包含UniqueConstraint
。对于 PostgreSQL,用于检测pg_index
中的索引的查询已经改进,以检查pg_constraint
中的相同构造,并且隐式构建的唯一索引不包括在反射的Table
中。
在这两种情况下,Inspector.get_indexes()
和Inspector.get_unique_constraints()
方法分别返回这两个构造,但在 PostgreSQL 的情况下包括一个新的标记duplicates_constraint
,在 MySQL 的情况下包括一个duplicates_index
标记以指示检测到此条件时。感谢 Johannes Erdfelt 的拉取请求。
另请参阅
唯一约束现在是表反射过程的一部分
参考:#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
子类中修复了一个 bug,直接将该类型与MetaData
关联会导致在MetaData
上发出事件(如创建事件)时挂起。
此更改也被反向移植至:0.9.7、0.8.7
参考:#3124 - [sql] [bug]
修复了在自定义运算符加上TypeEngine.with_variant()
系统中的一个 bug,使用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]
修复了 0.9.7 中由#3067引起的回归问题,与一个错误命名的单元测试一起,使得所谓的“模式”类型如Boolean
和Enum
无法再被序列化。
此更改也回溯到: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]
当在表的显式PrimaryKeyConstraint
中引用该Column
时,Column.nullable
标志会隐式设置为False
。此行为现在与当Column
本身的Column.primary_key
标志设置为True
时的行为相匹配,这意味着它们是完全等效的情况。
此更改也回溯到:0.9.5
参考:#3023 - [sql] [bug]
修复了在自定义Comparator
实现中无法重写Operators.__and__()
、Operators.__or__()
和Operators.__invert__()
运算符重载方法的错误。
此更改也回溯到:0.9.5
参考:#3012 - [sql] [bug]
修复了新的DialectKWArgs.argument_for()
方法中的错误,其中为以前未包含任何特殊参数的构造添加参数将失败。
此更改也回溯到:0.9.5
参考:#3024 - [sql] [bug]
修复了在 0.9 版本中引入的回归,即新的“ORDER BY ”功能从#1068中不会将标签名称在 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-side defaults invoked for each row individually when using a multivalued insert
参考:#3288 - [sql] [bug]
修复了Table.tometadata()
方法中的错误,其中与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 语句的 columns 子句的渲染。
参见
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 - [schema] [feature]
添加了一个新的访问器Table.foreign_key_constraints
,以补充Table.foreign_keys
集合,以及ForeignKeyConstraint.referred_table
。 - [schema] [bug]
CheckConstraint
构造现在支持包含令牌%(column_0_name)s
的命名约定;约束表达式将被扫描以获取列。此外,不包括%(constraint_name)s
令牌的检查约束的命名约定现在也适用于SchemaType
生成的约束,例如Boolean
和Enum
的约束;这在 0.9.7 中因 #3067 而停止工作。
另请参阅
命名 CHECK 约束
为布尔值、枚举和其他模式类型配置命名
参考:#3067,#3299
postgresql
- [postgresql] [feature]
添加了对 PostgreSQL 索引的CONCURRENTLY
关键字的支持,使用postgresql_concurrently
建立。由 Iuri de Silvio 提交的拉取请求。
另请参阅
使用 CONCURRENTLY 的索引
此更改也已回溯至:0.9.9 - [postgresql] [feature] [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 反序列化器。还修复了实际上未循环传递 JSONB 类型而不是 JSON 类型的 PostgreSQL 集成测试。拉取请求由 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 修复了将 NULL 检索为 None 的问题,即 pg8000。
此更改也被回溯到: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]
通过新的 pg8000 隔离级别功能引入的 0.9.5 中的错误已被修复,其中引擎级别的隔离级别参数在连接时会引发错误。
此更改也被回溯到:0.9.7
参考:#3134 - [postgresql] [bug]
现在在确定异常是否为“断开连接”错误时,将查询 psycopg2 的.closed
访问器;理想情况下,这应该消除对异常消息的任何其他检查来检测断开连接的需要,但我们将保留这些现有消息作为备用。这应该能够处理新的情况,如“SSL EOF”条件。感谢 Dirk Mueller 的拉取请求。
此更改也被回溯到:0.9.5
参考:#3021 - [postgresql] [bug]
当调用普通table.drop()
时,PostgreSQLENUM
类型将发出 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 使用场景中,如大型对象支持,这些类型可能会被公开,以及在一些用户报告的模式反射使用场景中。
此更改也被 backported 至: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“命令不同步”似乎在现代 MySQL-Python 版本中引发 ProgrammingError 而不是 OperationalError;现在在 OperationalError 和 ProgrammingError 中都检查了所有测试“is disconnect”的 MySQL 错误代码。
此更改也回溯到:0.9.7, 0.8.7
参考:#3101 - [mysql] [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]
从版本 2.0 开始,Mysqlconnector 可能作为 Python 3 合并的副作用,现在不再期望百分号(例如用作模运算符等)被加倍,即使使用“pyformat”绑定参数格式(Mysqlconnector 未记录此更改)。方言现在在检测模运算符应该呈现为%%
还是%
时检查 py2k 和 mysqlconnector 小于版本 2.0。
此更改也回溯到:0.9.8 - [mysql] [bug] [mysqlconnector]
Unicode SQL 现在传递给 MySQLconnector 版本 2.0 及以上;对于 Py2k 和 MySQL < 2.0,字符串被编码。
此更改也回溯到:0.9.8 - [mysql] [bug]
MySQL 方言现在支持在构造为TypeDecorator
对象的类型上进行 CAST。 - [mysql] [bug]
当在 MySQL 方言上使用cast()
时,如果 MySQL 不支持 CAST 的类型,则会发出警告;MySQL 仅支持对部分数据类型进行 CAST。长期以来,SQLAlchemy 在 MySQL 的情况下对不支持的类型忽略了 CAST。虽然我们现在不想改变这一点,但我们会发出警告以显示已经发生的情况。当使用旧版本的 MySQL(< 4)不支持 CAST 时,也会发出警告,在这种情况下也会被跳过。
参考:#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 驱动程序将列名在 cursor.description 中报告为 ‘dbname.tablename.colname’,而不是通常对于 UNION 的 ‘tablename.colname’(请注意,对于两者都应该只是 ‘colname’,但我们对此进行了处理)。此处的列翻译逻辑已经调整为检索最右边的标记,而不是第二个标记,因此在两种情况下都有效。解决方法由 Tony Roberts 提供。
此更改也被回溯至:0.9.8
参考:#3211 - [sqlite] [bug]
修复了 SQLite 加入重写问题,其中作为标量子查询嵌入的子查询(例如在 IN 中)会从包含查询中接收不适当的替换,如果相同的表在子查询中存在并且在包含查询中也存在,例如在连接继承场景中。
此更改也被回溯至:0.9.7
参考:#3130 - [sqlite] [bug]
现在在 SQLite 上完全反映了 UNIQUE 和 FOREIGN KEY 约束,无论是否有名称。以前,外键名称被忽略,未命名的唯一约束被跳过。感谢 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] [功能]
为 SQL Server 2008 启用了“多值插入”。感谢 Albert Cervin 提供的拉取请求。还扩展了“IDENTITY INSERT”模式的检查,以包括当标识键出现在语句的 VALUEs 子句中时。
这一变更也被回溯到:0.9.7 - [mssql] [功能]
SQL Server 2012 现在推荐对于大文本/二进制类型使用 VARCHAR(max)、NVARCHAR(max)、VARBINARY(max)。MSSQL 方言现在会根据版本检测以及新的deprecate_large_types
标志来尊重这一点。
另请参阅
大文本/二进制类型弃用
参考:#3039 - [mssql] [更改]
当使用 pyodbc 时,基于主机名的 SQL Server 连接格式将不再指定默认的“驱动程序名称”,如果缺少此项将会发出警告。SQL Server 的最佳驱动程序名称经常变化且因平台而异,因此基于主机名的连接需要指定此项。优先使用 DSN-based 连接。
另请参阅
PyODBC 驱动程序名称在基于主机名的 SQL Server 连接中是必需的
参考:#3182 - [mssql] [错误]
在“SET IDENTITY_INSERT”语句中添加了语句编码,当在 IDENTITY 列中插入显式 INSERT 时,以支持在不支持 Unicode 语句的驱动程序(如 pyodbc + unix + py2k)上使用非 ASCII 表标识符。
这一变更也被回溯到:0.9.7, 0.8.7 - [mssql] [错误]
在 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 连接到特定服务名称的支持,而不是 tns 名称,通过在 URL 中传递?service_name=
。Pull request 由 Sławomir Ehlert 提供。 - [oracle] [feature]
新的 Oracle DDL 功能用于表和索引:COMPRESS,BITMAP。Patch 由 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
token 引用别名时,别名将被正确引用。之前,Oracle 后端尚未实现此引用。
测试
- [tests] [bug]
修复了一个 bug,即 “python setup.py test” 没有适当调用 distutils,测试套件结束时会发出错误。
此更改还反向移植到:0.9.7 - [tests] [bug] [py3k]
修正了一些关于imp
模块和 Python 3.3 或更高版本在运行测试时的弃用警告。感谢 Matt Chisholm 提供的拉取请求。
此更改还反向移植到:0.9.5
参考:#2830
杂项
- [feature] [ext]
添加了一个新的扩展套件sqlalchemy.ext.baked
。这个简单但不寻常的系统可以大大节省 Python 在构建和处理 ormQuery
对象时的开销,从查询构建到渲染字符串 SQL 语句。
另请参阅
烘焙查询
参考:#3054 - [feature] [ext]
sqlalchemy.ext.automap
扩展现在会自动在检测到包含一个或多个非空列的外键的一对多关系/反向引用上设置cascade="all, delete-orphan"
。在这种情况下,此参数存在于传递给generate_relationship()
的关键字中,并仍然可以被覆盖。此外,如果ForeignKeyConstraint
为非空列指定了ondelete="CASCADE"
或为可空列指定了ondelete="SET NULL"
,则还将在关系中添加参数passive_deletes=True
。请注意,非所有后端都支持 ondelete 的反射,但支持反射的后端包括 PostgreSQL 和 MySQL。
参考:#3210 - [bug] [declarative]
当访问__mapper_args__
字典时,它是从声明性 mixin 或抽象类中复制的,因此声明性本身对此字典所做的修改不会与其他映射冲突。该字典在version_id_col
和polymorphic_on
参数方面进行修改,用本地类/表正式映射到的列替换其中的列。
此更改还反向移植到:0.9.5, 0.8.7
参考:#3062 - [bug] [ext]
修复了可变扩展中的错误,其中MutableDict
未报告setdefault()
字典操作的更改事件。
此更改还反向移植到:0.9.5, 0.8.7
参考:#3051, #3093 - [bug] [ext]
修复了MutableDict.setdefault()
未能返回现有值或新值的 bug(此 bug 未在任何 0.8 版本中发布)。感谢 Thomas Hervé 提交的拉取请求。
此更改也被 回溯 至:0.9.5,0.8.7
参考:#3051,#3093 - [bug] [ext] [py3k]
修复了在 Py3K 下协会代理列表类无法正确解释切片的 bug。感谢 Gilles Dartiguelongue 提交的拉取请求。
此更改也被 回溯 至:0.9.9 - [bug] [declarative]
修复了一种在某些奇特的最终用户设置中观察到的不太可能的竞争条件,在这种情况下,在声明时尝试检查“重复类名”的尝试会遇到一种不完全清理的弱引用,与其他被移除的类相关联;此处的检查现在确保弱引用在进一步调用之前仍然引用一个对象。
此更改也被 回溯 至:0.9.8
参考:#3208 - [bug] [ext]
修复了在集合替换事件期间项的顺序会被打乱的排序列表中的 bug,如果reorder_on_append
标志设置为 True,则修复将确保排序列表仅影响显式与对象关联的列表。
此更改也被 回溯 至:0.9.8
参考:#3191 - [bug] [ext]
修复了MutableDict
未能实现update()
字典方法的 bug,因此未能捕获更改。感谢 Matt Chisholm 提交的拉取请求。
此更改也被 回溯 至:0.9.8 - [bug] [ext]
修复了自定义子类MutableDict
不会在“强制”操作中显示,并且会返回一个普通的MutableDict
的 bug。感谢 Matt Chisholm 提交的拉取请求。
此更改也被 回溯 至:0.9.8 - [bug] [pool]
修复了连接池日志记录中的 bug,在该 bug 中,“连接已检出”调试日志记录消息如果使用logging.setLevel()
设置日志记录,而不是使用echo_pool
标志,则不会发出。已添加测试以断言此日志记录。这是在 0.9.0 中引入的回归。
此更改也被 回溯 至:0.9.8
参考:#3168 - [bug] [declarative]
修复了在声明__abstract__
标志未被区分为实际上是值False
时的 bug。__abstract__
标志需要在被测试的级别上实际上计算为 True 值。
这个更改也被回溯到:0.9.7
参考:#3097 - [bug] [测试套件]
在公共测试套件中,从不太受支持的Text
更改为使用String(40)
在StringTest.test_literal_backslashes
中。感谢 Jan 提交的 Pullreq。
这个更改也被回溯到:0.9.5 - [已移除]
Drizzle 方言已从核心中移除;它现在作为sqlalchemy-drizzle提供,这是一个独立的第三方方言。该方言仍然几乎完全基于 SQLAlchemy 中存在的 MySQL 方言。
另请参阅
Drizzle 方言现在是外部方言
1.0.19
发布日期:2017 年 8 月 3 日
oracle
- [oracle] [性能] [bug] [py2k]
修复了由于修复#3937引起的性能回归问题,其中 cx_Oracle 版本 5.3 删除了其命名空间中的.UNICODE
符号,这被解释为 cx_Oracle 的“WITH_UNICODE”模式被无条件地打开,从而在 SQLAlchemy 一侧调用函数,无条件地将所有字符串转换为 unicode 并导致性能影响。实际上,根据 cx_Oracle 的作者,自 5.1 版本起,“WITH_UNICODE”模式已完全移除,因此昂贵的 unicode 转换函数不再必要,如果在 Python 2 下检测到 cx_Oracle 5.1 或更高版本,则会禁用这些函数。已恢复在#3937中删除的“WITH_UNICODE”模式警告。
参考:#4035
oracle
- [oracle] [性能] [bug] [py2k]
修复了由于修复#3937引起的性能回归问题,其中 cx_Oracle 版本 5.3 删除了其命名空间中的.UNICODE
符号,这被解释为 cx_Oracle 的“WITH_UNICODE”模式被无条件地打开,从而在 SQLAlchemy 一侧调用函数,无条件地将所有字符串转换为 unicode 并导致性能影响。实际上,根据 cx_Oracle 的作者,自 5.1 版本起,“WITH_UNICODE”模式已完全移除,因此昂贵的 unicode 转换函数不再必要,如果在 Python 2 下检测到 cx_Oracle 5.1 或更高版本,则会禁用这些函数。已恢复在#3937中删除的“WITH_UNICODE”模式警告。
参考:#4035
1.0.18
发布日期:2017 年 7 月 24 日
oracle
- [oracle] [bug]
修复了由于 cx_Oracle 5.3 现在似乎在构建中硬编码此标志而暴露出来的 cx_Oracle 的 WITH_UNICODE 模式问题;使用此模式的内部方法未使用正确的签名。
参考:#3937
测试
- [测试] [bug] [py3k]
修复了与 Python 3.6.2 中关于上下文管理器的更改不兼容的测试固件中的问题。
参考:#4034
oracle
- [oracle] [bug]
修复了 cx_Oracle 的 WITH_UNICODE 模式,这是由于 cx_Oracle 5.3 现在似乎在构建中硬编码了此标志;一个使用此模式的内部方法未使用正确的签名。
参考:#3937
tests
- [tests] [bug] [py3k]
修复了与 Python 3.6.2 中关于上下文管理器的更改不兼容的测试固件中的问题。
参考:#4034
1.0.17
发布日期:2017 年 1 月 17 日
orm
- [orm] [bug]
修复了在多个实体上进行连接式急加载时涉及多态继承时会抛出“‘NoneType’ object has no attribute ‘isa’”错误的 bug。此问题是由于修复#3611引入的。
参考:#3884
misc
- [bug] [py3k]
修复了与未使用‘r’修饰符的转义字符串相关的 Python 3.6 DeprecationWarnings,并为 Python 3.6 添加了测试覆盖率。
参考:#3886
orm
- [orm] [bug]
修复了在多个实体上进行连接式急加载时涉及多态继承时会抛出“‘NoneType’ object has no attribute ‘isa’”错误的 bug。此问题是由于修复#3611引入的。
参考:#3884
misc
- [bug] [py3k]
修复了与未使用‘r’修饰符的转义字符串相关的 Python 3.6 DeprecationWarnings,并为 Python 3.6 添加了测试覆盖率。
参考:#3886
1.0.16
发布日期:2016 年 11 月 15 日
orm
- [orm] [bug]
修复了Session.bulk_update_mappings()
中的 bug,其中备用命名的主键属性无法正确跟踪到 UPDATE 语句中。
参考:#3849 - [orm] [bug]
修复了连接式急加载在多态加载映射器失败的 bug,其中 polymorphic_on 设置为未映射表达式(如 CASE 表达式)。
参考:#3800 - [orm] [bug]
修复了当通过Session.bind_mapper()
、Session.bind_table()
或构造函数发送到 Session 的效绑定时引发的 ArgumentError 未能正确引发的问题。
参考:#3798 - [orm] [bug]
修复了Session.bulk_save()
中的一个 BUG,其中一个实现了版本 id 计数器的映射与 UPDATE 结合使用时功能不正常。
参考:#3781 - [orm] [bug]
修复了当映射器属性或其他 ORM 结构在首次调用这些访问器之后被添加到映射器/类后,Mapper.attrs
、Mapper.all_orm_descriptors
和其他派生属性无法刷新的 BUG。
参考:#3778
mssql
- [mssql] [bug]
将用于获取“默认模式名称”的查询更改为使用“schema_name()”函数,而不是查询数据库主体表,因为已经报告了前者在 Azure 数据仓库版上不可用的问题。希望这样能够在所有 SQL Server 版本和认证样式中最终都能正常工作。
参考:#3810 - [mssql] [bug]
将 pyodbc 的服务器版本信息方案更新为使用 SQL Server 的 SERVERPROPERTY(),而不是依赖于 pyodbc.SQL_DBMS_VER,后者特别是在使用 FreeTDS 时仍然不可靠。
参考:#3814 - [mssql] [bug]
将错误代码 20017 “服务器意外 EOF” 添加到导致连接池重置的断开异常列表中。感谢 Ken Robbins 的拉取请求。
参考:#3791 - [mssql] [bug]
修复了 pyodbc 方言(以及几乎不工作的 adodbapi 方言)中的一个 BUG,即密码或用户名字段中存在分号时,分号可能被解释为另一个令牌的分隔符;现在在存在分号时值将被引用。
参考:#3762
misc
- [bug] [orm.declarative]
修复了设置单表继承子类的一个 BUG,其中包含额外列的联接表子类将损坏映射表的外键集合,从而干扰关系的初始化。
参考:#3797
orm
- [orm] [bug]
修复了Session.bulk_update_mappings()
中的一个 BUG,其中一个具有替代命名的主键属性无法正确跟踪到 UPDATE 语句中。
参考:#3849 - [orm] [bug]
修复了对多态加载的映射器进行连接式快速加载时的 BUG,其中多态加载器被设置为未映射表达式,例如 CASE 表达式。
参考:#3800 - [orm] [bug]
修复了一个错误,即当通过Session.bind_mapper()
、Session.bind_table()
或构造函数发送到 Session 的无效绑定时,为无法正确引发的 ArgumentError。
参考:#3798 - [orm] [bug]
修复了Session.bulk_save()
中的错误,其中 UPDATE 与实现版本 id 计数器的映射结合使用时无法正确运行。
参考:#3781 - [orm] [bug]
修复了一个错误,即当在首次调用这些访问器后向映射器/类添加映射器属性或其他 ORM 构造时,Mapper.attrs
、Mapper.all_orm_descriptors
和其他派生属性将无法刷新。
参考:#3778
mssql
- [mssql] [bug]
更改了用于获取“默认模式名称”的查询,从查询数据库主体表到使用“schema_name()”函数,因为有报告称前一系统在 Azure Data Warehouse 版本上不可用。希望这将最终在所有 SQL Server 版本和认证样式上都起作用。
参考:#3810 - [mssql] [bug]
更新了 pyodbc 的服务器版本信息方案,使用 SQL Server SERVERPROPERTY(),而不是依赖于 pyodbc.SQL_DBMS_VER,后者在 FreeTDS 中仍然不可靠。
参考:#3814 - [mssql] [bug]
将错误代码 20017“服务器意外的 EOF”添加到导致连接池重置的断开异常列表中。感谢 Ken Robbins 的拉取请求。
参考:#3791 - [mssql] [bug]
修复了 pyodbc 方言中的错误(以及大部分不起作用的 adodbapi 方言),其中密码或用户名字段中存在的分号可能被解释为另一个令牌的分隔符;当分号存在时,现在对值进行引用。
参考:#3762
杂项
- [bug] [orm.declarative]
修复了设置单表继承子类的错误,该子类包括额外列,会破坏映射表的外键集合,从而干扰关系的初始化。
参考:#3797
SqlAlchemy 2.0 中文文档(六十三)(3)https://developer.aliyun.com/article/1560863