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 的新特性?
项目版本
1.1 更新日志¶
1.1.18¶
发布日期: 2018 年 3 月 6 日postgresql¶
mysql¶
1.1.17¶
发布日期: 2018 年 2 月 22 日1.1.16¶
发布日期: 2018 年 2 月 16 日orm¶
[orm] [错误] ¶
修复了 post_update 功能中的问题,当父对象已被删除但依赖对象未被删除时,会发出 UPDATE。这个问题已经存在很长时间了,但是由于 1.2 现在断言 post_update 的匹配行,因此引发了错误。
参考: #4187
[orm] [错误] ¶
修复了由 #4116 问题的修复引起的回退,影响了 1.2.2 以及 1.1.15 版本,这导致在某些声明性 mixin/继承情况下,以及如果从未映射的类访问关联代理的情况下,错误计算
AssociationProxy
的“所有者类”为NoneType
类。 “找出所有者”的逻辑已被深入的例程替换,该例程搜索分配给类或子类的完整映射器层次结构,以确定正确的(我们希望的)匹配;如果未找到匹配项,则不会分配所有者。如果代理用于未映射的实例,则现在会引发异常。参考: #4185
[orm] [错误] ¶
修复了在嵌套或子事务回滚期间驱逐的对象,如果其主键也被修改,则不会从会话中正确删除的错误,从而导致后续使用会话时出现问题。
参考: #4151
sql¶
[sql] [错误] ¶
在
sqlalchemy.
和sqlalchemy.sql.
命名空间中添加了nullsfirst()
和nullslast()
作为顶级导入。拉取请求由 Lele Gaifax 提供。[sql] [错误] ¶
修复了
Insert.values()
中的错误,其中将“多值”格式与Column
对象作为键而不是字符串结合使用会失败。拉取请求由 Aubrey Stark-Toller 提供。参考: #4162
postgresql¶
mysql¶
misc¶
[错误] [连接池] ¶
修复了一个相当严重的连接池错误,其中在用户定义的
DisconnectionError
导致刷新后或由于 1.2 版本发布的 “pre_ping” 功能而获取的连接,如果连接通过弱引用清理(例如,面向前端的对象被垃圾回收)返回到池中,则不会正确重置;弱引用仍将引用先前无效的 DBAPI 连接,该连接将错误地调用重置操作。这将导致日志中出现堆栈跟踪,并且在未重置的情况下将连接签入池中,这可能会导致锁定问题。参考: #4184
1.1.15¶
发布日期: 2017 年 11 月 3 日orm¶
[orm] [错误] [ext] ¶
修复了关联代理无意中将其自身链接到
AliasedClass
对象的错误,如果它首先使用AliasedClass
作为父对象调用,则会在后续使用时导致错误。参考: #4116
[orm] [错误] ¶
修复了 ORM 关系对于继承层次结构中的同级类会警告冲突的同步目标(例如,两个关系都写入同一列)的错误,其中两个关系在写入期间实际上永远不会冲突。
参考: #4078
[orm] [错误] ¶
修复了针对单表继承实体使用的相关子查询在外部查询中无法正确呈现的错误,这是由于单继承鉴别器条件的调整不适当地将条件重新应用于外部查询。
参考: #4103
orm declarative¶
[orm] [声明式] [错误] ¶
修复了在基于
AbstractConcreteBase
的层次结构中,描述符(它是映射列或关系)在刷新操作期间会被引用的错误,从而导致错误,因为该属性未映射为映射器属性。对于由AbstractConcreteBase
添加的 “type” 列等其他属性,如果类未能在其映射器中包含 “concrete=True”,也可能出现类似的问题,但是此处的检查也应防止这种情况引起问题。参考: #4124
sql¶
[sql] [错误] ¶
修复了如果参数是元组,则
ColumnDefault
的__repr__
会失败的错误。拉取请求由 Nicolas Caniart 提供。参考: #4126
[sql] [错误] ¶
修复了最近添加的
ColumnOperators.any_()
和ColumnOperators.all_()
方法在作为方法调用时(而不是使用独立函数any_()
和all_()
时)不起作用的错误。还为这些相对不直观的 SQL 运算符添加了文档示例。参考: #4093
postgresql¶
[postgresql] [错误] ¶
进一步修复了
ARRAY
类与 COLLATE 结合使用的问题,因为在 #4006 中进行的修复未能适应多维数组。参考: #4006
[postgresql] [错误] ¶
修复了
array_agg
函数中的错误,其中传递已经是ARRAY
类型的参数,例如 PostgreSQLarray
构造,将产生ValueError
,这是由于该函数尝试嵌套数组。参考: #4107
[postgresql] [错误] ¶
修复了 PostgreSQL
Insert.on_conflict_do_update()
中的错误,该错误会阻止将插入语句用作 CTE,例如通过Insert.cte()
在另一个语句中。参考: #4074
mysql¶
[mysql] [错误] ¶
当检测到 MariaDB 10.2.8 或更早版本(在 10.2 系列中)时发出警告,因为这些版本中的 CHECK 约束存在重大问题,这些问题已在 10.2.9 中解决。
请注意,此更新日志消息未与 SQLAlchemy 1.2.0b3 一起发布,而是追溯添加的。
参考: #4097
[mysql] [错误] ¶
MySQL 5.7.20 现在警告使用 @tx_isolation 变量;现在执行版本检查,并使用 @transaction_isolation 代替以防止此警告。
参考: #4120
[mysql] [错误] ¶
修复了由于语法更改,CURRENT_TIMESTAMP 在 MariaDB 10.2 系列中无法正确反映的问题,其中该函数现在表示为
current_timestamp()
。参考: #4096
[mysql] [错误] ¶
MariaDB 10.2 现在支持 CHECK 约束(警告:由于 #4097 中指出的上游问题,请使用 10.2.9 或更高版本)。当 CHECK 约束存在于
SHOW CREATE TABLE
输出中时,反射现在会考虑这些 CHECK 约束。参考: #4098
sqlite¶
mssql¶
1.1.14¶
发布日期: 2017 年 9 月 5 日orm¶
[orm] [错误] ¶
修复了
Session.merge()
中的错误,该错误与 #4030 的错误类似,其中身份映射中目标对象的内部检查可能会导致错误,如果它在合并例程实际检索对象之前立即被垃圾回收。参考: #4069
[orm] [错误] ¶
修复了如果
undefer_group()
选项从使用连接迫切加载加载的关系扩展,则无法识别该选项的错误。此外,由于该错误导致执行过多的工作,因此在结果集列的初始计算中,Python 函数调用计数也提高了 20%,从而补充了 #3915 的连接迫切加载改进。参考: #4048
[orm] [错误] ¶
修复了 ORM 身份映射中的竞争条件,该条件会导致在加载操作期间不适当地删除对象,从而导致重复的对象身份出现,尤其是在涉及对象去重的连接迫切加载下。该问题特定于弱引用的垃圾回收,并且仅在 PyPy 解释器下观察到。
参考: #4068
[orm] [错误] ¶
修复了
Session.merge()
中的错误,其中集合中对于通常自动递增的键将主键属性设置为None
的对象将被视为数据库持久化键,以用于内部去重过程的一部分,从而导致数据库中仅实际插入一个对象。参考: #4056
[orm] [错误] ¶
当
synonym()
用于针对不是MapperProperty
的属性(例如关联代理)时,会引发InvalidRequestError
。以前,会发生递归溢出,试图查找不存在的属性。参考: #4067
sql¶
1.1.13¶
发布日期: 2017 年 8 月 3 日oracle¶
[oracle] [错误] [性能] [py2k] ¶
修复了由 #3937 的修复引起的性能回退,其中 cx_Oracle 从 5.3 版本开始从其命名空间中删除了
.UNICODE
符号,这被解释为 cx_Oracle 的 “WITH_UNICODE” 模式被无条件地打开,这会在 SQLAlchemy 端调用函数,这些函数无条件地将所有字符串转换为 unicode,从而导致性能影响。实际上,根据 cx_Oracle 作者的说法,“WITH_UNICODE” 模式已从 5.1 版本开始完全删除,因此不再需要昂贵的 unicode 转换函数,并且如果在 Python 2 下检测到 cx_Oracle 5.1 或更高版本,则禁用这些函数。在 #3937 下删除的针对 “WITH_UNICODE” 模式的警告也已恢复。此更改也已向后移植到: 1.0.19
参考: #4035
1.1.12¶
发布日期: 2017 年 7 月 24 日orm¶
[orm] [错误] ¶
修复了 1.1.11 版本的回退,其中向包含具有子查询加载关系的实体的查询添加额外的非实体列将失败,这是由于 1.1.11 版本中由于 #4011 而添加的检查。
参考: #4033
[orm] [错误] ¶
修复了 1.1 版本中作为 #3514 一部分添加的 JSON NULL 评估逻辑中的错误,其中该逻辑无法适应与映射的
Column
名称不同的 ORM 映射属性。参考: #4031
[orm] [错误] ¶
向
WeakInstanceDict
中的所有方法添加了KeyError
检查,其中key in dict
的检查之后是对该键的索引访问,以防止在负载下与垃圾回收竞争,这可能会在代码假设其存在后从 dict 中删除键,从而导致非常罕见的KeyError
异常。参考: #4030
oracle¶
[oracle] [功能] [postgresql] ¶
向
Sequence
添加了新的关键字Sequence.cache
和Sequence.order
,以允许渲染 Oracle 和 PostgreSQL 理解的 CACHE 参数,以及 Oracle 理解的 ORDER 参数。Pull request 由 David Moore 友情提供。
tests¶
1.1.11¶
发布日期:2017 年 6 月 19 日,星期一orm¶
sql¶
[sql] [bug] ¶
修复了在
WithinGroup
构造的结构迭代期间会发生的 AttributeError。参考:#4012
postgresql¶
mysql¶
mssql¶
oracle¶
1.1.10¶
发布日期:2017 年 5 月 19 日,星期五orm¶
schema¶
[schema] [bug] ¶
如果创建
ForeignKeyConstraint
对象时,“local” 和 “remote” 列的数量不匹配,现在会引发ArgumentError
,否则会导致约束的内部状态不正确。请注意,这也影响到 dialect 的反射过程为外键约束生成一组不匹配的列的情况。参考:#3949
postgresql¶
[postgresql] [bug] ¶
为 GRANT、REVOKE 关键字添加了 “autocommit” 支持。Pull request 由 Jacob Hayes 友情提供。
mysql¶
oracle¶
misc¶
1.1.9¶
发布日期:2017 年 4 月 4 日sql¶
[sql] [bug] ¶
修复了由于 #3859 在 1.1.5 中发布的回归,其中基于
Variant
调整表达式的 “右侧” 求值以遵循底层类型的 “右侧” 规则,导致Variant
类型被不适当地丢失,在那些我们确实希望左侧类型直接转移到右侧的情况下,以便可以将绑定级别规则应用于表达式的参数。参考:#3952
[sql] [bug] [postgresql] ¶
更改了
ResultProxy
的机制,以无条件地延迟 “autoclose” 步骤,直到Connection
完成该对象;在 PostgreSQL ON CONFLICT with RETURNING 未返回任何行的情况下,autoclose 发生在此先前不存在的用例中,导致通常在 INSERT/UPDATE/DELETE 时无条件发生的自动提交行为失败。参考:#3955
misc¶
[bug] [ext] ¶
修复了由于 #3950 在 1.1.8 中发布的回归,其中在 “schema type” 或
TypeDecorator
的情况下,更深层次地搜索有关列类型的信息,如果映射还包含column_property
,则会产生属性错误。参考:#3956
1.1.8¶
发布日期:2017 年 3 月 31 日postgresql¶
[postgresql] [bug] ¶
添加了对解析开发版本(如 “PostgreSQL 10devel”)的 PostgreSQL 版本字符串的支持。Pull request 由 Sean McCully 友情提供。
misc¶
[bug] [ext] ¶
修复了
sqlalchemy.ext.mutable
中的错误,其中Mutable.as_mutable()
方法不会跟踪使用TypeEngine.copy()
复制的类型。与 1.0 相比,这在 1.1 中变得更像一个回归,因为TypeDecorator
类现在是SchemaEventTarget
的子类,除其他外,这向父Column
指示当Column
被复制时,应复制该类型。当将 declarative 与 mixins 或抽象类一起使用时,这些副本很常见。参考:#3950
[bug] [ext] ¶
为
Result.count()
方法添加了对绑定参数的支持,例如通常通过Query.params()
设置的参数。以前,省略了对参数的支持。Pull request 由 Pat Deegan 友情提供。
1.1.7¶
发布日期:2017 年 3 月 27 日orm¶
[orm] [feature] ¶
现在可以将
aliased()
构造传递给Query.select_entity_from()
方法。实体将从aliased()
构造表示的可选择对象中拉取。这允许将aliased()
的特殊选项(例如aliased.adapt_on_names
)与Query.select_entity_from()
结合使用。参考:#3933
[orm] [bug] ¶
修复了在线程环境下可能发生的竞争条件,这是由于通过 #3915 添加的缓存导致的。
Column
对象的内部集合可能会在别名对象上不适当地重新生成,当连接的预加载器尝试渲染 SQL 并收集结果时,会造成混淆,并导致属性错误。现在,在别名对象被缓存并在线程之间共享之前,预先生成集合。参考:#3947
engine¶
[engine] [bug] ¶
添加了一个异常处理程序,当
Connection
的 “autorollback” 功能本身引发异常时,该处理程序将警告 Py2K 上的 “cause” 异常。在 Py3K 中,解释器自然会将这两个异常报告为一个异常在处理另一个异常期间发生。这延续了回滚失败处理的一系列更改,这些更改最后一次作为 1.0.12 中 #2696 的一部分访问。参考:#3946
sql¶
[sql] [bug] [postgresql] ¶
添加了对
Variant
和SchemaType
对象相互兼容的支持。也就是说,可以针对像Enum
这样的类型创建 variant,并且根据 variant 的 dialect 映射,创建约束和/或数据库特定类型对象的指令将正确传播。参考:#2892
[sql] [bug] ¶
修复了编译器中的错误,其中 savepoint 的字符串标识符将缓存在标识符引用字典中;由于这些标识符是任意的,如果单个
Connection
使用了无限数量的 savepoint,以及如果 savepoint 子句构造直接与无限数量的 savepoint 名称一起使用,则可能会发生少量内存泄漏。内存泄漏不影响绝大多数情况,因为通常Connection
(它使用从 “1” 开始的简单计数器渲染 savepoint 名称)在每次事务或固定数量的事务基础上使用,然后在被丢弃之前使用。参考:#3931
[sql] [bug] ¶
修复了新的 “schema translate” 功能中的错误,其中当与列表达式一起渲染时,翻译后的 schema 名称将以别名名称的形式调用;仅当源翻译名称为 “None” 时才会发生。“schema translate” 功能现在仅对
SchemaItem
和SchemaType
子类生效,即与数据库中 DDL 可创建结构对应的对象。参考:#3924
oracle¶
1.1.6¶
发布日期:2017 年 2 月 28 日orm¶
[orm] [bug] ¶
解决了自早期版本以来由于抽象程度提高而累积的连接预加载器查询构造系统中的一些长期未解决的性能问题。每个查询使用临时的
AliasedClass
对象,每次都会产生大量的列查找开销,已被缓存方法取代,该方法使用少量AliasedClass
对象池,这些对象在连接预加载的调用之间重用。还优化了一些涉及预加载连接路径构造的机制。在最坏情况的连接加载器场景中,端到端查询构造 + 单行提取测试的调用计数与 1.1.5 相比减少了约 60%,与 0.8.6 相比减少了 42%。参考:#3915
[orm] [bug] ¶
修复了 “eager_defaults” 功能中的一个主要低效问题,即对于 ORM 已显式插入 NULL 的列值,将发出不必要的 SELECT,这对应于对象上未设置但未指定任何服务器默认值的属性,以及更新时过期的属性,但无论如何都未设置服务器 onupdate。由于这些列不属于 eager_defaults 尝试使用的 RETURNING,因此也不应进行后 SELECT。
参考:#3909
[orm] [bug] ¶
修复了两个密切相关的错误,涉及 mapper eager_defaults 标志与单表继承结合使用;一个是在 eager defaults 获取期间,eager defaults 逻辑会无意中尝试访问属于 mapper 的 “exclude_properties” 列表(声明式单表继承使用)的列,另一个是为获取默认值而完全加载行将无法使用正确的继承 mapper。
参考:#3908
[orm] [bug] ¶
修复了自 0.9.7 版本以来作为 #3106 的结果首次引入的错误,该错误会导致针对别名实体的某些形式的多级子查询加载中出现不正确的查询,并且在最内层子查询中出现不必要的额外 FROM 实体。
参考:#3893
orm declarative¶
sql¶
[sql] [bug] ¶
修复了
DDLEvents.column_reflect()
事件不允许将非文本表达式作为新列的 “default” 值传递的错误,例如FetchedValue
对象以指示通用触发默认值或text()
构造。还在此方面澄清了文档。参考:#3905
postgresql¶
[postgresql] [bug] ¶
为 “IMPORT FOREIGN SCHEMA”、“REFRESH MATERIALIZED VIEW” PostgreSQL 语句添加了正则表达式,以便它们在没有显式事务的情况下通过连接或 engine 调用时自动提交。Pull request 由 Frazer McLean 和 Paweł Stiasny 友情提供。
参考:#3804
[postgresql] [bug] ¶
修复了 PostgreSQL
ExcludeConstraint
中的错误,其中 “whereclause” 和 “using” 参数在诸如Table.tometadata()
之类的操作期间不会被复制。参考:#3900
mysql¶
[mysql] [bug] ¶
为 MySQL dialect 添加了新的 MySQL 8.0 保留字,以进行正确的引用。Pull request 由 Hanno Schlichting 友情提供。
mssql¶
misc¶
[feature] [ext] ¶
向 “baked” 查询系统添加了
Result.scalar()
和Result.count()
。参考:#3896
[bug] [ext] ¶
修复了新的
sqlalchemy.ext.indexable
扩展中的错误,其中设置本身引用另一个属性的属性将失败。参考:#3901
1.1.5¶
发布日期:2017 年 1 月 17 日orm¶
[orm] [bug] ¶
修复了当也使用多态继承时,针对多个实体进行连接预加载的错误,该错误会抛出 “‘NoneType’ object has no attribute ‘isa’”。该问题是由 #3611 的修复程序引入的。
此更改也已向后移植到:1.0.17
参考:#3884
[orm] [bug] ¶
修复了子查询加载中的错误,其中作为 “现有” 行遇到的对象(例如,已从同一查询中的不同路径加载)不会为指定此加载的未加载属性调用子查询加载器。此问题与 #3431、#3811 的问题在同一区域,这些问题涉及连接加载的类似问题。
参考:#3854
[orm] [bug] ¶
Session.no_autoflush
上下文管理器现在确保在 “finally” 块中重置 autoflush 标志,以便如果在块内引发异常,状态仍然会适当地重置。Pull request 由 Emin Arakelian 友情提供。[orm] [bug] ¶
修复了在
Bundle
构造用作选择条件的情况下,单表继承查询条件不会插入到查询中的错误。参考:#3874
[orm] [bug] ¶
修复了与 #3177 相关的错误,其中
Query
发出的 UNION 或其他集合操作会将 “单继承” 条件应用于 union 的外部(也引用了错误的可选择对象),即使此条件现在应已存在于内部子查询中。一旦对Query
调用 union() 或另一个集合操作,单继承条件现在将被省略,其方式与Query.from_self()
相同。参考:#3856
examples¶
engine¶
[engine] [bug] ¶
Table
反射的 “extend_existing” 选项会导致索引和约束在与MetaData.reflect()
一起使用时(如 automap 扩展所做的那样)加倍,这是由于表在外键路径中以及直接被反射两次。一个新的去重集合在MetaData.reflect()
序列中传递,以防止以这种方式进行双重反射。参考:#3861
sql¶
[sql] [bug] ¶
修复了最初在 0.9 版本中通过 #1068 引入的错误,该错误导致 order_by(<some Label()>) 会仅基于名称对标签名称进行排序,也就是说,即使标记的表达式与 selectable 中隐式或显式存在的其他表达式完全不同。现在,按标签排序的逻辑确保了标记的表达式与解析为该名称的表达式相关,然后再按标签名称排序;此外,该名称必须解析为表达式中其他位置显式声明的实际标签,而不仅仅是列名。此逻辑与 order by(文本名称) 功能仔细地分开,后者的目的略有不同。
参考链接: #3882
[sql] [bug] ¶
修复了 1.1 版本的回归错误,即由于
any_
和all_
函数的拼写错误,import *
对 sqlalchemy.sql.expression 无效。参考链接: #3878
[sql] [bug] ¶
在
MetaData.reflect()
中“could not reflect”异常中嵌入的引擎 URL 现在会隐藏密码;此外,TLEngine
的__repr__
现在的行为类似于Engine
,也会隐藏 URL 密码。此拉取请求由 Valery Yundin 提供。[sql] [bug] ¶
修复了
Variant
中的问题,其中从TypeDecorator
继承的“右侧强制转换”逻辑会将右侧强制转换为Variant
本身,而不是Variant
的默认类型应该执行的操作。在Variant
的情况下,我们希望该类型的作用方式主要类似于基本类型,因此现在覆盖了TypeDecorator
的默认逻辑,以回退到基础包装类型的逻辑。目前主要与 JSON 相关。参考链接: #3859
[sql] [bg] ¶
修复了
Insert
构造的 “multiple values” 功能不遵循 literal_binds 编译器标志的错误;后续值现在呈现为字面量。参考链接: #3880
postgresql¶
[postgresql] [bug] ¶
修复了新的 “ON CONFLICT DO UPDATE” 功能中的错误,其中 UPDATE 子句的 “set” 值不会受到类型级别处理的影响,而类型级别处理通常用于处理用户定义的类型级别转换以及方言所需的转换,例如 JSON 数据类型所需的转换。此外,还阐明了
set_
字典中的键应与列的 “key” 匹配(如果与列名不同)。对于其余与列键不匹配的列名,会发出警告;出于兼容性原因,这些警告会像以前一样发出。参考链接: #3888
[postgresql] [bug] ¶
TIME
和TIMESTAMP
数据类型现在支持将 “precision” 设置为零;以前,零会被忽略。此拉取请求由 Ionuț Ciocîrlan 提供。
mysql¶
mssql¶
oracle¶
misc¶
1.1.4¶
发布日期: 2016 年 11 月 15 日orm¶
[orm] [bug] ¶
修复了
Session.bulk_update_mappings()
中的错误,其中备用名称的主键属性无法正确跟踪到 UPDATE 语句中。此更改也已向后移植到: 1.0.16
参考链接: #3849
[orm] [bug] ¶
修复了
Session.bulk_save()
中的错误,其中 UPDATE 无法与实现版本 ID 计数器的映射一起正常工作。此更改也已向后移植到: 1.0.16
参考链接: #3781
[orm] [bug] ¶
修复了当在首次调用这些访问器后将映射器属性或其他 ORM 构造添加到映射器/类时,
Mapper.attrs
、Mapper.all_orm_descriptors
和其他派生属性无法刷新的错误。此更改也已向后移植到: 1.0.16
参考链接: #3778
[orm] [bug] ¶
修复了由于 #3457 导致的集合中的回归错误,由此在 pickle 或 deepcopy 期间反序列化将无法建立 ORM 集合的所有属性,从而导致进一步的突变操作失败。
参考链接: #3852
[orm] [bug] ¶
修复了长期存在的错误,其中 “noload” 关系加载策略会导致 backrefs 和/或 back_populates 选项被忽略。
参考链接: #3845
engine¶
[engine] [bug] ¶
从
Connection
中删除了长期失效的 “default_schema_name()” 方法。此方法是旧版本遗留下来的,并且无法工作(例如,会引发异常)。此拉取请求由 Benjamin Dopplinger 提供。
sql¶
postgresql¶
mysql¶
[mysql] [feature] ¶
为 mysqlclient 和 pymysql 方言添加了对服务器端游标的支持。此功能通过
Connection.execution_options.stream_results
标志以及server_side_cursors=True
方言参数提供,方式与 PostgreSQL 上的 psycopg2 相同。此拉取请求由 Roman Podoliaka 提供。[mysql] [bug] ¶
MySQL 的原生 ENUM 类型支持发送任何无效值,并会返回一个空字符串作为响应。已向 ENUM 的 MySQL 实现添加了一个硬编码规则来检查 “是否返回空字符串”,以便将此空字符串返回给应用程序,而不是将其作为无效值拒绝。请注意,如果您的 MySQL enum 将值链接到对象,您仍然会收到空字符串。
参考链接: #3841
sqlite¶
mssql¶
1.1.3¶
发布日期: 2016 年 10 月 27 日orm¶
[orm] [bug] ¶
修复了由 #2677 引起的回归错误,其中在会话中已刷新为已删除的对象上调用
Session.delete()
将无法在标识映射中设置对象(或拒绝该对象),从而导致刷新错误,因为该对象处于工作单元无法容纳的状态。在这种情况下,已恢复 1.1 之前的行为,即将对象放回标识映射中,以便再次尝试 DELETE 语句,这将发出警告,指示预期的行数不匹配(除非该行在会话外部恢复)。参考链接: #3839
[orm] [bug] ¶
修复了回归错误,其中某些
Query
方法(如Query.update()
和其他方法)如果Query
是针对一系列映射列而不是整个映射实体,则会失败。参考链接: #3836
sql¶
[sql] [bug] ¶
修复了涉及
Enum
中新值转换和验证功能的错误,其中在字符串连接中使用 enum 对象会将Enum
类型保持为表达式的整体类型,从而产生缺少查找。针对Enum
类型列的字符串连接现在使用String
作为表达式本身的数据类型。参考链接: #3833
[sql] [bug] ¶
修复了作为 #2919 的副作用发生的回归错误,在用户定义的
TypeDecorator
的不太典型的情况下,该TypeDecorator
本身也是SchemaType
的实例(而不是实现方式),这将导致跳过类型本身的列附加事件。参考链接: #3832
postgresql¶
[postgresql] [bug] ¶
PostgreSQL 表反射将确保在反射非
Integer
数据类型的主键列时,Column.autoincrement
标志设置为 False,即使默认值与整数生成序列相关也是如此。如果列创建为 SERIAL 并且数据类型已更改,则可能会发生这种情况。在 1.1 系列中,autoincrement 标志只有在数据类型为整数亲缘性时才能为 True。参考链接: #3835
1.1.2¶
发布日期: 2016 年 10 月 17 日orm¶
sql¶
[sql] [bug] ¶
修复了由新添加的函数引起的回归,该函数执行 sql
DefaultGenerator
对象的 “wrap callable” 功能,当默认可调用对象是functools.partial
或其他没有__module__
属性的对象时,引发了__module__
的属性错误。参考链接: #3823
[sql] [bug] [postgresql] ¶
修复了
Enum
类型中的回归错误,其中由于作为 #3250 一部分添加的冲突 copy() 方法,在复制类型对象的情况下未传输事件处理程序。当复制列时(例如在 tometadata() 中或将声明性 mixin 与列一起使用时),通常会发生此复制。事件处理程序不存在会影响为非原生枚举类型创建的约束,但更严重的是 PostgreSQL 后端上的 ENUM 对象。参考链接: #3827
postgresql¶
1.1.1¶
发布日期: 2016 年 10 月 7 日mssql¶
misc¶
1.1.0¶
发布日期: 2016 年 10 月 5 日orm¶
[orm] [feature] ¶
增强了新的 “raise” 延迟加载器策略,使其还包括 “raise_on_sql” 变体,可通过
relationship.lazy
和raiseload()
获得。此变体仅在延迟加载实际发出 SQL 时引发异常,而不是在完全调用延迟加载器机制时引发异常。参考链接: #3812
[orm] [feature] ¶
Query.group_by()
方法现在在传递None
参数时会重置 group by 集合,就像Query.order_by()
长期以来的工作方式一样。此拉取请求由 Iuri Diniz 提供。[orm] [change] ¶
为了取消所有 order by,将 False 传递给
Query.order_by()
已被弃用;使用 False 或 None 调用此方法不再有任何区别。[orm] [bug] ¶
修复了连接预加载对于多态加载的映射器会失败的错误,其中 polymorphic_on 设置为未映射的表达式,例如 CASE 表达式。
此更改也已向后移植到: 1.0.16
参考链接: #3800
[orm] [bug] ¶
修复了当通过
Session.bind_mapper()
,Session.bind_table()
或构造函数向 Session 发送无效绑定时,ArgumentError 无法正确引发的错误。此更改也已向后移植到: 1.0.16
参考链接: #3798
[orm] [bug] ¶
修复了子查询预加载中的一个错误,当 "of_type()" 对象的子查询加载链接到普通映射类的第二个子查询加载,或者更长的几个 "of_type()" 属性链时,会错误地链接连接。
此更改也被向后移植到: 1.0.15
[orm] [bug] ¶
ORM 属性现在可以被赋值任何具有
__clause_element__()
属性的对象,这将产生内联 SQL,就像任何ClauseElement
类一样。 这涵盖了其他未被进一步表达式构造转换的映射属性。参考链接: #3802
[orm] [bug] ¶
对 [ticket:3431] 中首次引入的错误修复进行了调整,该修复涉及对象在单个结果集中出现在多个上下文中,以便将相关对象值设置为 None 的预加载器仍然会触发,从而满足该属性的加载。 之前,该调整仅在辅助行中为预加载属性接收到非 None 值时才有效。
参考链接: #3811
[orm] [bug] ¶
修复了新的
SessionEvents.persistent_to_deleted()
事件中的一个错误,即目标对象可能在事件触发之前被垃圾回收。参考链接: #3808
[orm] [bug] ¶
relationship()
构造的主连接现在可以包含一个bindparam()
对象,该对象包含一个可调用函数来生成值。 以前,延迟加载策略与此用法不兼容,并且还会错误地检测是否应使用 “use_get” 标准(如果主键与绑定参数有关)。参考链接: #3767
[orm] [bug] ¶
ORM flush 进程发出的 UPDATE 现在可以容纳对象主键中列的 SQL 表达式元素,如果目标数据库支持 RETURNING 以提供新值,或者为了触发列上的某些其他触发器/onupdate 而将 PK 值设置为 “自身”。
参考链接: #3801
[orm] [bug] ¶
修复了一个错误,即如果关系的 primaryjoin 具有多个由 AND 分隔的子句,并且这些子句的顺序与每个子句中比较的主键列的顺序不同,则允许延迟加载从标识映射中使用 get() 的 “简单多对一” 条件将无法被调用。 这种顺序差异发生在复合外键中,其中引用侧的表绑定列在 .c 集合中的顺序与被引用侧的主键列的顺序不同……如果使用声明性 mixin 和/或 declared_attr 来设置列,则这种情况会经常发生。
参考链接: #3788
[orm] [bug] ¶
当映射上的两个
@validates
装饰器使用相同的名称时,会引发异常。 一次只支持一个特定名称的验证器,没有机制将它们链接在一起,因为函数装饰器级别的验证器顺序无法确定。参考链接: #3776
[orm] [bug] ¶
在
configure_mappers()
期间引发的 Mapper 错误现在显式地包含异常消息中原始映射器的名称,以帮助那些包装的异常本身不包含源映射器的情况。 由 John Perkins 友情提供 Pull request。
orm declarative¶
[orm] [declarative] [change] ¶
构造从另一个类继承的声明性基类也将继承其文档字符串。 这意味着
as_declarative()
的行为更像是一个普通的类装饰器。
sql¶
[sql] [bug] ¶
修复了
Table
中的一个错误,其中内部方法_reset_exported()
会破坏对象的状态。 此方法旨在用于可选择对象,并在某些情况下由 ORM 调用;错误的映射器配置可能会导致 ORM 在Table
对象上调用此方法。此更改也被向后移植到: 1.0.15
参考链接: #3755
[sql] [bug] ¶
执行选项现在可以从语句内部在编译时传播到最外层语句,这样,例如,如果嵌入元素想要将 “autocommit” 设置为 True,它可以将其传播到封闭语句。 目前,此功能已为 SELECT 语句中嵌入的面向 DML 的 CTE 启用,例如 SELECT 内的 INSERT/UPDATE/DELETE。
参考链接: #3805
[sql] [bug] ¶
通过
Column.server_default
参数作为列默认值发送的字符串现在会进行引号转义。参考链接: #3809
[sql] [bug] [postgresql] ¶
添加了 PostgreSQL 使用的编译器级标志,以便在涉及 JSON、HSTORE 索引运算符以及其操作数的操作周围放置比通常由优先级规则生成的更多括号,因为已经观察到 PostgreSQL 至少对于 HSTORE 索引运算符的优先级规则在 9.4 和 9.5 之间不一致。
参考链接: #3806
[sql] [bug] [mysql] ¶
BaseException
异常类现在被Connection
的异常处理例程拦截,并包括ConnectionEvents.handle_error()
事件的处理。 在不是Exception
子类的系统级异常(包括KeyboardInterrupt
和 greenletGreenletExit
类)的情况下,Connection
现在默认情况下被无效化,以防止在处于未知且可能已损坏状态的数据库连接上发生进一步操作。 MySQL 驱动程序是此更改的主要目标,但此更改适用于所有 DBAPI。参考链接: #3803
[sql] [bug] ¶
“eq” 和 “ne” 运算符不再是 “结合律” 运算符列表的一部分,但它们仍然被认为是 “交换律” 运算符。 这允许像
(x == y) == z
这样的表达式在 SQL 级别使用括号来维护。 由 John Passaro 友情提供 Pull request。参考链接: #3799
[sql] [bug] ¶
带有未命名
Column
对象的表达式字符串化(在许多情况下发生,包括 ORM 错误报告)现在将在字符串上下文中将名称呈现为 “<name unknown>”,而不是引发编译错误。参考链接: #3789
[sql] [bug] ¶
当 ClauseElement 或非 SQLAlchemy 对象(不是 “可执行” 对象)错误地传递给
.execute()
时,会引发更具描述性的异常/消息;在所有情况下都会一致地引发新的 ObjectNotExecutableError 异常。参考链接: #3786
[sql] [bug] [mysql] [postgresql] ¶
修复了 JSON 数据类型中的回归错误,其中 JSON 索引值的 “字面处理器” 不会被调用。 本机 String 和 Integer 数据类型现在从 JSONIndexType 和 JSONPathType 内部调用。 这适用于通用、PostgreSQL 和 MySQL JSON 类型,并且还依赖于 #3766。
参考链接: #3765
[sql] [bug] ¶
修复了如果复合 SQL 表达式包装在 ORM 样式的
__clause_element__()
构造中,Index
无法从复合 SQL 表达式中提取列的错误。 此错误在 1.0.x 中也存在,但在 1.1 中更明显,因为 hybrid_property @expression 现在返回一个包装元素。参考链接: #3763
postgresql¶
mysql¶
[mysql] [bug] ¶
添加了对解析 URL 查询字符串中 MySQL/Connector 布尔值和整数参数的支持:connection_timeout, connect_timeout, pool_size, get_warnings, raise_on_warnings, raw, consume_results, ssl_verify_cert, force_ipv6, pool_reset_session, compress, allow_local_infile, use_pure。
此更改也被向后移植到: 1.0.15
参考链接: #3787
[mysql] [bug] ¶
修复了 “literal_binds” 标志不会传播到 MySQL 下的 CAST 表达式的错误。
参考链接: #3766
mssql¶
[mssql] [bug] ¶
更改了用于获取 “默认架构名称” 的查询,从查询数据库主体表的查询更改为使用 “schema_name()” 函数,因为据报告,前一个系统在 Azure 数据仓库版本上不可用。 希望这最终能在所有 SQL Server 版本和身份验证样式下工作。
此更改也已向后移植到: 1.0.16
参考链接: #3810
[mssql] [bug] ¶
更新了 pyodbc 的服务器版本信息方案,以使用 SQL Server SERVERPROPERTY(),而不是依赖于 pyodbc.SQL_DBMS_VER,后者继续不可靠,尤其是在 FreeTDS 中。
此更改也已向后移植到: 1.0.16
参考链接: #3814
[mssql] [bug] ¶
将错误代码 20017 “服务器意外断开连接” 添加到导致连接池重置的断开连接异常列表中。 由 Ken Robbins 友情提供 Pull request。
此更改也已向后移植到: 1.0.16
参考链接: #3791
misc¶
1.1.0b3¶
发布日期:2016 年 7 月 26 日orm¶
sql¶
postgresql¶
[postgresql] [bug] ¶
修复了一个错误,即 PostgreSQL 方言对
TypeDecorator
和Variant
类型的深度检查不够,无法确定是否需要渲染 SMALLSERIAL 或 BIGSERIAL 而不是 SERIAL。此更改也被向后移植到: 1.0.14
参考链接: #3739
oracle¶
[oracle] [bug] ¶
修复了
Select.with_for_update.of
中的一个错误,其中 Oracle 的 “rownum” 方法来处理 LIMIT/OFFSET 将无法容纳 “OF” 子句内的表达式,这些表达式必须在最顶层声明,引用子查询内的表达式。 如果需要,表达式现在会添加到子查询中。此更改也被向后移植到: 1.0.14
参考链接: #3741
misc¶
[feature] [ext] ¶
为新的 sqlalchemy.ext.indexable 扩展添加了 “default” 参数。
[bug] [ext] ¶
修复了
sqlalchemy.ext.baked
中的一个错误,其中由于变量作用域问题,当涉及多个子查询加载器时,子查询预加载器查询的反烘焙会失败。 由 Mark Hahnenberg 友情提供 Pull request。此更改也被向后移植到: 1.0.15
参考链接: #3743
[bug] [ext] ¶
当作为 AttributeError 引发时,sqlalchemy.ext.indexable 将拦截 IndexError 以及 KeyError。
1.1.0b2¶
发布日期:2016 年 7 月 1 日sql¶
[sql] [bug] ¶
修复了 SQL 数学求反运算符中的问题,其中表达式的类型不再是原始类型的数值类型。 这会导致类型确定结果集行为的问题。
此更改也被向后移植到: 1.0.14
参考链接: #3735
[sql] [bug] ¶
修复了
__getstate__
/__setstate__
方法由于 1.0 系列过渡到__slots__
而无法用于 sqlalchemy.util.Properties 的错误。 此问题可能会影响某些第三方应用程序。 由 Pieter Mulder 友情提供 Pull request。此更改也被向后移植到: 1.0.14
参考链接: #3728
[sql] [bug] ¶
对于仅具有整数类型的后端,
Boolean
数据类型执行的处理在纯 Python 和 C 扩展版本之间已保持一致,因为 C 扩展版本将接受数据库中的任何整数值作为布尔值,而不仅仅是零和一;此外,发送到数据库的非布尔整数值将被强制转换为精确的零或一,而不是作为原始整数值传递。参考链接: #3730
[sql] [bug] ¶
在
Enum
中稍微回滚了验证规则,以允许未知字符串值通过,除非将标志validate_string=True
传递给 Enum;任何其他类型的对象当然仍然会被拒绝。 虽然直接用途是允许使用 LIKE 与枚举进行比较,但此用途的存在表明可能存在比我们预期的更多的未知字符串比较用例,这暗示可能也存在一些未知的字符串 INSERT 用例。参考链接: #3725
postgresql¶
mysql¶
[mysql] [bug] ¶
稍微调整了 No more generation of an implicit KEY for composite primary key w/ AUTO_INCREMENT 中描述的 “按自动递增对主键列进行排序”,以便如果显式定义了
PrimaryKeyConstraint
,则完全保持列的顺序,从而在必要时允许控制此行为。参考链接: #3726
1.1.0b1¶
发布日期:2016 年 6 月 16 日orm¶
[orm] [feature] [ext] ¶
添加了一个新的 ORM 扩展 Indexable,它允许构建 Python 属性,这些属性引用 “索引” 结构的特定元素,例如数组和 JSON 字段。 由 Jeong YunWon 友情提供 Pull request。
另请参阅
[orm] [feature] ¶
添加了新标志
Session.bulk_insert_mappings.render_nulls
,它允许在渲染 NULL 值的情况下发生 ORM 批量 INSERT;这绕过了服务器端默认值,但允许所有语句使用相同的列集形成,从而允许它们被批处理。 由 Tobias Sauerwein 友情提供 Pull request。[orm] [feature] ¶
添加了新事件
AttributeEvents.init_scalar()
,以及一个新的示例套件,说明了它的用法。 此事件可用于在对象持久化之前为 Python 端属性提供 Core 生成的默认值。参考链接: #1311
[orm] [feature] ¶
将
AutomapBase.prepare.schema
添加到AutomapBase.prepare()
方法,以指示如果不是默认架构,应从哪个架构表反射。 由 Josh Marlow 友情提供 Pull request。[orm] [feature] ¶
为可用的映射器选项添加了新参数
mapper.passive_deletes
。 这允许对仅针对基表的连接表继承映射执行 DELETE,同时允许 ON DELETE CASCADE 处理从子类表中删除行。参考链接: #2349
[orm] [feature] ¶
当核心 SQL 构造包含非标准 SQL 元素(如 RETURNING、数组索引操作或特定于方言或自定义的数据类型)时,调用 str() 会变得更加 “友好”。 在这些情况下,现在返回一个字符串,该字符串呈现了构造的近似值(通常是 PostgreSQL 样式的版本),而不是引发错误。
参考链接: #3631
[orm] [feature] ¶
Query
的str()
调用现在将考虑Engine
(Session
绑定到该Engine
),在生成 SQL 的字符串形式时,以便显示将发送到数据库的实际 SQL(如果可能)。 以前,只有与映射关联的MetaData
关联的引擎才会被使用(如果存在)。 如果在Session
或与映射关联的MetaData
上都找不到绑定,则使用 “default” 方言来渲染 SQL,就像以前的情况一样。参考链接: #3081
[orm] [feature] ¶
现在,
SessionEvents
套件包含了事件,以便能够明确地跟踪所有对象的生命周期状态转换,这些转换都与Session
本身相关,例如:pending(待定)、transient(短暂)、persistent(持久)、detached(分离)。每个事件中对象的状态也已定义。另请参阅
参考:#2677
[orm] [功能] ¶
添加了一个新的 session 生命周期状态 deleted(已删除)。这个新状态表示一个对象已经从 persistent(持久) 状态删除,并且一旦事务提交,将移动到 detached(分离) 状态。这解决了长期存在的问题,即已删除的对象存在于持久状态和分离状态之间的灰色地带。
InstanceState.persistent
访问器将不再报告已删除的对象为持久对象;InstanceState.deleted
访问器将改为对这些对象返回 True,直到它们变为分离状态。另请参阅
参考:#2677
[orm] [功能] ¶
为常见的错误情况添加了新的检查,即在上下文中将映射类或映射实例作为 SQL 绑定参数传递;为此引发了一个新的异常。
参考:#3321
[orm] [功能] ¶
添加了新的关系加载策略
raiseload()
(也可以通过lazy='raise'
访问)。此策略的行为几乎类似于noload()
,但它不是返回None
,而是引发 InvalidRequestError。拉取请求由 Adrian Moennich 提供。参考:#3512
[orm] [变更] ¶
Mapper.order_by
参数已被弃用。这是一个旧参数,与 SQLAlchemy 的工作方式不再相关,自从引入 Query 对象后就无关紧要了。通过弃用它,我们确立了我们不支持无法正常工作的用例,并且我们鼓励应用程序停止使用此参数。另请参阅
参考:#3394
[orm] [变更] ¶
Session.weak_identity_map
参数已被弃用。请参阅 Session 引用行为 中的新方案,了解基于事件的方法来维护强身份映射行为。另请参阅
参考:#2677
[orm] [错误修复] ¶
修复了当多对一关系中,一个对象从一个父对象更改为另一个父对象时,如果同时未刷新外键属性的修改,可能会出现不一致行为的问题。属性移动现在会考虑外键的数据库提交值,以便找到被移动对象的“先前”父对象。这允许事件正确触发,包括反向引用事件。以前,这些事件并非总是触发。可能依赖于先前错误行为的应用程序可能会受到影响。
参考:#3708
[orm] [错误修复] ¶
修复了当使用
session.merge(obj, load=False)
将延迟加载列合并到会话中时,延迟加载列会被错误地设置为在下次对象范围的取消过期时进行数据库加载的错误。参考:#3488
[orm] [错误修复] [mysql] ¶
进一步延续了常见的 MySQL 异常情况,即保存点被取消,首次在 #2696 中讨论过,当 SAVEPOINT 在回滚之前消失时,
Session
所处失败模式已得到改进,允许Session
在该保存点之外仍然可以正常工作。假设保存点操作失败并被取消。参考:#3680
[orm] [错误修复] ¶
修复了新插入的实例在回滚后仍然可能在下一次事务中导致持久性冲突的错误,因为该实例不会被检查是否已过期。此修复将解决大量错误地导致 “具有标识 X 的新实例与持久实例 Y 冲突” 错误的情况。
参考:#3677
[orm] [错误修复] ¶
改进了
Query.correlate()
的工作方式,当使用表示多个表直接连接的“多态”实体时,该语句将确保连接中的所有表都是关联的一部分。参考:#3662
[orm] [错误修复] ¶
修复了当连接的急切加载来自一行,其中同一实体多次出现,有些调用需要急切加载属性,而另一些则不需要时,会导致急切加载的多对一属性无法加载的错误。此处的逻辑已修改为接受该属性,即使不同的加载器路径已处理了父实体。
另请参阅
参考:#3431
[orm] [错误修复] ¶
对在
Query.distinct()
与Query.order_by()
结合使用时,将列添加到结果 SQL 的逻辑进行了改进,使得已存在的列不会被第二次添加,即使它们被标记为不同的名称。无论此更改如何,添加到 SQL 的额外列从未在最终结果中返回,因此此更改仅影响语句的字符串形式以及在核心执行上下文中使用时的行为。此外,当使用 DISTINCT ON 格式时,不再添加列,前提是查询不会由于连接的急切加载而包装在子查询中。参考:#3641
[orm] [错误修复] ¶
修复了当两个同名关系引用基类和具体继承子类时,如果这些关系使用 “backref” 设置,则会引发错误的问题,而使用 relationship() 代替并使用冲突的名称设置相同的配置会成功,这在具体映射的情况下是允许的。
参考:#3630
[orm] [错误修复] ¶
Session.merge()
方法现在在发出 INSERT 之前按主键跟踪待定对象,并将遇到的具有重复主键的不同对象合并在一起,这本质上充其量是半确定性的。此行为与持久对象已经发生的情况相匹配。参考:#3601
[orm] [错误修复] ¶
修复了在某些不适当的情况下,例如从单表继承子类的 exists() 查询时,单表继承标准会被添加到查询末尾的错误。
另请参阅
参考:#3582
[orm] [错误修复] ¶
添加了一个新的类型级别修饰符
TypeEngine.evaluates_none()
,它向 ORM 指示,应该将一组正值的 None 持久化为 NULL 值,而不是从 INSERT 语句中省略该列。此功能既用作 #3514 实现的一部分,也用作任何类型上可用的独立功能。参考:#3250
[orm] [错误修复] ¶
Session.bulk_save_objects()
和相关的批量方法中的 “记账” 函数的内部调用已缩减到目前未使用此功能的程度,例如检查 INSERT 或 UPDATE 语句后要获取的列默认值。参考:#3526
[orm] [错误修复] [postgresql] ¶
对
None
值与 PostgreSQLJSON
类型结合使用的情况进行了额外的修复。当JSON.none_as_null
标志保留其默认值False
时,无论何时 ORM 对象上的值设置为None
值,或者当None
值与Session.bulk_insert_mappings()
一起使用时,ORM 现在都会正确地将 JSON “'null'” 字符串插入到列中,包括如果该列具有默认值或服务器默认值。参考:#3514
engine¶
[engine] [功能] ¶
添加了连接池事件
ConnectionEvents.close()
、ConnectionEvents.detach()
、ConnectionEvents.close_detached()
。[engine] [功能] ¶
现在,所有绑定参数集和结果行的字符串格式化,用于日志记录、异常和
repr()
目的,都会截断每个集合中非常大的标量值,包括 “N 个字符被截断” 的注释,类似于大型多参数集的显示本身被截断的方式。参考:#2837
[engine] [功能] ¶
添加了
Table
对象的多租户模式转换。这支持应用程序在多个模式中使用同一组Table
对象(例如每个用户一个模式)的用例。添加了一个新的执行选项Connection.execution_options.schema_translate_map
。另请参阅
参考:#2685
[engine] [功能] ¶
为 engine 添加了一个新的入口点系统,允许在 URL 的查询字符串中声明 “插件”。可以编写自定义插件,这些插件将有机会预先更改和/或使用 engine 的 URL 和关键字参数,然后在 engine 创建时,将获得 engine 本身,以允许额外的修改或事件注册。插件编写为
CreateEnginePlugin
的子类;有关详细信息,请参阅该类。参考:#3536
sql¶
[sql] [功能] ¶
通过新的
FromClause.tablesample()
方法和独立函数添加了 TABLESAMPLE 支持。拉取请求由 Ilja Everilä 提供。另请参阅
参考:#3718
[sql] [功能] ¶
在使用
over.range_
和over.rows
参数的窗口函数中添加了范围支持。参考:#3049
[sql] [功能] ¶
实现了 SQLite 和 PostgreSQL 的 CHECK 约束的反射。这可以通过新的 inspector 方法
Inspector.get_check_constraints()
以及在反射Table
对象时以CheckConstraint
对象形式出现在 constraints 集合中来使用。拉取请求由 Alex Grönholm 提供。[sql] [功能] ¶
新的
ColumnOperators.is_distinct_from()
和ColumnOperators.isnot_distinct_from()
运算符;拉取请求由 Sebastian Bank 提供。[sql] [功能] ¶
在
DDLCompiler.visit_create_table()
中添加了一个钩子,名为DDLCompiler.create_table_suffix()
,允许自定义方言在 “CREATE TABLE” 子句后添加关键字。拉取请求由 Mark Sandan 提供。[sql] [功能] ¶
ResultProxy
返回的行现在可以容纳负整数索引。拉取请求由 Emanuele Gaifas 提供。另请参阅
[sql] [功能] ¶
添加了
Select.lateral()
和相关结构,以支持 SQL 标准 LATERAL 关键字,目前仅 PostgreSQL 支持。另请参阅
参考:#2857
[sql] [功能] ¶
添加了对 Core 和 ORM 渲染 “FULL OUTER JOIN” 的支持。拉取请求由 Stefan Urbanek 提供。
参考:#1957
[sql] [功能] ¶
CTE 功能已扩展为支持所有 DML,允许 INSERT、UPDATE 和 DELETE 语句既可以指定自己的 WITH 子句,也可以在包含 RETURNING 子句时,这些语句本身成为 CTE 表达式。
参考:#2551
[sql] [功能] ¶
为
Enum
数据类型添加了对 PEP-435 样式枚举类的支持,即 Python 3 的enum.Enum
类,但也包括兼容的枚举库。Enum
数据类型现在还执行传入值的 Python 内验证,并添加了一个选项来放弃创建 CHECK 约束Enum.create_constraint
。拉取请求由 Alex Grönholm 提供。[sql] [功能] ¶
对最近添加的
TextClause.columns()
方法及其与结果行处理的交互进行了深度改进,现在允许传递给方法的列与语句中的结果列进行位置匹配,而不是仅按名称匹配。这样做的好处包括,当将文本 SQL 语句链接到 ORM 或 Core 表模型时,无需进行公共列名称的标记或去重系统,这也意味着无需担心标签名称如何与 ORM 列等匹配。此外,ResultProxy
已得到进一步增强,以便在某些情况下更精确地将列和字符串键映射到行。参考:#3501
[sql] [功能] ¶
为 core 添加了一个新类型
JSON
。这是 PostgreSQLJSON
类型以及新的JSON
类型的基类,以便可以使用 PG/MySQL 不可知的 JSON 列。该类型具有基本的索引和路径搜索支持。另请参阅
参考:#3619
[sql] [功能] ¶
添加了对
<function> WITHIN GROUP (ORDER BY <criteria>)
形式的 “集合聚合” 函数的支持,使用方法FunctionElement.within_group()
。添加了一系列常见的集合聚合函数,其返回类型派生自集合。这包括像percentile_cont
、dense_rank
等函数。参考:#1370
[sql] [功能] [postgresql] ¶
添加了对 SQL 标准函数
array_agg
的支持,该函数自动返回正确类型的ARRAY
并支持索引/切片操作,以及array_agg()
,它返回一个具有额外比较功能的ARRAY
。由于目前仅 PostgreSQL 支持数组,因此实际上仅在 PostgreSQL 上有效。还添加了一个新的构造aggregate_order_by
,以支持 PG 的 “ORDER BY” 扩展。参考:#3132
[sql] [功能] ¶
核心部分新增了一种类型
ARRAY
。这是 PostgreSQLARRAY
类型的基类,现在是 Core 的一部分,开始支持各种 SQL 标准的数组支持功能,包括一些函数以及最终在其他具有“数组”概念的数据库(如 DB2 或 Oracle)上对原生数组的支持。此外,还添加了新的操作符any_()
和all_()
。这些操作符不仅支持 PostgreSQL 上的数组构造,还支持 MySQL 上可用的子查询(但遗憾的是在 PostgreSQL 上不可用)。参考: #3516
[sql] [change] [mysql] ¶
Column
考虑自身为“自动递增”列的系统已更改,因此对于具有复合主键的Table
,不再隐式启用自动递增。为了能够为复合主键成员列启用自动递增,同时保持 SQLAlchemy 长期以来为单个整数主键启用隐式自动递增的行为,Column.autoincrement
参数"auto"
中添加了第三种状态,现在这是默认状态。参考链接: #3216
[sql] [bug] ¶
FromClause.count()
已弃用。此函数使用表中的任意列,并且不可靠;对于 Core 用法,应首选func.count()
。参考: #3724
[sql] [bug] ¶
修复了当
Index
与小写 tTableClause
关联的Column
关联时,会不恰当地引发断言的问题;对于将索引与Table
关联的目的,应忽略此关联。参考: #3616
[sql] [bug] ¶
type_coerce()
构造现在是一个完全成熟的 Core 表达式元素,它在编译时进行延迟评估。以前,该函数只是一个转换函数,它会通过返回面向列的表达式的Label
或给定的BindParameter
对象的副本,来处理不同的表达式输入,这尤其阻止了当 ORM 级别的表达式转换将列转换为绑定参数时(例如,对于延迟加载)逻辑维护操作。参考: #3531
[sql] [bug] ¶
TypeDecorator
类型扩展器现在将与SchemaType
实现(通常是Enum
或Boolean
)协同工作,以确保每个表的事件从实现类型传播到外部类型。这些事件用于确保约束或 PostgreSQL 类型(例如 ENUM)与父表一起正确创建(并可能删除)。参考: #2919
[sql] [bug] ¶
union()
构造以及相关构造(如Query.union()
)的行为现在可以处理由于嵌入的 SELECT 语句包含 LIMIT、OFFSET 和/或 ORDER BY 而需要用括号括起来的情况。这些查询在 SQLite 上不起作用,并且会在该后端上失败,就像以前一样,但现在应该在所有其他后端上工作。参考: #2528
schema¶
postgresql¶
[postgresql] [feature] ¶
使用新的 PostgreSQL 特定的
Insert
对象,添加了对 PostgreSQL 的 INSERT..ON CONFLICT 的支持。拉取请求和大量工作由 Robin Thomas 完成。参考: #3529
[postgresql] [feature] ¶
如果在
Index
上设置了postgresql_concurrently
标志,并且使用的数据库被检测为 PostgreSQL 9.2 或更高版本,则 DROP INDEX 的 DDL 将发出 “CONCURRENTLY”。对于 CREATE INDEX,还添加了数据库版本检测,如果 PG 版本低于 8.2,则会省略该子句。拉取请求由 Iuri de Silvio 提供。[postgresql] [feature] ¶
添加了新的参数
PGInspector.get_view_names.include
,允许指定应返回何种类型的视图。目前包括 “plain” 和 “materialized” 视图。拉取请求由 Sebastian Bank 提供。参考: #3588
[postgresql] [feature] ¶
将
postgresql_tablespace
添加为Index
的参数,以允许在 PostgreSQL 中为索引指定 TABLESPACE。补充了Table
上的同名参数。拉取请求由 Benjamin Bertrand 提供。参考: #3720
[postgresql] [feature] ¶
添加了新的参数
GenerativeSelect.with_for_update.key_share
,它将呈现FOR NO KEY UPDATE
版本的FOR UPDATE
和FOR KEY SHARE
,而不是 PostgreSQL 后端上的FOR SHARE
。拉取请求由 Sergey Skopin 提供。[postgresql] [feature] [oracle] ¶
添加了新的参数
GenerativeSelect.with_for_update.skip_locked
,它将为 PostgreSQL 和 Oracle 后端上的FOR UPDATE
或FOR SHARE
锁呈现SKIP LOCKED
短语。拉取请求由 Jack Zhou 提供。[postgresql] [feature] ¶
为 PyGreSQL PostgreSQL 方言添加了一个新的方言。感谢 Christoph Zwerschke 和 Kaolin Imago Fire 的努力。
[postgresql] [feature] ¶
添加了一个新的常量
JSON.NULL
,表示无论其他设置如何,都应将 JSON NULL 值用于值。另请参阅
参考:#3514
[postgresql] [change] ¶
长期弃用的
sqlalchemy.dialects.postgres
模块已移除;多年来,这已发出警告,项目应调用sqlalchemy.dialects.postgresql
。但是,postgres://
形式的引擎 URL 仍将继续工作。[postgresql] [bug] ¶
为
Inspector.get_view_definition()
方法的 PostgreSQL 版本添加了对反映物化视图源的支持。参考: #3587
[postgresql] [bug] ¶
引用
Enum
或ENUM
子类型的ARRAY
对象的使用,现在将在类型在 “CREATE TABLE” 或 “DROP TABLE” 中使用时发出预期的 “CREATE TYPE” 和 “DROP TYPE” DDL。参考: #2729
[postgresql] [bug] ¶
ARRAY
、JSON
和HSTORE
等特殊数据类型上的 “hashable” 标志现在设置为 False,这允许这些类型在包含行内实体的 ORM 查询中可获取。参考: #3499
[postgresql] [bug] ¶
PostgreSQL
ARRAY
类型现在支持多维索引访问,例如somecol[5][6]
这样的表达式,无需任何显式转换或类型强制,前提是ARRAY.dimensions
参数设置为所需的维度数。参考: #3487
[postgresql] [bug] ¶
使用索引访问时,
JSON
和JSONB
的返回类型已修复为像 PostgreSQL 本身一样工作,并返回一个本身就是JSON
或JSONB
类型的表达式。以前,访问器会返回NullType
,这不允许随后使用类似 JSON 的运算符。参考: #3503
[postgresql] [bug] ¶
JSON
、JSONB
和HSTORE
数据类型现在允许完全控制索引文本访问操作的返回类型,对于 JSON 类型,可以使用column[someindex].astext
,对于 HSTORE 类型,可以使用column[someindex]
,通过JSON.astext_type
和HSTORE.text_type
参数。参考: #3503
[postgresql] [bug] ¶
Comparator.astext
修饰符不再隐式调用ColumnElement.cast()
,因为 PG 的 JSON/JSONB 类型也允许彼此交叉转换。使用ColumnElement.cast()
对 JSON 索引访问的代码,例如col[someindex].cast(Integer)
,将需要更改为显式调用Comparator.astext
。参考: #3503
mysql¶
[mysql] [feature] ¶
通过 AUTOCOMMIT 隔离级别设置,添加了对 MySQL 驱动程序上 “autocommit” 的支持。拉取请求由 Roman Podoliaka 提供。
参考: #3332
[mysql] [feature] ¶
为 MySQL 5.7 添加了
JSON
。JSON 类型提供 JSON 值在 MySQL 中的持久性,以及 “getitem” 和 “getpath” 的基本运算符支持,利用JSON_EXTRACT
函数来引用 JSON 结构中的各个路径。另请参阅
参考: #3547
[mysql] [change] ¶
当为使用 InnoDB 的表生成 CREATE TABLE DDL 时,MySQL 方言不再生成额外的 “KEY” 指令,该表具有复合主键,并且在非第一列的列上具有 AUTO_INCREMENT;为了克服 InnoDB 在此处的限制,现在生成 PRIMARY KEY 约束,并将 AUTO_INCREMENT 列放在列列表的首位。
参考链接: #3216
sqlite¶
[sqlite] [feature] ¶
SQLite 方言现在反映外键约束中的 ON UPDATE 和 ON DELETE 短语。拉取请求由 Michal Petrucha 提供。
[sqlite] [feature] ¶
SQLite 方言现在反映主键约束的名称。拉取请求由 Diana Clarke 提供。
另请参阅
参考: #3629
[sqlite] [change] ¶
为 SQLite 方言添加了对
Inspector.get_schema_names()
方法的支持,以与 SQLite 一起使用;拉取请求由 Brian Van Klaveren 提供。还修复了对使用 schema 创建索引以及在 schema 绑定表中反射外键约束的支持。另请参阅
[sqlite] [bug] ¶
当检测到 SQLite 版本 3.7.16 或更高版本时,取消了 SQLite 上右嵌套连接的解决方法,其中右嵌套连接被重写为子查询,以便解决 SQLite 缺少对此语法的支持的问题。
参考: #3634
[sqlite] [bug] ¶
当检测到 SQLite 版本 3.10.0 或更高版本时,禁用了 SQLite 意外地将列名作为
tablename.columnname
传递的解决方法。参考: #3633
mssql¶
[mssql] [feature] ¶
UniqueConstraint
、PrimaryKeyConstraint
、Index
上可用的mssql_clustered
标志现在默认为None
,并且可以设置为 False,这将为主键呈现 NONCLUSTERED 关键字,从而允许将不同的索引用作 “clustered”。拉取请求由 Saulius Žemaitaitis 提供。[mssql] [feature] ¶
通过
create_engine.isolation_level
和Connection.execution_options.isolation_level
参数,为 SQL Server 方言添加了基本隔离级别支持。参考: #3534
[mssql] [change] ¶
作为 #3424 的一部分,在 1.0.5 版本中引入的
legacy_schema_aliasing
标志,用于允许禁用 MSSQL 方言尝试为 schema 限定的表创建别名,现在默认为 False;除非显式启用,否则旧的行为现在被禁用。参考: #3434
[mssql] [bug] ¶
调整了 mxODBC 方言,以便在与
VARBINARY
数据类型结合使用时,适当地使用BinaryNull
符号。拉取请求由 Sheila Allen 提供。[mssql] [bug] ¶
修复了 SQL Server 方言在反映具有无界长度的字符串或其他可变长度列类型时,通过将标记
"max"
分配给字符串的长度属性的问题。虽然 SQL Server 方言支持显式使用"max"
标记,但它不是基本字符串类型的正常约定的一部分,而是应该将长度保留为 None。现在,方言在反射类型时将长度分配为 None,以便该类型在其他上下文中表现正常。参考: #3504
misc¶
[feature] [ext] ¶
为 Mutation Tracking 扩展添加了
MutableSet
和MutableList
辅助类。拉取请求由 Jeong YunWon 提供。参考: #3297
[bug] [ext] ¶
混合属性或方法上指定的文档字符串现在在类级别上被接受,允许它与 Sphinx autodoc 等工具一起使用。此处的机制必然涉及对混合属性发生的表达式进行一些包装,这可能会导致它们在使用内省时看起来有所不同。
参考: #3653
[bug] [sybase] ¶
不受支持的 Sybase 方言现在在尝试编译包含 “offset” 的查询时引发
NotImplementedError
;Sybase 没有直接的 “offset” 功能。参考: #2278
flambé! the dragon and The Alchemist image designs created and generously donated by Rotem Yaari.
使用 Sphinx 7.2.6 创建。文档上次生成时间:Tue 11 Mar 2025 02:40:17 PM EDT