SqlAlchemy 2.0 中文文档(六十二)(4)https://developer.aliyun.com/article/1560761
1.1.0b1
发布日期:2016 年 6 月 16 日
orm
- [orm] [feature] [ext]
新增 ORM 扩展 Indexable,允许构建 Python 属性,这些属性引用“索引”结构的特定元素,如数组和 JSON 字段。感谢 Jeong YunWon 提交的拉取请求。
另请参阅
新的 Indexable ORM 扩展 - [orm] [功能]
新增标志Session.bulk_insert_mappings.render_nulls
,允许 ORM 批量插入时渲染 NULL 值;这将绕过服务器端默认值,但允许所有语句使用相同的列集合,从而可以进行批处理。感谢 Tobias Sauerwein 提交的拉取请求。 - [orm] [功能]
新增事件AttributeEvents.init_scalar()
,以及一个新的示例套件,说明其用法。此事件可用于在对象持久化之前为 Python 端属性提供 Core 生成的默认值。
另请参阅
ORM 层面新增 init_scalar() 事件拦截默认值
参考:#1311 - [orm] [功能]
在AutomapBase.prepare()
方法中新增AutomapBase.prepare.schema
,用于指示应从哪个模式反射表,如果不是默认模式。感谢 Josh Marlow 提交的拉取请求。 - [orm] [功能]
新增参数mapper.passive_deletes
到可用的映射器选项中。这允许针对基表进行 DELETE 操作,而允许 ON DELETE CASCADE 处理从子类表中删除行。
另请参阅
joined-inheritance 映射的 passive_deletes 功能
参考:#2349 - [orm] [功能]
当对核心 SQL 构造调用 str() 时,如果构造包含非标准 SQL 元素,如 RETURNING、数组索引操作或方言特定或自定义数据类型,则现在更加“友好”。在这些情况下,将返回一个字符串,呈现构造的近似值(通常是其 PostgreSQL 风格的版本),而不是引发错误。
另请参阅
不带方言的 Core SQL 构造的“友好”字符串化
参考:#3631 - [orm] [功能]
对于Query
的str()
调用现在将考虑绑定到Session
的Engine
,在生成 SQL 的字符串形式时,如果可能的话,显示将要发送到数据库的实际 SQL。以前,只有与映射相关联的MetaData
关联的引擎会被使用,如果存在的话。如果无法在Session
或与映射相关联的MetaData
上找到绑定,则将使用“默认”方言来呈现 SQL,就像以前一样。
另请参阅
查询的字符串化将查询会话的正确方言
参考:#3081 - [orm] [feature]
SessionEvents
套件现在包括事件,允许明确跟踪所有对象生命周期状态转换,例如Session
本身,如挂起、瞬态、持久、分离。还定义了每个事件中对象的状态。
另请参阅
新的会话生命周期事件
参考:#2677 - [orm] [feature]
添加了一个新的会话生命周期状态 deleted。这个新状态表示一个已经从 persistent 状态中删除的对象,一旦事务提交,它将转移到 detached 状态。这解决了长期存在的问题,即被删除的对象存在于持久和分离之间的灰色区域。InstanceState.persistent
访问器将不再报告已删除对象为持久;相反,这些对象的InstanceState.deleted
访问器将为 True,直到它们变为分离状态。
另请参阅
新的会话生命周期事件
参考:#2677 - [orm] [feature]
添加了新的检查,用于常见错误情况,即将映射类或映射实例传递到被解释为 SQL 绑定参数的上下文中;为此将引发新异常。
另请参阅
为传递映射类和实例添加了特定检查作为 SQL 字面值
参考:#3321 - [orm] [feature]
添加了新的关系加载策略raiseload()
(也可通过lazy='raise'
访问)。此策略的行为几乎与noload()
相同,但不是返回None
而是引发一个 InvalidRequestError。拉取请求由 Adrian Moennich 提供。
另请参阅
新的“raise”/“raise_on_sql”加载策略
参考:#3512 - [orm] [change]
Mapper.order_by
参数已弃用。这是一个旧参数,与 SQLAlchemy 的工作方式不再相关,一旦引入了 Query 对象。通过弃用它,我们确立了我们不支持不起作用的用例,并鼓励应用程序停止使用此参数。
另请参阅
Mapper.order_by 已弃用
参考:#3394 - [orm] [change]
Session.weak_identity_map
参数已弃用。请参阅 Session Referencing Behavior 中的新配方,了解基于事件的维护强引用映射行为的方法。
另请参阅
新的会话生命周期事件
参考:#2677 - [orm] [bug]
修复了一个问题,即将对象从一个父对象改为另一个父对象的多对一更改在与未刷新的外键属性修改结合时可能工作不一致的情况。现在,属性移动考虑了外键的数据库提交值,以定位正在移动的对象的“先前”父对象。这样可以正确触发事件,包括反向引用事件。以前,这些事件并不总是触发。可能依赖于先前破损行为的应用可能会受到影响。
另请参阅
涉及用户启动的外键操作的多对一对象移动的修复
参考:#3708 - [orm] [bug]
修复了延迟列在对象被合并到会话中时不经意地设置为数据库加载的错误,该对象在下一个对象范围的未过期时,通过session.merge(obj, load=False)
合并到会话中。
参考:#3488 - [orm] [bug] [mysql]
进一步延续了最初在#2696中涵盖的常见 MySQL 异常情况,即在回滚之前 SAVEPOINT 被取消的情况下,Session
的故障模式已经改进,以允许Session
仍然在那个 SAVEPOINT 之外正常运行。假设保存点操作失败并已取消。
另请参阅
取消数据库 SAVEPOINT 时改进的会话状态
参考:#3680 - [orm] [bug]
修复了一个错误,即如果回滚了一个新插入的实例,由于实例未检查是否已过期,因此仍可能在下一个事务中导致持久性冲突。此修复将解决大量错误地导致“新实例 X 的标识与持久实例 Y 冲突”的错误的情况。
另请参阅
修复了错误的“新实例 X 与持久实例 Y 冲突”的 flush 错误
参考:#3677 - [orm] [bug]
对Query.correlate()
的改进,当使用代表多个表直接连接的“多态”实体时,语句将确保连接中的所有表都是相关的。
另请参阅
使用多态实体改进 Query.correlate 方法
参考:#3662 - [orm] [bug]
修复了一个错误,该错误可能导致急切加载的多对一属性未加载,如果连接的急切加载来自同一个实体在多个位置出现的行,则一些位置需要急切加载属性,而其他位置不需要。这里的逻辑已经修改,以便即使不同的加载路径已经处理了父实体,也要接受该属性。
另请参阅
在一行中多次出现相同实体的连接急切加载
参考:#3431 - [orm] [bug]
对于Query.distinct()
与Query.order_by()
组合时向生成的 SQL 添加列的逻辑进行了优化,以便已经存在的列不会被第二次添加,即使它们使用不同的名称标记。无论这种更改,SQL 中添加的额外列从未在最终结果中返回,因此这种更改仅影响语句的字符串形式以及在核心执行上下文中使用时的行为。此外,当使用 DISTINCT ON 格式时,如果查询由于连接的急加载而不是包装在子查询中,则不再添加列。
另请参阅
使用 DISTINCT + ORDER BY 时不再冗余添加列
参考:#3641 - [orm] [bug]
修复了两个同名关系引用基类和具体继承子类时,如果这些关系是使用“backref”设置的,会引发错误的问题,而使用 relationship()设置相同配置并使用冲突名称则会成功,这在具体映射的情况下是允许的。
另请参阅
应用于具体继承子类时,同名 backrefs 不会引发错误
参考:#3630 - [orm] [bug]
Session.merge()
方法现在在发出 INSERT 之前通过主键跟踪待处理对象,并在遇到重复主键的不同对象时将其合并在一起,这在最好的情况下基本上是半确定性的。这种行为与持久对象的情况已经匹配。
另请参阅
Session.merge 解决待处理冲突与持久对象相同
参考:#3601 - [orm] [bug]
修复了在某些不适当情况下,例如从单继承子类的 exists()查询时,会将“单表继承”条件添加到查询末尾的错误。
另请参阅
对单表继承查询的进一步修复
参考:#3582 - [orm] [bug]
添加了一个新的类型级修饰符TypeEngine.evaluates_none()
,指示 ORM 应将一组正值的 None 持久化为值 NULL,而不是在 INSERT 语句中省略列。此功能既用作#3514的实现的一部分,也可作为任何类型上可用的独立功能。
另请参阅
新增选项允许显式持久化 NULL 而不是默认值
参考:#3250 - [orm] [bug]
在Session.bulk_save_objects()
和相关批量方法中的“簿记”函数的内部调用已经减少到目前未使用此功能的程度,例如在 INSERT 或 UPDATE 语句之后获取列默认值的检查。
参考:#3526 - [orm] [bug] [postgresql]
关于 PostgreSQLJSON
类型中None
值的额外修复已经完成。当JSON.none_as_null
标志保持默认值False
时,ORM 现在将正确地在 ORM 对象上的值设置为None
或在使用Session.bulk_insert_mappings()
时将 JSON“‘null’”字符串插入到列中,包括如果列上有默认值或服务器默认值。
另请参阅
ORM 操作中 JSON 的“null”如预期般插入,当不存在时被省略
新增选项允许显式持久化 NULL 而不是默认值
参考:#3514
引擎
- [engine] [feature]
添加了连接池事件ConnectionEvents.close()
,ConnectionEvents.detach()
,ConnectionEvents.close_detached()
。 - [engine] [feature]
现在,用于日志记录、异常和repr()
目的的所有绑定参数集和结果行的字符串格式化都会在每个集合中截断非常大的标量值,包括“N 个字符被截断”的标记,类似于大型多参数集的显示本身被截断的方式。
另请参阅
日志和异常显示中现在截断大型参数和行值
参考:#2837 - [engine] [feature]
为Table
对象添加了多租户模式翻译。这支持应用程序在许多模式中使用相同的Table
对象的用例,例如每用户一个模式的模式。增加了一个新的执行选项Connection.execution_options.schema_translate_map
。
另请参阅
Table 对象的多租户模式翻译
参考文献:#2685 - [engine] [特性]
在引擎中增加了一个新的入口系统,允许在 URL 的查询字符串中声明“插件”。可以编写自定义插件,这些插件将被提前给予修改和/或使用引擎的 URL 和关键字参数的机会,然后在引擎创建时将被给予引擎本身以允许额外的修改或事件注册。插件被编写为CreateEnginePlugin
的子类;详见该类的详细信息。
参考文献:#3536
sql
- [sql] [特性]
通过新的FromClause.tablesample()
方法和独立函数添加了 TABLESAMPLE 支持。感谢 Ilja Everilä 的 Pull 请求。
另请参阅
TABLESAMPLE 支持
参考文献:#3718 - [sql] [特性]
增加了对窗口函数中范围的支持,使用over.range_
和over.rows
参数。
另请参阅
窗口函数内的 RANGE 和 ROWS 规范支持
参考文献:#3049 - [sql] [特性]
实现了 SQLite 和 PostgreSQL 的 CHECK 约束反射。通过新的检查器方法Inspector.get_check_constraints()
以及在反映Table
对象时以CheckConstraint
对象的形式存在于约束集合中。感谢 Alex Grönholm 的 Pull 请求。 - [sql] [特性]
新增ColumnOperators.is_distinct_from()
和ColumnOperators.isnot_distinct_from()
操作符;感谢 Sebastian Bank 提交的拉取请求。
另请参阅
IS DISTINCT FROM 和 IS NOT DISTINCT FROM 的支持 - [sql] [feature]
在DDLCompiler.visit_create_table()
中添加了名为DDLCompiler.create_table_suffix()
的钩子,允许自定义方言在 “CREATE TABLE” 子句之后添加关键字。感谢 Mark Sandan 提交的拉取请求。 - [sql] [feature]
ResultProxy
返回的行现在支持负整数索引。感谢 Emanuele Gaifas 提交的拉取请求。
另请参阅
核心结果行可容纳负整数索引 - [sql] [feature]
添加Select.lateral()
和相关构造,以支持 SQL 标准的 LATERAL 关键字,目前仅受 PostgreSQL 支持。
另请参阅
SQL LATERAL 关键字的支持
参考:#2857 - [sql] [feature]
添加对 “FULL OUTER JOIN” 的渲染支持,包括 Core 和 ORM。感谢 Stefan Urbanek 提交的拉取请求。
另请参阅
核心和 ORM 对 FULL OUTER JOIN 的支持
参考:#1957 - [sql] [feature]
CTE 功能已扩展以支持所有 DML,允许 INSERT、UPDATE 和 DELETE 语句指定自己的 WITH 子句,以及在这些语句包含 RETURNING 子句时,这些语句本身也可以是 CTE 表达式。
另请参阅
CTE 支持 INSERT、UPDATE、DELETE
参考:#2551 - [sql] [feature]
添加对 PEP-435 样式的枚举类的支持,包括 Python 3 的enum.Enum
类,以及兼容的枚举库,到Enum
数据类型中。Enum
数据类型现在还在 Python 中对传入的值进行验证,并添加了一个选项来跳过创建 CHECK 约束Enum.create_constraint
. 感谢 Alex Grönholm 提交的拉取请求。
另请参阅
对 Python 原生枚举类型及兼容形式的支持
Enum 类型现在对值进行了在 Python 中的验证
参考:#3095, #3292 - [sql] [feature]
最近新增的TextClause.columns()
方法及其与结果行处理的交互得到了深度改进,现在允许该方法传递的列与语句中的结果列按位置匹配,而不是仅匹配名称。这样做的好处包括,在将文本 SQL 语句链接到 ORM 或 Core 表模型时,无需进行常见列名称的标记或去重处理,这也意味着不需要担心标签名称与 ORM 列的匹配等问题。此外,ResultProxy
在某些情况下进一步增强,以更精确地将列和字符串键映射到行。
另见
ResultSet 列匹配增强;文本 SQL 的位置列设置 - 特性概述
TextClause.columns() 现在会按位置匹配列,而不是按名称匹配 - 向后兼容说明
参考:#3501 - [sql] [feature]
核心新增了一个新类型JSON
。这是 PostgreSQLJSON
类型以及新的JSON
类型的基础,因此可以使用 PG/MySQL 通用的 JSON 列。该类型具有基本的索引和路径搜索支持。
另见
核心添加了 JSON 支持
参考:#3619 - [sql] [feature]
添加了对“set-aggregate”函数的支持,格式为<function> WITHIN GROUP (ORDER BY <criteria>)
,使用FunctionElement.within_group()
方法。已添加了一系列常见的 set-aggregate 函数,返回类型派生自集合。这包括诸如percentile_cont
、dense_rank
等函数。
另见
新增函数特性,“WITHIN GROUP”、“array_agg” 和集合聚合函数
参考:#1370 - [sql] [feature] [postgresql]
添加了对 SQL 标准函数array_agg
的支持,它会自动返回正确类型的ARRAY
并支持索引/切片操作,以及array_agg()
,它返回一个带有额外比较功能的ARRAY
。由于目前只有 PostgreSQL 支持数组,因此只能在 PostgreSQL 上实际运行。还添加了一个新的构造aggregate_order_by
以支持 PG 的“ORDER BY”扩展。
另请参阅
新功能特性,“WITHIN GROUP”,array_agg 和 set 聚合函数
参考:#3132 - [sql] [feature]
在核心中添加了一个新类型ARRAY
。这是 PostgreSQLARRAY
类型的基础,现在已经成为核心的一部分,开始支持各种支持 SQL 标准数组的功能,包括一些函数以及对其他具有“数组”概念的数据库(如 DB2 或 Oracle)的原生数组的支持。此外,还添加了新的运算符any_()
和all_()
。这些不仅支持 PostgreSQL 上的数组构造,还支持可在 MySQL 上使用的子查询(但遗憾的是在 PostgreSQL 上不支持)。
另请参阅
核心添加了数组支持;新增 ANY 和 ALL 运算符
参考:#3516 - [sql] [change] [mysql]
Column
认为自己是“自增”列的系统已更改,因此不再为具有复合主键的Table
隐式启用 autoincrement。为了能够为复合主键成员列启用自增,同时保持 SQLAlchemy 长期以来启用单个整数主键的隐式自增的行为,已向Column.autoincrement
参数添加了第三状态"auto"
,现在这是默认值。
另请参阅
不再为复合主键列隐式启用 .autoincrement 指令
不再为具有 AUTO_INCREMENT 的复合主键生成隐式 KEY
参考:#3216 - [sql] [bug]
FromClause.count()
已弃用。此函数使用表中的任意列,不可靠;对于核心使用,应优先使用func.count()
。
参考:#3724 - [sql] [bug]
修复了一个断言,如果Index
与一个小写的TableClause
关联,而该Index
又与一个Column
关联,则会不太恰当地引发;为了将索引与Table
关联起来,应忽略该关联。
参考:#3616 - [sql] [bug]
type_coerce()
构造现在是一个完全成熟的核心表达式元素,在编译时进行延迟评估。先前,该函数只是一个转换函数,通过返回一个Label
或列定向表达式的复制BindParameter
对象,处理不同的表达式输入,特别是当 ORM 级别的表达式转换将列转换为绑定参数时(例如用于惰性加载),这会阻止该操作在逻辑上保持不变。
另请参阅
type_coerce 函数现在是持久的 SQL 元素
参考:#3531 - [sql] [bug]
现在,TypeDecorator
类型扩展器将与SchemaType
实现一起工作,通常是Enum
或Boolean
,以确保从实现类型传播到外部类型的每个表事件。这些事件用于确保约束或 PostgreSQL 类型(例如 ENUM)与父表一起正确创建(可能删除)。
亦参见
TypeDecorator 现在自动与 Enum、Boolean、“schema”类型配合工作
参考:#2919 - [sql] [bug]
union()
构造和相关构造的行为,例如Query.union()
现在处理嵌入的 SELECT 语句需要括号的情况,因为它们包含 LIMIT、OFFSET 和/或 ORDER BY。这些查询在 SQLite 上不适用,并且在该后端上像以前一样失败,但现在应该在所有其他后端上工作。
亦参见
UNION 或类似的 SELECT 使用 LIMIT/OFFSET/ORDER BY 现在会给嵌入式 SELECT 添加括号
参考:#2528
模式
- [schema] [enhancement]
现在,传递给Column
对象的默认生成函数现在通过“update_wrapper”或等效的函数运行,如果传递的是一个可调用但不是函数的对象,以便内省工具保留包装函数的名称和文档字符串。拉取请求由 hsum 提供。
postgresql
- [postgresql] [feature]
添加了对 PostgreSQL 的 INSERT…ON CONFLICT 的支持,使用了一个新的 PostgreSQL 特定的Insert
对象。拉取请求和 Robin Thomas 的大量工作。
亦参见
支持 INSERT…ON CONFLICT (DO UPDATE | DO NOTHING)
参考:#3529 - [postgresql] [feature]
如果在Index
上设置了postgresql_concurrently
标志,并且检测到正在使用的数据库为 PostgreSQL 版本 9.2 或更高,则 DROP INDEX 的 DDL 将发出 “CONCURRENTLY”。对于 CREATE INDEX,还添加了数据库版本检测,如果 PG 版本小于 8.2,则将省略该子句。感谢 Iuri de Silvio 的 Pull request。 - [postgresql] [功能]
添加了新参数PGInspector.get_view_names.include
,允许指定应返回哪种视图。目前包括 “plain” 和 “materialized” 视图。感谢 Sebastian Bank 的 Pull request。
参考:#3588 - [postgresql] [功能]
添加了postgresql_tablespace
作为Index
的参数,允许在 PostgreSQL 中为索引指定 TABLESPACE。与Table
上的同名参数相辅相成。感谢 Benjamin Bertrand 的 Pull request。
参考:#3720 - [postgresql] [功能]
添加了新参数GenerativeSelect.with_for_update.key_share
,它将在 PostgreSQL 后端上呈现FOR NO KEY UPDATE
版本的FOR UPDATE
和FOR KEY SHARE
,而不是FOR SHARE
。感谢 Sergey Skopin 的 Pull request。 - [postgresql] [功能] [oracle]
添加了新参数GenerativeSelect.with_for_update.skip_locked
,它将在 PostgreSQL 和 Oracle 后端上为FOR UPDATE
或FOR SHARE
锁呈现SKIP LOCKED
短语。感谢 Jack Zhou 的 Pull request。 - [postgresql] [功能]
添加了 PyGreSQL PostgreSQL 方言的新方言。感谢 Christoph Zwerschke 和 Kaolin Imago Fire 的努力。 - [postgresql] [功能]
添加了新的常量JSON.NULL
,表示应该使用 JSON NULL 值作为值,而不考虑其他设置。
另请参阅
新增 JSON.NULL 常量
参考:#3514 - [postgresql] [变更]
sqlalchemy.dialects.postgres
模块,长期弃用,已被移除;多年来一直发出警告,项目应该调用sqlalchemy.dialects.postgresql
。然而,形式为postgres://
的 Engine URLs 仍将继续运行。 - [postgresql] [错误]
增加了对将物化视图源反映到 PostgreSQL 版本的Inspector.get_view_definition()
方法的支持。
参考:#3587 - [postgresql] [bug]
使用引用ARRAY
对象,指向Enum
或ENUM
子类型时,现在在类型在“CREATE TABLE”或“DROP TABLE”中使用时,将会发出预期的“CREATE TYPE”和“DROP TYPE” DDL。
另请参阅
ARRAY with ENUM will now emit CREATE TYPE for the ENUM
参考:#2729 - [postgresql] [bug]
特殊数据类型(如ARRAY
、JSON
和HSTORE
)上的“可哈希”标志现在设置为 False,这允许在包含行内实体的 ORM 查询中获取这些类型。
另请参阅
关于“不可哈希”类型的更改,影响 ORM 行的去重
ARRAY and JSON types now correctly specify “unhashable”
参考:#3499 - [postgresql] [bug]
PostgreSQLARRAY
类型现在支持多维索引访问,例如表达式somecol[5][6]
,无需进行显式转换或类型强制,只要ARRAY.dimensions
参数设置为所需的维数即可。
另请参阅
Correct SQL Types are Established from Indexed Access of ARRAY, JSON, HSTORE
参考:#3487 - [postgresql] [bug]
当使用索引访问时,JSON
和JSONB
的返回类型已经修复,使其与 PostgreSQL 自身一样工作,并返回一个表达式,该表达式本身是JSON
或JSONB
类型。以前,访问器会返回NullType
,这会禁止后续使用类似 JSON 的操作符。
另请参见
已从数组、JSON、HSTORE 的索引访问中正确确定 SQL 类型
参考文献:#3503 - [postgresql] [bug]
JSON
、JSONB
和HSTORE
数据类型现在允许通过JSON.astext_type
和HSTORE.text_type
参数对从索引文本访问操作的返回类型进行完全控制,例如 JSON 类型为column[someindex].astext
或 HSTORE 类型为column[someindex]
。
另请参见
已从数组、JSON、HSTORE 的索引访问中正确确定 SQL 类型
参考文献:#3503 - [postgresql] [bug]
Comparator.astext
修饰符不再隐式调用ColumnElement.cast()
,因为 PG 的 JSON/JSONB 类型允许彼此之间的交叉转换。对 JSON 索引访问上使用ColumnElement.cast()
的代码,例如col[someindex].cast(Integer)
,需要显式调用Comparator.astext
。
另请参见
现在对 JSON cast()操作需要显式调用.astext
参考:#3503
mysql
- [mysql] [功能]
通过 AUTOCOMMIT 隔离级别设置,为 MySQL 驱动程序添加了对“autocommit”的支持。感谢 Roman Podoliaka 的拉取请求。
另请参阅
增加了对 AUTOCOMMIT“隔离级别”的支持
参考:#3332 - [mysql] [功能]
为 MySQL 5.7 添加了JSON
。JSON 类型在 MySQL 中提供了 JSON 值的持久性以及“getitem”和“getpath”的基本操作支持,利用JSON_EXTRACT
函数来引用 JSON 结构中的单个路径。
另请参阅
MySQL JSON 支持
参考:#3547 - [mysql] [更改]
当使用 InnoDB 在具有复合主键的表上生成 CREATE TABLE DDL 时,MySQL 方言不再生成额外的“KEY”指令;为了克服 InnoDB 在此处的限制,现在会在列的列表中首先放置 AUTO_INCREMENT 列来生成 PRIMARY KEY 约束。
另请参阅
不再为具有 AUTO_INCREMENT 的复合主键生成隐式 KEY
不再为复合主键列隐式启用.autoincrement 指令
参考:#3216
sqlite
- [sqlite] [功能]
SQLite 方言现在反映了外键约束中的 ON UPDATE 和 ON DELETE 短语。感谢 Michal Petrucha 的拉取请求。 - [sqlite] [功能]
SQLite 方言现在反映了主键约束的名称。感谢 Diana Clarke 的拉取请求。
另请参阅
反映主键约束名称
参考:#3629 - [sqlite] [更改]
为 SQLite 方言添加了对Inspector.get_schema_names()
方法的支持,以便与 SQLite 一起使用;感谢 Brian Van Klaveren 的拉取请求。还修复了在具有模式的索引创建以及模式绑定表中外键约束的反射支持。
另请参阅
远程模式的改进支持 - [sqlite] [错误]
当检测到 SQLite 版本 3.7.16 或更高版本时,对 SQLite 中右嵌套连接的解决方法被取消。
另请参阅
SQLite 版本 3.7.16 解决了右嵌套连接的问题
参考文献:#3634 - [sqlite] [错误]
当检测到 SQLite 版本为 3.10.0 或更高版本时,对于某些类型的查询,SQLite 意外地将列名作为tablename.columnname
传送的解决方法现已禁用。
另请参阅
针对 SQLite 版本 3.10.0 解除了点分列名的解决方法
参考文献:#3633
mssql
- [mssql] [特性]
UniqueConstraint
、PrimaryKeyConstraint
、Index
上现有的mssql_clustered
标志现在默认为None
,并且可以设置为 False,这将为主键特别渲染 NONCLUSTERED 关键字,允许使用不同的索引作为“clustered”。 拉取请求由 Saulius Žemaitaitis 提供。 - [mssql] [特性]
通过create_engine.isolation_level
和Connection.execution_options.isolation_level
参数,向 SQL Server 方言添加了基本的隔离级别支持。
另请参阅
为 SQL Server 添加了事务隔离级别支持
参考文献:#3534 - [mssql] [更改]
legacy_schema_aliasing
标志,作为版本 1.0.5 的一部分引入,以允许禁用 MSSQL 方言尝试为模式合格的表创建别名,现在默认为 False; 旧的行为现在已禁用,除非显式打开。
另请参阅
legacy_schema_aliasing 标志现在设置为 False
参考文献:#3434 - [mssql] [错误]
调整 mxODBC 方言以在适当情况下使用BinaryNull
符号与VARBINARY
数据类型配合使用。 拉取请求由 Sheila Allen 提供。 - [mssql] [错误]
修复了 SQL Server 方言反映字符串或其他可变长度列类型的问题,通过将 token"max"
分配给字符串的长度属性来分配无界长度。 虽然 SQL Server 方言显式支持使用"max"
token,但它不是基本字符串类型的正常约定的一部分,相反,长度应该保持为 None。 方言现在在类型反映时将长度分配为 None,以便该类型在其他上下文中正常工作。
另请参阅
字符串 / 可变长度类型不再在反射时明确表示“max”
参考资料:#3504
misc
- [feature] [ext]
添加了MutableSet
和MutableList
辅助类到 Mutation Tracking 扩展。拉取请求由 Jeong YunWon 提供。
参考资料:#3297 - [bug] [ext]
现在在混合属性或方法上指定的文档字符串将在类级别上受到尊重,使其能够与 Sphinx autodoc 等工具一起使用。这里的机制必然涉及一些对混合属性进行包装的表达式,这可能会导致它们在内省时显示出不同的外观。
另请参阅
混合属性和方法现在也传播文档字符串以及.info
参考资料:#3653 - [bug] [sybase]
不支持的 Sybase 方言现在在尝试编译包含“偏移”的查询时会引发NotImplementedError
;Sybase 没有直接的“偏移”功能。
参考资料:#2278
orm
- [orm] [feature] [ext]
添加了一个新的 ORM 扩展 Indexable,它允许构建指向“索引”结构特定元素的 Python 属性,如数组和 JSON 字段。拉取请求由 Jeong YunWon 提供。
另请参阅
新的可索引 ORM 扩展 - [orm] [feature]
添加了新的标志Session.bulk_insert_mappings.render_nulls
,允许 ORM 批量插入发生时渲染 NULL 值;这将绕过服务器端默认值,但允许所有语句使用相同的列集形成,从而使它们能够被批处理。拉取请求由 Tobias Sauerwein 提供。 - [orm] [feature]
添加了新的事件AttributeEvents.init_scalar()
,以及一个新的示例套件,说明了其用法。此事件可用于在对象持久化之前为 Python 端属性提供由 Core 生成的默认值。
另请参阅
新的 init_scalar() 事件拦截 ORM 级别的默认值
参考资料:#1311 - [orm] [feature]
在AutomapBase.prepare()
方法中新增了AutomapBase.prepare.schema
参数,指示如果不是默认模式,则应该从哪个模式表反映。拉取请求由 Josh Marlow 提供。 - [orm] [功能]
在可用的映射器选项中新增了新参数mapper.passive_deletes
。这允许对基表进行联合表继承映射的 DELETE 操作,同时允许 ON DELETE CASCADE 处理从子类表删除行。
请参阅
联合继承映射的被动删除功能
参考:#2349 - [orm] [功能]
对核心 SQL 构造调用 str() 方法变得更“友好”了,当构造包含非标准 SQL 元素(如 RETURNING、数组索引操作或方言特定或自定义数据类型)时。在这些情况下,将返回一个字符串,渲染构造的近似值(通常是其 PostgreSQL 风格版本),而不是引发错误。
请参阅
核心 SQL 构造的“友好”字符串化,无需方言
参考:#3631 - [orm] [功能]
对于Query
的str()
调用现在将考虑到Session
绑定的Engine
,在生成 SQL 的字符串形式时,以便显示将要发送到数据库的实际 SQL(如果可能的话)。以前,如果存在,只会使用与映射相关联的MetaData
相关的引擎。如果无法在Session
或映射相关联的MetaData
上找到绑定,则使用“默认”方言来渲染 SQL,就像以前一样。
请参阅
查询的字符串化将参考 Session 来获取正确的方言
参考:#3081 - [orm] [功能]
SessionEvents
套件现在包括事件,允许明确跟踪所有对象的生命周期状态转换,即Session
本身,例如 pending、transient、persistent、detached。每个事件中的对象状态也已定义。
另请参阅
新的会话生命周期事件
参考:#2677 - [orm] [特性]
添加了一个新的会话生命周期状态 deleted。这个新状态表示一个从 persistent 状态中删除的对象,并且一旦事务提交,将转移到 detached 状态。这解决了长期存在的问题,即已删除的对象存在于持久状态和已分离状态之间的灰色地带。InstanceState.persistent
访问器将不再报告已删除对象为持久;相反,对于这些对象,InstanceState.deleted
访问器将为 True,直到它们变为分离状态。
另请参阅
新的会话生命周期事件
参考:#2677 - [orm] [特性]
添加了对将映射类或映射实例传递到将其解释为 SQL 绑定参数的上下文中的常见错误情况的新检查;为此引发了一个新的异常。
另请参阅
为将映射类、实例作为 SQL 字面量传递而添加的特定检查
参考:#3321 - [orm] [特性]
添加了新的关系加载策略raiseload()
(也可通过lazy='raise'
访问)。该策略几乎行为类似于noload()
,但不返回None
,而是引发一个 InvalidRequestError。此拉取请求由 Adrian Moennich 提供。
另请参阅
新的“raise” / “raise_on_sql” 加载策略
参考:#3512 - [orm] [变更]
Mapper.order_by
参数已被弃用。这是一个旧参数,与 SQLAlchemy 的工作方式不再相关,一旦引入了查询对象。通过将其弃用,我们确定我们不支持不起作用的用例,并鼓励应用程序停止使用此参数。
另请参阅
Mapper.order_by 已弃用
参考:#3394 - [orm] [change]
Session.weak_identity_map
参数已弃用。请参阅 Session Referencing Behavior 中的新配方,以了解维护强身份映射行为的基于事件的方法。
另请参阅
新的 Session 生命周期事件
参考:#2677 - [orm] [bug]
修复了一个问题,即将对象从一个父对象更改为另一个父对象的多对一更改在与外键属性的未刷新修改结合时可能工作不一致。现在,属性移动考虑了外键的数据库提交值,以定位正在移动的对象的“先前”父对象。这允许事件正确触发,包括反向引用事件。以前,这些事件并不总是触发。可能依赖于先前错误行为的应用程序可能会受到影响。
另请参阅
修复了涉及用户发起的外键操作的多对一对象移动的问题
参考:#3708 - [orm] [bug]
修复了一个 bug,即当对象通过session.merge(obj, load=False)
合并到会话中时,延迟列会在下一个对象级别的取消过期时意外地设置为数据库加载。
参考:#3488 - [orm] [bug] [mysql]
进一步延续了常见的 MySQL 异常情况,即在#2696中首次涵盖的保存点被取消的情况,当 SAVEPOINT 在回滚之前消失时,Session
的失败模式已经改进,以允许Session
在该保存点之外继续运行。假定保存点操作失败并被取消。
另请参阅
数据库取消 SAVEPOINT 时改进的 Session 状态
参考:#3680 - [orm] [bug]
修复了一个 bug,即在回滚的新插入实例仍可能在下一个事务中引起持久性冲突,因为实例未被检查为已过期。此修复将解决一大类错误地导致“具有标识 X 的新实例与持久实例 Y 冲突”的错误的情况。
另请参阅
修复了错误的“新实例 X 与持久实例 Y 冲突”的刷新错误
参考:#3677 - [orm] [bug]
对Query.correlate()
的工作方式进行了改进,以确保当使用代表几个表的直接连接的“多态”实体时,语句将确保连接中的所有表都是相关的。
另请参阅
对具有多态实体的 Query.correlate 方法进行改进
参考:#3662 - [orm] [bug]
修复了一个 bug,该 bug 会导致一个被急加载的多对一属性无法加载,如果连接式急加载来自一个同一实体多次出现的行,有些要求属性被急加载,而其他则不是。这里的逻辑被修改为即使不同的加载路径已经处理了父实体,也要考虑属性。
另请参阅
在一行中多次出现相同实体的连接式预加载
参考:#3431 - [orm] [bug]
对于Query.distinct()
与Query.order_by()
结合使用时,对结果 SQL 添加列的逻辑进行了改进,以确保已经存在的列不会被第二次添加,即使它们使用不同的名称标记。尽管有这个改变,SQL 中添加的额外列从未在最终结果中返回,因此这个改变只影响语句的字符串形式以及在核心执行上下文中使用时的行为。此外,当使用 DISTINCT ON 格式时,不再添加列,前提是查询不是由于连接式预加载而包装在子查询中。
另请参阅
使用 DISTINCT + ORDER BY 时不再冗余添加列
参考:#3641 - [orm] [bug]
修复了一个问题,即两个同名关系引用一个基类和一个具体继承子类时,如果使用“backref”设置这些关系会引发错误,而使用 relationship()设置相同配置而使用冲突名称则会成功,这在具体映射的情况下是允许的。
另请参阅
应用于具体继承子类时,同名的 backrefs 不会引发错误
参考:#3630 - [orm] [bug]
Session.merge()
方法现在在发出 INSERT 之前通过主键跟踪挂起对象,并在遇到重复主键的不同对象时将它们合并在一起,这在最好的情况下基本上是半确定性的。这种行为与持久对象已经发生的情况相匹配。
参见
Session.merge 解决挂起冲突与持久性相同
参考:#3601 - [orm] [bug]
修复了在某些不适当情况下将“单表继承”条件添加到查询末尾的错误,例如在从单继承子类的 exists()查询时。
参见
进一步修复单表继承查询
参考:#3582 - [orm] [bug]
添加了一个新的类型级别修饰符TypeEngine.evaluates_none()
,指示 ORM 应将一组正面的 None 持久化为值 NULL,而不是在 INSERT 语句中省略列。这个功能既作为#3514的实现的一部分,也作为任何类型可用的独立功能。
参见
允许显式持久化 NULL 覆盖默认值的新选项
参考:#3250 - [orm] [bug]
Session.bulk_save_objects()
内部调用的“簿记”功能以及相关的批量方法已经减少到目前未使用的程度,例如在 INSERT 或 UPDATE 语句之后获取列默认值的检查。
参考:#3526 - [orm] [bug] [postgresql]
针对 PostgreSQLJSON
类型与None
值的附加修复已经完成。当JSON.none_as_null
标志保持默认值False
时,ORM 现在将正确地将 JSON “‘null’” 字符串插入到列中,无论是当 ORM 对象上的值设置为None
时,还是当值None
与Session.bulk_insert_mappings()
一起使用时,包括列上有默认值或服务器默认值的情况。
参见
JSON “null” 在 ORM 操作中如预期般插入,当不存在时被省略
新增选项允许显式持久化 NULL 覆盖默认值
参考:#3514
引擎
- [引擎] [功能]
添加了连接池事件ConnectionEvents.close()
,ConnectionEvents.detach()
,ConnectionEvents.close_detached()
。 - [引擎] [功能]
现在,用于日志记录、异常和repr()
目的的所有绑定参数集和结果行的字符串格式化都会截断每个集合中非常大的标量值,包括“N 个字符被截断”说明,类似于对于大型多参数集合本身被截断的显示。
另请参阅
日志和异常显示中现在截断大型参数和行值
参考:#2837 - [引擎] [功能]
为Table
对象添加了多租户模式翻译。这支持应用程序在许多模式中使用相同的Table
对象的用例,例如每个用户一个模式。添加了一个新的执行选项Connection.execution_options.schema_translate_map
。
另请参阅
Table 对象的多租户模式翻译
参考:#2685 - [引擎] [功能]
在引擎中添加了一个新的入口系统,允许在 URL 的查询字符串中声明“插件”。可以编写自定义插件,这些插件将有机会在最初修改和/或使用引擎的 URL 和关键字参数,然后在引擎创建时将获得引擎本身以允许额外的修改或事件注册。插件被编写为CreateEnginePlugin
的子类;详细信息请参见该类。
参考:#3536
SQL
- [SQL] [功能]
通过新的FromClause.tablesample()
方法和独立函数添加了 TABLESAMPLE 支持。感谢 Ilja Everilä 的拉取请求。
另请参阅
支持 TABLESAMPLE
参考:#3718 - [SQL] [功能]
添加了对窗口函数中范围的支持,使用over.range_
和over.rows
参数。
另请参阅
窗口函数中的 RANGE 和 ROWS 规范支持
参考:#3049 - [sql] [feature]
实现了 SQLite 和 PostgreSQL 的 CHECK 约束的反射。这可以通过新的检查器方法Inspector.get_check_constraints()
以及在反射Table
对象时以CheckConstraint
对象的形式存在于约束集合中。感谢 Alex Grönholm 的拉取请求。 - [sql] [feature]
新的ColumnOperators.is_distinct_from()
和ColumnOperators.isnot_distinct_from()
操作符;感谢 Sebastian Bank 的拉取请求。
另请参阅
IS DISTINCT FROM 和 IS NOT DISTINCT FROM 的支持 - [sql] [feature]
在DDLCompiler.visit_create_table()
中添加了一个名为DDLCompiler.create_table_suffix()
的钩子,允许自定义方言在“CREATE TABLE”子句之后添加关键字。感谢 Mark Sandan 的拉取请求。 - [sql] [feature]
负整数索���现在可以被ResultProxy
返回的行容纳。感谢 Emanuele Gaifas 的拉取请求。
另请参阅
Core 结果行中容纳负整数索引 - [sql] [feature]
添加了Select.lateral()
和相关构造,以允许使用 SQL 标准的 LATERAL 关键字,目前仅受 PostgreSQL 支持。
另请参阅
SQL LATERAL 关键字的支持
参考:#2857 - [sql] [feature]
增加了对“FULL OUTER JOIN”在 Core 和 ORM 中的渲染支持。感谢 Stefan Urbanek 的拉取请求。
另请参阅
Core 和 ORM 对 FULL OUTER JOIN 的支持
参考:#1957 - [sql] [feature]
CTE 功能已扩展到支持所有 DML,允许 INSERT、UPDATE 和 DELETE 语句指定自己的 WITH 子句,以及当它们包含 RETURNING 子句时,这些语句本身也可以是 CTE 表达式。
另请参阅
CTE 支持 INSERT、UPDATE、DELETE
参考:#2551 - [sql] [feature]
增加了对 PEP-435 风格的枚举类的支持,即 Python 3 的enum.Enum
类,但也包括兼容的枚举库,到Enum
数据类型。Enum
数据类型现在还会对传入的值进行 Python 验证,并添加一个选项来避免创建 CHECK 约束Enum.create_constraint
。感谢 Alex Grönholm 的拉取请求。
另请参阅
支持 Python 的原生枚举类型和兼容形式
枚举类型现在在 Python 中对值进行验证(migration_11.html#change-3095)
参考:#3095,#3292 - [sql] [feature]
对最近添加的TextClause.columns()
方法进行了深度改进,以及它与结果行处理的交互,现在允许传递给该方法的列与语句中的结果列进行位置匹配,而不仅仅是按名称匹配。这样做的好处包括,当将文本 SQL 语句链接到 ORM 或 Core 表模型时,不需要进行常见列名的标记或去重系统,这也意味着不需要担心标签名称如何与 ORM 列匹配等等。此外,在某些情况下,ResultProxy
已经进一步增强,以更精确地将列和字符串键映射到行。
另请参阅
ResultSet 列匹配增强;文本 SQL 的位置列设置 - 功能概述
当按位置传递时,TextClause.columns()将按位置匹配列,而不是按名称匹配 - 向后兼容性说明
参考:#3501 - [sql] [feature]
添加了核心的新类型JSON
。这是 PostgreSQLJSON
类型以及新的JSON
类型的基础,因此可以使用一个与 PG/MySQL 无关的 JSON 列。该类型具有基本的索引和路径搜索支持。
另请参阅
JSON support added to Core
参考:#3619 - [sql] [feature]
添加了对形式为<function> WITHIN GROUP (ORDER BY <criteria>)
的“set-aggregate”函数的支持,使用方法FunctionElement.within_group()
。已添加一系列常见的 set-aggregate 函数,其返回类型源自该集合。这包括函数如percentile_cont
、dense_rank
等。
另请参阅
New Function features, “WITHIN GROUP”, array_agg and set aggregate functions
参考:#1370 - [sql] [feature] [postgresql]
添加了对 SQL 标准函数array_agg
的支持,它会自动返回正确类型的ARRAY
并支持索引/切片操作,还有array_agg()
,它返回一个带有额外比较功能的ARRAY
。由于目前只有 PostgreSQL 支持数组,因此只在 PostgreSQL 上有效。还添加了一个新的构造函数aggregate_order_by
以支持 PG 的“ORDER BY”扩展。
另请参阅
New Function features, “WITHIN GROUP”, array_agg and set aggregate functions
参考:#3132 - [sql] [feature]
在核心中添加了一个新类型ARRAY
。这是 PostgreSQLARRAY
类型的基础,并且现在已经成为核心的一部分,以开始支持各种支持 SQL 标准数组的功能,包括一些函数和最终支持其他具有“数组”概念的数据库上的本机数组,例如 DB2 或 Oracle。此外,还添加了新的运算符any_()
和all_()
。这些不仅支持 PostgreSQL 上的数组构造,还支持可在 MySQL 上使用的子查询(但遗憾的是在 PostgreSQL 上不支持)。
另请参阅
Core 添加了数组支持;新增 ANY 和 ALL 运算符
参考:#3516 - [sql] [change] [mysql]
Column
认为自己是“自动增量”列的系统已更改,因此不再为具有复合主键的Table
隐式启用 autoincrement。为了能够为复合主键成员列启用 autoincrement,同时保持 SQLAlchemy 长期以来为单个整数主键启用隐式 autoincrement 的行为,已向Column.autoincrement
参数添加了第三状态"auto"
,这现在是默认值。
另请参阅
不再为复合主键列隐式启用.autoincrement 指令
不再为具有 AUTO_INCREMENT 的复合主键生成隐式 KEY
参考:#3216 - [sql] [bug]
FromClause.count()
已被弃用。此函数使用表中的任意列,并不可靠;对于核心使用,应优先使用func.count()
。
参考:#3724 - [sql] [bug]
修复了一个断言,如果一个Index
与一个小写的TableClause
关联,那么它会相当不恰当地引发;为了将索引与Table
关联,应忽略此关联。
参考:#3616 - [sql] [bug]
type_coerce()
构造现在是一个完全成熟的 Core 表达式元素,在编译时进行延迟评估。之前,该函数只是一个转换函数,通过返回列导向表达式的Label
或给定BindParameter
对象的副本来处理不同的表达式输入,特别是在 ORM 级别的表达式转换将列转换为绑定参数(例如用于惰性加载)时,该操作不能被逻辑地维护。
请参见
type_coerce 函数现在是一个持久的 SQL 元素
参考:#3531 - [sql] [bug]
TypeDecorator
类型扩展器现在将与SchemaType
实现一起工作,通常是Enum
或Boolean
,以确保表格事件从实现类型传播到外部类型。这些事件用于确保正确创建(以及可能删除)约束或 PostgreSQL 类型(例如 ENUM),以及与父表一起。
请参见
TypeDecorator 现在可以自动与 Enum、Boolean 和“schema” 类型配合使用
参考:#2919 - [sql] [bug]
union()
构造和相关构造的行为,如Query.union()
现在处理嵌入的 SELECT 语句需要括号的情况,因为它们包括 LIMIT、OFFSET 和/或 ORDER BY。这些查询在 SQLite 上不起作用,并且在该后端上会像以前一样失败,但现在应该在所有其他后端上正常工作。
另请参阅
使用带有 LIMIT/OFFSET/ORDER BY 的 UNION 或类似的 SELECT 现在将嵌入的 SELECT 括在括号中
参考:#2528
schema
- [schema] [enhancement]
传递给Column
对象的默认生成函数现在通过“update_wrapper”运行,或者如果传递了可调用的非函数,则通过等效函数运行,以便内省工具保留包装函数的名称和文档字符串。感谢 hsum 提交的拉取请求。
postgresql
- [postgresql] [feature]
添加了对 PostgreSQL 的 INSERT…ON CONFLICT 的支持,使用了一个新的 PostgreSQL 特定的Insert
对象。感谢 Robin Thomas 提交的拉取请求和大量工作。
另请参阅
支持 INSERT…ON CONFLICT (DO UPDATE | DO NOTHING)
参考:#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
,该参数将在 PostgreSQL 后端上呈现FOR NO KEY UPDATE
版本的FOR UPDATE
和FOR KEY SHARE
,而不是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 值。
参见
新增 JSON.NULL 常量
参考:#3514 - [postgresql] [change]
已移除sqlalchemy.dialects.postgres
模块,该模块长期已过时;这已经发出了多年的警告,项目应该调用sqlalchemy.dialects.postgresql
。形式为postgres://
的引擎 URL 仍将继续使用。 - [postgresql] [bug]
新增了对在 PostgreSQL 版本的Inspector.get_view_definition()
方法中反映材料化视图来源的支持。
参考:#3587 - [postgresql] [bug]
当一个ARRAY
对象引用一个Enum
或ENUM
子类型时,现在将会在该类型在“CREATE TABLE”或“DROP TABLE”中使用时发出预期的“CREATE TYPE”和“DROP TYPE” DDL。
参见
ARRAY with ENUM will now emit CREATE TYPE for the ENUM
参考:#2729 - [postgresql] [bug]
特殊数据类型(如ARRAY
、JSON
和HSTORE
)上的“可散列”标志现在设置为 False,这允许在包含行内实体的 ORM 查询中获取这些类型。
另请参阅
关于“不可散列”类型的更改,影响 ORM 行的去重
数组和 JSON 类型现在正确指定为“不可散列”
参考:#3499 - [postgresql] [bug]
PostgreSQLARRAY
类型现在支持多维索引访问,例如somecol[5][6]
这样的表达式,无需显式转换或类型强制转换,只要ARRAY.dimensions
参数设置为所需的维数即可。
另请参阅
从数组、JSON、HSTORE 的索引访问中建立正确的 SQL 类型
参考:#3487 - [postgresql] [bug]
当使用索引访问时,JSON
和JSONB
的返回类型已经修复,使其像 PostgreSQL 本身一样工作,并返回一个表达式,该表达式本身是类型JSON
或JSONB
。以前,访问器会返回NullType
,这将禁止使用后续类似 JSON 的运算符。
另请参阅
从数组、JSON、HSTORE 的索引访问中建立正确的 SQL 类型
参考:#3503 - [postgresql] [bug]
JSON
、JSONB
和HSTORE
数据类型现在允许完全控制从索引文本访问操作的返回类型,对于 JSON 类型是column[someindex].astext
,对于 HSTORE 类型是column[someindex]
,通过JSON.astext_type
和HSTORE.text_type
参数。
另请参阅
正确的 SQL 类型是通过对数组、JSON、HSTORE 进行索引访问来建立的
参考:#3503 - [postgresql] [bug]
Comparator.astext
修改器不再隐式调用ColumnElement.cast()
,因为 PG 的 JSON/JSONB 类型允许彼此之间的交叉转换。在 JSON 索引访问上使用ColumnElement.cast()
的代码,例如col[someindex].cast(Integer)
,现在需要显式调用Comparator.astext
。
另请参阅
JSON cast() 操作现在需要显式调用 .astext
参考:#3503
mysql
- [mysql] [feature]
增加了对 MySQL 驱���程序的“autocommit”支持,通过 AUTOCOMMIT 隔离级别设置。感谢 Roman Podoliaka 的拉取请求。
另请参阅
增加了对 AUTOCOMMIT “隔离级别”的支持
参考:#3332 - [mysql] [feature]
为 MySQL 5.7 添加了JSON
。JSON 类型在 MySQL 中提供了 JSON 值的持久性,以及基本的“getitem”和“getpath”操作符支持,利用JSON_EXTRACT
函数来引用 JSON 结构中的单个路径。
另请参阅
MySQL JSON 支持
参考:#3547 - [mysql] [change]
当使用 InnoDB 在列不是第一列上具有 AUTO_INCREMENT 的复合主键的表生成 CREATE TABLE DDL 时,MySQL 方言不再生成额外的“KEY”指令;为了克服 InnoDB 在这里的限制,现在主键约束将在列列表中的 AUTO_INCREMENT 列放在第一位。
另请参阅
不再为具有 AUTO_INCREMENT 的复合主键生成隐式 KEY
不再为复合主键列隐式启用.autoincrement 指令
参考:#3216
sqlite
- [sqlite] [功能]
SQLite 方言现在反映了外键约束中的 ON UPDATE 和 ON DELETE 短语。感谢 Michal Petrucha 的拉取请求。 - [sqlite] [功能]
SQLite 方言现在反映了主键约束的名称。感谢 Diana Clarke 的拉取请求。
另请参阅
主键约束名称的反射
参考:#3629 - [sqlite] [更改]
为 SQLite 方言添加了对Inspector.get_schema_names()
方法的支持;感谢 Brian Van Klaveren 的拉取请求。还修复了在具有模式的索引创建以及模式绑定表中外键约束的反射支持。
另请参阅
远程模式的改进支持 - [sqlite] [错误]
当检测到 SQLite 版本为 3.7.16 或更高版本时,针对 SQLite 右嵌套连接的解决方法,其中它们被重写为子查询以解决 SQLite 不支持此语法的问题,将被取消。
另请参阅
SQLite 版本 3.7.16 取消右嵌套连接解决方法
参考:#3634 - [sqlite] [错误]
当检测到 SQLite 版本为 3.10.0 或更高版本时,针对 SQLite 某些查询意外将列名传递为tablename.columnname
的解决方法现已禁用。
另请参阅
取消 SQLite 版本 3.10.0 的点列名解决方法
参考:#3633
mssql
- [mssql] [功能]
可用于UniqueConstraint
、PrimaryKeyConstraint
、Index
的mssql_clustered
标志现在默认为None
,并且可以设置为 False,这将特别为主键渲染 NONCLUSTERED 关键字,允许使用不同的索引作为“聚集”。感谢 Saulius Žemaitaitis 的拉取请求。 - [mssql] [feature]
通过create_engine.isolation_level
和Connection.execution_options.isolation_level
参数,为 SQL Server 方言添加了基本的隔离级别支持。
另请参阅
为 SQL Server 添加了事务隔离级别支持
参考:#3534 - [mssql] [change]
legacy_schema_aliasing
标志在 1.0.5 版本中引入,作为 #3424 的一部分,允许禁用 MSSQL 方言尝试为模式合格的表创建别名。现在默认为 False;除非显式启用,否则将禁用旧行为。
另请参阅
legacy_schema_aliasing 标志现在设置为 False
参考:#3434 - [mssql] [bug]
对 mxODBC 方言进行了调整,以便在适当情况下与VARBINARY
数据类型一起使用BinaryNull
符号。感谢 Sheila Allen 的拉取请求。 - [mssql] [bug]
修复了 SQL Server 方言将字符串或其他可变长度列类型的无限长度反映为将标记"max"
分配给字符串的长度属性的问题。虽然 SQL Server 方言明确支持使用"max"
标记,但它并不是基本字符串类型的正常约定的一部分,相反,长度应该只留为空。方言现在在反射类型时将长度分配为 None,以便类型在其他情境中表现正常。
另请参阅
在反射时,字符串/可变长度类型不再明确表示“max”。
参考:#3504
杂项
- [feature] [ext]
将MutableSet
和MutableList
辅助类添加到 Mutation Tracking 扩展中。感谢 Jeong YunWon 的拉取请求。
参考:#3297 - [bug] [ext]
对混合属性或方法指定的文档字符串现在在类级别上得到了尊重,使其能够与 Sphinx autodoc 等工具一起使用。这里的机制必然涉及对混合属性进行一些表达式包装,这可能会导致它们在使用内省时显示出不同的外观。
另请参阅:
混合属性和方法现在传播文档字符串以及 .info
参考:#3653 - [bug] [sybase]
不支持的 Sybase 方言现在在尝试编译包含“offset”的查询时引发NotImplementedError
;Sybase 没有直接的“offset”功能。
参考:#2278