1.3 更新日志
1.3.25
无发布日期
orm
模式
- [模式] [错误]
当未至少传递Table.name
和Table.metadata
参数位置时,Table
对象现在会引发一个信息性错误消息。 以前,如果这些作为关键字参数传递,对象将无声地无法正确初始化。
参考:#6135
postgresql
- [postgresql] [错误] [回归]
修复了由 #6023 引起的回归,当使用 psycopg2 时,应用于ARRAY
中的元素的 PostgreSQL 强制转换运算符在数据类型也嵌入在Variant
适配器的实例中时,将无法使用正确的类型。
此外,修复了在使用Variant(ARRAY(some_schema_type))
时发出正确的 CREATE TYPE 的支持。
参考:#6182
mysql
- [mysql] [错误] [mariadb]
修复以适应 MariaDB 10.6 系列的变化,包括 mariadb-connector Python 驱动程序(仅支持 SQLAlchemy 1.4)和 mysqlclient DBAPI 自动使用的本机 10.6 客户端库中的不兼容更改(适用于 1.3 和 1.4)。 当编码状态为“utf8”时,这些客户端库现在报告“utf8mb3”编码符号,导致 MySQL 方言中的查找和编码错误,该方言不期望此符号。 更新了 MySQL 基础库以适应报告此 utf8mb3 符号以及测试套件。 感谢 Georg Richter 的支持。
参考:#7115, #7136
sqlite
- [sqlite] [错误]
添加有关通过 url 传递给 pysqlcipher 的与加密相关的 pragma 的说明。
参考:#6589
1.3.24
发布日期:2021 年 3 月 30 日
orm
- [orm] [错误]
移除了一个非常古老的警告,指出 passive_deletes 不适用于多对一关系。虽然在许多情况下,将此参数放在多对一关系上可能不是预期的操作,但在某些情况下,可能希望在此类关系之后禁止删除级联。
参考:#5983 - [ORM] [错误]
修复了一个问题,即如果其中一个表具有不相关的、无法解析的外键约束,那么连接两个表的过程可能会失败,这将在连接过程中引发NoReferenceError
,尽管可以绕过此异常以允许连接完成。在处理中测试异常重要性的逻辑会对构造做出可能失败的假设。
参考:#5952 - [ORM] [错误]
修复了一个问题,即当父对象已加载并且随后被后续查询覆盖时,MutableComposite
构造可能处于无效状态,因为复合属性的刷新处理程序会用新对象替换对象,而这些对象未受可变扩展处理。
参考:#6001
引擎
- [引擎] [错误]
修复了“schema_translate_map”功能在直接执行DefaultGenerator
对象(如序列)的情况未被考虑的错误,包括在禁用 implicit_returning 时“预执行”它们以生成主键值的情况。
参考:#5929
模式
- [模式] [错误]
修复了首次引入的错误,可能是由#2892、#2919和#3832的某种组合引起的,其中TypeDecorator
的附加事件会对“impl”类重复,如果“impl”也是SchemaType
。实际情况是,任何TypeDecorator
与Enum
或Boolean
相对时,当设置create_constraint=True
标志时,将获得重复的CheckConstraint
。
参考:#6152 - [模式] [错误] [sqlite]
修复了由Boolean
或Enum
生成的 CHECK 约束在第一次编译后无法正确呈现命名约定的问题,这是由于约束名称中的状态意外更改导致的。此问题首次出现在 0.9 版本中,修复了问题#3067,修复了当时采取的方法,似乎比实际需要的更复杂。
参考:#6007 - [模式] [错误]
修复/实现了支持使用列名/键等作为约定的主键约束命名约定的功能。特别是,这包括Table
自动关联的PrimaryKeyConstraint
对象将在向表添加新的主键Column
对象后更新其名称,然后更新约束。现在已经考虑了与此约束构造过程相关的内部故障模式,包括没有列存在、没有名称存在或存在空名称。
参考:#5919 - [模式] [错误]
调整了在删除多个表时发出 DROP 语句的逻辑,使得所有Sequence
对象在所有表之后被删除,即使给定的Sequence
只与一个Table
对象相关,而不直接与整体的MetaData
对象相关。这种用例支持同一个Sequence
同时关联多个Table
。
参考:#6071
postgresql
- [postgresql] [bug]
修复了在某些条件下使用aggregate_order_by
会返回 ARRAY(NullType) 的问题,干扰了结果对象正确返回数据的能力。
参考:#5989 - [postgresql] [bug] [reflection]
修复了在 PostgreSQL 反射中出现的问题,其中表达“NOT NULL”的列将取代相应域的可空性。
参考:#6161 - [postgresql] [bug] [types]
调整了 psycopg2 方言以为包含 ARRAY 元素的绑定参数发出显式的 PostgreSQL 风格转换。这允许各种数据类型在数组中正确运行。asyncpg 方言已在最终语句中生成了这些内部转换。这还包括对数组切片更新的支持以及 PostgreSQL 特定的ARRAY.contains()
方法。
参考:#6023
mssql
- [mssql] [bug] [reflection]
修复了关于旧版 SQL Server 2005 版本的 SQL Server 反射问题,调用 sp_columns 时如果没有加上 EXEC 关键字,将无法正确进行。这种方法在当前的 1.4 系列中不再使用。
参考:#5921
1.3.23
发布日期:2021 年 2 月 1 日
sql
- [sql] [bug]
修复了在TypeDecorator
类型上使用TypeEngine.with_variant()
方法时的错误,由于TypeDecorator
中的规则尝试检查TypeDecorator
实例链,未考虑到正在使用的特定方言映射。
参考:#5816
postgresql
- [postgresql] [bug]
仅适用于 SQLAlchemy 1.3,setup.py 将 pg8000 固定在低于 1.16.6 版本。版本 1.16.6 及以上受 SQLAlchemy 1.4 支持。感谢 Giuseppe Lumia 的拉取请求。
参考:#5645 - [postgresql] [bug]
修复了在与使用了临时列表达式的 PostgreSQLExcludeConstraint
一起使用Table.to_metadata()
(在 1.3 中称为Table.tometadata()
)时未能正确复制的问题。
参考:#5850
mysql
- [mysql] [usecase]
现在在 MySQL >= (8, 0, 17)和 MariaDb >= (10, 4, 5)中支持转换为FLOAT
。
参考:#5808 - [mysql] [bug] [reflection]
修复了 MySQL 服务器默认反射对带有否定符号的数值失败的错误。
参考:#5860 - [mysql] [bug]
修复了 MySQL 方言中长期存在的 bug,其中 255 的最大标识符长度对于所有类型的约束名称都太长,不仅仅是索引,所有这些都有 64 的大小限制。由于元数据命名约定可能在此区域创建过长的名称,因此将限制应用于 DDL 编译器内的标识符生成器。
参考:#5898 - [mysql] [bug]
修复了由于 PyMySQL 1.0 发布而产生的弃用警告,包括“db”和“passwd”参数现已替换为“database”和“password”的弃用警告。
参考:#5821 - [mysql] [bug]
修复了 SQLAlchemy 1.3.20 中由于#5462修复引起的回归问题,该修复为 MySQL 功能表达式在索引中添加了双括号,这是后端所需的,这无意中扩展到包括任意text()
表达式以及 Alembic 的内部文本组件,这些对于 Alembic 来说是必需的,用于不暗示双括号的任意索引表达式。检查已经缩小,只包括直接的二元/一元/功能表达式。
参考:#5800
oracle
- [oracle] [bug]
修复了 SQLAlchemy 1.3.11 中由#4894引入的 Oracle 方言中的回归问题,其中在 UPDATE 的 RETURNING 中使用 SQL 表达式会导致编译失败,因为在任意 SQL 表达式不是列时会检查“server_default”。
参考:#5813 - [oracle] [bug]
修复了 Oracle 方言中的一个 bug,即通过Insert.returning()
检索 CLOB/BLOB 列时会失败,因为在返回时需要读取 LOB 值;此外,修复了在 Python 2 下通过 RETURNING 检索 Unicode 值的支持。
参考:#5812
杂项
- [bug] [ext]
修复了一个问题,即在尝试为可选择的.c
集合生成“key”时有时会调用字符串化,如果列是使用sqlalchemy.ext.compiler
扩展创建的未标记的自定义 SQL 构造,并且没有提供默认编译形式,则会失败;虽然这似乎是一个不寻常的情况,但在一些 ORM 场景中可能会调用它,例如在与连接的急加载一起在“order by”中使用表达式时。问题在于缺乏默认编译器函数会引发CompileError
而不是UnsupportedCompilationError
。
参考:#5836
1.3.22
发布日期:2020 年 12 月 18 日
oracle
- [oracle] [bug]
修复了由于#5755引起的回归,该问题实现了 Oracle 的隔离级别支持。据报道,许多 Oracle 帐户实际上没有权限查询v$transaction
视图,因此当在数据库连接时失败时,此功能已被更改为优雅地回退,其中方言将假定“READ COMMITTED”是默认的隔离级别,就像在 SQLAlchemy 1.3.21 之前的情况一样。然而,现在必须明确使用Connection.get_isolation_level()
方法引发异常,因为具有此限制的 Oracle 数据库明确禁止用户读取当前隔离级别。
参考:#5784
1.3.21
发布日期:2020 年 12 月 17 日
orm
- [orm] [bug]
为传递给relationship.secondary
的映射类或字符串映射类名称的情况添加了全面检查和信息丰富的错误消息。这是一个极为常见的错误,值得提供清晰的消息。
此外,添加了一个新规则到类注册解析中,关于relationship.secondary
参数,如果映射类及其表的字符串名称相同,则在解析此参数时将优先考虑Table
。在所有其他情况下,如果类和表共享相同的名称,则仍然优先考虑类。
参考:#5774 - [orm] [bug]
修复了在Query.update()
中的错误,当_ormsession.Session
中的对象已过期时,当它们被“evaluate”同步策略刷新时,会不必要地单独进行 SELECT 查询。
参考:#5664 - [orm] [bug]
修复了涉及 ORM 事件的restore_load_context
选项的错误,例如InstanceEvents.load()
,使得标志不会传递到在首次建立事件处理程序之后映射的子类。
参考:#5737
sql
- [sql] [bug]
如果多次调用Insert.returning()
或类似的returning()
方法,则会发出警告,因为目前不支持累加操作。版本 1.4 将支持此操作。此外,Insert.returning()
和ValuesBase.return_defaults()
方法的任何组合现在都会引发错误,因为这些方法是互斥的;之前的操作会静默失败。
参考:#5691 - [sql] [bug]
修复了结构性编译器问题,某些构造(如 MySQL / PostgreSQL 的“on conflict / on duplicate key”)依赖于Compiler
对象的状态被固定为其作为顶级语句的状态,这在这些语句从不同上下文中分支出来时会失败,例如与 SQL 语句链接的 DDL 构造。
参考:#5656
postgresql
- [postgresql] [usecase]
向ExcludeConstraint
对象添加了新参数ExcludeConstraint.ops
,以支持此约束的运算符类规范。感谢 Alon Menczer 的拉取请求。
参考:#5604 - [postgresql] [bug] [mysql]
修复了在 PostgreSQL 方言中引入的 1.3.2 版本的回归,也在 1.3.18 版本中复制到了 MySQL 方言的特性中,当使用非Table
构造(如text()
)作为Select.with_for_update.of
的参数时,在 PostgreSQL 或 MySQL 编译器中未能正确处理。
参考:#5729
mysql
- [mysql] [bug] [reflection]
修复了仅包含值中有小数点的 MariaDB 上的服务器默认反射问题,导致反射表缺乏任何服务器默认值。
参考:#5744 - [mysql] [sql]
向 MySQL 方言的RESERVED_WORDS
列表中添加了缺失的关键字:action
、level
、mode
、status
、text
、time
。感谢 Oscar Batori 的拉取请求。
参考:#5696
sqlite
- [sqlite] [usecase]
添加了sqlite_with_rowid=False
方言关键字,以便创建CREATE TABLE … WITHOUT ROWID
表。感谢 Sean Anderson 的补丁。
参考:#5685
mssql
- [mssql] [bug]
修复了当同时指定mssql-include
和mssql_where
时,CREATE INDEX 语句渲染不正确的错误。感谢@Adiorz 的拉取请求。
参考:#5751 - [mssql] [bug]
将 SQL Server 代码“01000”添加到断开连接代码列表中。
参考:#5646 - [mssql] [reflection] [sqlite]
修复了复合主键列未按正确顺序报告的问题。感谢@fulpm。
参考:#5661
oracle
- [oracle] [usecase]
实现了对 Oracle 数据库的 SERIALIZABLE 隔离级别的支持,以及对Connection.get_isolation_level()
的真正实现。
另请参见
事务隔离级别 / 自动提交
参考:#5755
1.3.20
发布日期:2020 年 10 月 12 日
orm
- [orm] [bug]
如果Query.join()
的目标参数设置为未映射对象,则现在会引发带有更多详细信息的ArgumentError
。在此更改之前,会引发一个较少详细的AttributeError
。感谢 Ramon Williams 的拉取请求。
参考:#4428 - [orm] [bug]
修复了针对实际上不是映射属性的字符串属性名称(例如普通 Python 描述符)使用加载器选项会引发一个不具信息性的 AttributeError 的问题;现在会引发一个描述性错误。
参考:#4589
engine
- [engine] [bug]
修复了将非字符串对象发送给SQLAlchemyError
或其子类(在某些第三方方言中会发生)时无法正确字符串化的问题。感谢 Andrzej Bartosiński 的拉取请求。
参考:#5599 - [engine] [bug]
修复了未在 sqlalchemy.exc 模块内使用 SQLAlchemy 标准延迟导入系统的函数级别导入。
参考:#5632
sql
- [sql] [bug]
修复了针对Over
构造执行pickle.dumps()
操作会产生递归溢出的问题。
参考:#5644 - [sql] [bug]
修复了一个 bug,在这种情况下,当一个column()
被同时添加到多个table()
时,错误没有被引发。这对Column
和Table
对象正确引发。当发生这种情况时,现在会引发一个ArgumentError
。
参考:#5618
postgresql
- [postgresql] [usecase]
psycopg2 方言现在支持将主机/端口组合传递给查询字符串,以支持 PostgreSQL 多主机连接。感谢 Ramon Williams 的拉取请求。
另请参阅
指定多个备用主机
参考:#4392 - [postgresql] [bug]
调整了Comparator.any()
和Comparator.all()
方法,实现了直接的“NOT”操作来进行否定,而不是否定比较运算符。
参考:#5518 - [postgresql] [bug]
修复了ENUM
类型在进行 CREATE TYPE 或 DROP TYPE 时不会查阅模式转换映射的问题。此外,修复了一个问题,即如果在单个 DDL 序列中多次遇到相同的枚举,则“check”查询将重复运行,而不是依赖于缓存值。
参考:#5520
mysql
- [mysql] [usecase]
调整了 MySQL 方言,以正确地将函数索引表达式括在括号中,这是 MySQL 8 所接受的。感谢 Ramon Williams 的拉取请求。
参考:#5462 - [mysql] [change]
添加了新的 MySQL 保留字:cube
,lateral
分别在 MySQL 8.0.1 和 8.0.14 中添加;这表明如果作为表或列标识符名称使用,这些术语将被引用。
参考:#5539 - [mysql] [bug]
使用with_for_update()
时使用的 “skip_locked” 关键字在 MariaDB 后端上使用时会发出警告,然后将被忽略。这是一个已弃用的行为,在 SQLAlchemy 1.4 中将引发异常,因为请求“skip locked”的应用程序正在寻找一个在这些后端上不可用的非阻塞操作。
参考文献:#5568 - [mysql] [bug]
修复了针对使用 MySQL 多表格式的 JOIN 的 UPDATE 语句的错误,如果语句没有 WHERE 子句,则会失败地包括目标表的表前缀,因为在这一特定点只有 WHERE 子句被扫描以检测“多表更新”。现在,如果是 JOIN,则还会扫描目标,以获取最左边的表作为主表,以及其他条目作为其他 FROM 条目。
参考文献:#5617
mssql
- [mssql] [bug]
修复了一个问题,其中对于 Azure DW 的 SQLAlchemy 连接 URI 使用authentication=ActiveDirectoryIntegrated
(而没有用户名+密码)时,构造的 ODBC 连接字符串的方式不被 Azure DW 实例接受。
参考文献:#5592
测试
- [tests] [bug]
修复了与 Pytest 6.x 运行时测试套件不兼容的问题。
参考文献:#5635
杂项
- [bug] [pool]
修复了当调用Engine.dispose()
时,以下池参数未被传播到新创建的池的问题:pre_ping
,use_lifo
。此外,现在还将recycle
和reset_on_return
参数传播给了AssertionPool
类。
参考文献:#5582 - [bug] [associationproxy] [ext]
在尝试将关联代理元素用作要从中选择或在 SQL 函数中使用的普通列表达式时,现在会引发一个信息性错误;目前不支持此用例。
参考文献:#5541, #5542
1.3.19
发布日期:2020 年 8 月 17 日
orm
- [orm] [usecase]
调整了Mapper.all_orm_descriptors()
访问器的工作方式,以一种确定性的方式表示属性,假定使用 Python 3.6 或更高版本,该版本根据声明属性的方式维护类属性的排序顺序。然而,这种排序不能保证在所有情况下都与属性的声明顺序匹配;请参阅方法文档以获取确切的方案。
参考文献:#5494
orm 声明
- [orm] [declarative] [usecase]
当使用AbstractConcreteBase
和ConcreteBase
类时,虚拟列的名称现在可以自定义,以允许具有实际命名为type
的列的模型。拉请求由 Jesse-Bakker 提供。
参考:#5513
sql
- [sql] [bug]
修复了“ORDER BY”子句呈现标签名称而不是完整表达式的问题,这对于 SQL Server 特别重要,在某些情况下,如果表达式被括在括号中,则不会发生。此案例已添加到测试支持。此更改还调整了 ORM 查询中“在存在 DISTINCT 时自动添加 ORDER BY 列”的行为,在 1.4 中已弃用,以更准确地检测已经存在的列表达式。
参考:#5470 - [sql] [bug] [datatypes]
LookupError
消息现在将向用户提供通过Enum
约束的列可能的四个可能值。超过 11 个字符的值将被截断并替换为省略号。拉请求由 Ramon Williams 提供。
参考:#4733 - [sql] [bug]
修复了Connection.execution_options.schema_translate_map
功能在使用Column.server_default
参数中使用Sequence.next_value()
函数时不起作用,并且创建表 DDL 被发出时。
参考:#5500
postgresql
- [postgresql] [bug]
修复了各种 RANGE 比较运算符的返回类型本身将是相同的 RANGE 类型而不是 BOOLEAN 的问题,这将导致在使用定义了结果处理行为的TypeDecorator
时产生不良结果。拉请求由 Jim Bosch 提供。
参考:#5476
mysql
- [mysql] [usecase]
MySQL 方言将为没有 FROM 子句但有 WHERE 子句的 SELECT 语句渲染 FROM DUAL。 这允许像“SELECT 1 WHERE EXISTS (subquery)”这样的查询以及其他用例。
参考资料:#5481 - [mysql] [错误]
修复了 CREATE TABLE 语句未正确指定 COLLATE 关键字的问题。
参考资料:#5411 - [mysql] [错误]
将 MariaDB 代码 1927 添加到“断开连接”代码列表中,因为最近的 MariaDB 版本显然在停止数据库服务器时使用此代码。
参考资料:#5493
sqlite
- [sqlite] [错误] [mssql] [反射]
对所有包含的方言进行了扫描,以确保在查询系统表时正确转义包含单引号或双引号的名称,对所有Inspector
方法接受对象名称作为参数(例如表名、视图名等)的方法进行修复(例如表名、视图名等)。 SQLite 和 MSSQL 存在两个修复的引号问题。
参考资料:#5456
mssql
- [mssql] [错误] [sql]
修复了 mssql 方言错误地转义包含‘]’字符的对象名称的错误。
参考资料:#5467
杂项
- [用例] [py3k]
在DeclarativeMeta.__init__()
方法中添加了一个**kw
参数。这允许类支持PEP 487元类钩子__init_subclass__
。合并请求由 Ewen Gillies 提供。
参考资料:##5357
1.3.18
发布日期:2020 年 6 月 25 日
orm
- [orm] [用例]
当在查询中使用Query.filter_by()
时,若第一个实体不是映射类,则改进错误消息。
参考资料:#5326 - [orm] [用例]
在query_expression()
构造中添加了一个新参数query_expression.default_expr
,如果未使用with_expression()
选项,则该参数将自动应用于查询。合并请求由 Haoyu Sun 提供。
参考资料:#5198
示例
- [示例] [变更]
为 examples.performance 套件添加了新选项--raw
,该选项将原始性能测试转储给任意数量的性能分析可视化工具使用。由于在这一点上很难构建 runsnake,因此删除了“runsnake”选项;
引擎
- [引擎] [错误]
进一步细化了在 #5326 中修复的“reset”代理的修复,现在在未正确调用时发出警告并纠正其行为。已识别并修复了额外的情况,其中会发出此警告。
参考:#5326 - [engine] [bug]
修复了URL
对象中的问题,其中对对象进行字符串化不会对特殊字符进行 URL 编码,从而阻止 URL 重新被消费为真实 URL。感谢 Miguel Grinberg 提交的拉取请求。
参考:#5341
sql
- [sql] [usecase]
table()
构造中添加了一个“.schema”参数,允许临时表达式也包含模式名称。感谢 Dylan Modesitt 提交的拉取请求。
参考:#5309 - [sql] [change] [sybase]
为 sybase 方言添加了.offset
支持。感谢 Alan D. Snow 提交的拉取请求。
参考:#5294 - [sql] [bug]
在type_coerce
元素中正确应用self_group
。
在表达式中使用时,类型强制元素未正确应用分组规则。
参考:#5344 - [sql] [bug]
在调用语句的str()
时,将Select.with_hint()
输出到生成的通用 SQL 字符串中。先前,此子句会被省略,假设其是方言特定的。提示文本在括号内呈现,以指示此类提示在后端之间的呈现方式有所不同。
参考:#5353 - [sql] [schema]
引入IdentityOptions
来存储序列和身份列的常见参数。
参考:#5324
schema
- [schema] [bug]
修复了使用tometadata()
复制数据库对象(例如,Table
)时省略了dialect_options
的问题。
参考:#5276
mysql
- [mysql] [usecase]
为 mysql 实现了行级锁支持。感谢 Quentin Somerville 提交的拉取请求。
参考:#4860
sqlite
- [sqlite] [usecase]
SQLite 3.31 添加了对计算列的支持。此更改在针对 SQLite 时启用了对其的支持。
参考:#5297 - [sqlite] [bug]
将“exists”添加到 SQLite 的保留字列表中,以便在用作标签或列名时将此单词引用。感谢 Thodoris Sotiropoulos 的拉取请求。
参考:#5395
mssql
- [mssql] [change]
将supports_sane_rowcount_returning = False
的要求从PyODBCConnector
级别移至MSDialect_pyodbc
,因为在某些情况下 pyodbc 可以正常工作。
参考:#5321 - [mssql] [bug]
优化了 SQL Server 方言用于解释包含许多点的多部分模式名称的逻辑,如果名称没有使用括号或引号,则实际上不会丢失任何点,并且还支持包含多个独立括号部分的“dbname”标记。
参考:#5364,#5366 - [mssql] [bug] [pyodbc]
修复了 pyodbc 连接器中的问题,当使用完全空的 URL 时,会发出关于 pyodbc“drivername”的警告。在生成非连接的方言对象或使用“creator”参数创建引擎时,空 URL 是正常的。现在只有在缺少驱动程序名称但其他参数仍然存在时才会发出警告。
参考:#5346 - [mssql] [bug]
修复了在为 pyodbc DBAPI 组装 ODBC 连接字符串时的问题。包含分号和/或大括号“{}”的标记未被正确转义,导致 ODBC 驱动程序错误解释连接字符串属性。
参考:#5373 - [mssql] [bug]
修复了一个问题,其中datetime.time
参数被转换为datetime.datetime
,导致与实际TIME
列进行>=
比较时不兼容。
参考:#5339 - [mssql] [bug]
修复了 SQL Server pyodbc 方言中的is_disconnect
函数在异常消息中包含与 SQL Server ODBC 错误代码匹配的子字符串时错误报告断开状态的问题。
参考:#5359
oracle
- [oracle] [bug] [reflection]
修复了 Oracle 方言中的一个问题,其中包含完整主键列集的索引会被误认为是主键索引本身,即使存在多个也会被省略。检查已经被细化,以将主键约束的名称与索引名称本身进行比较,而不是根据索引中存在的列来猜测。
参考:#5421
1.3.17
发布日期:2020 年 5 月 13 日
orm
- [orm] [usecase]
添加了一个访问器Comparator.expressions
,它提供对在多列ColumnProperty
属性下映射的列组的访问。
参考:#5262 - [orm] [usecase]
引入了relationship.sync_backref
标志,用于控制是否添加会改变 Python 属性的同步事件。这取代了先前的更改#5149,该更改警告说viewonly=True
关系的 back_populates 或 backref 配置的目标将被禁止。
参考:#5237 - [orm] [bug]
修复了一个 bug,当在一个已经具有与请求的相同的基于子查询的 with_polymorphic 设置的映射器上通过RelationshipComparator.of_type()
使用with_polymorphic()
作为连接的目标时,ON 子句在连接中不会正确别名化。
参考:#5288 - [orm] [bug]
修复了加载器选项(如 selectinload())与烘焙查询系统交互的问题,使得如果加载器选项本身具有当前不兼容缓存的元素(如 with_polymorphic()对象),则不应该发生查询的缓存。在这些情况下,烘焙加载器有时无法完全使自身失效,导致急切加载被忽略。
参考:#5303 - [orm] [bug]
修改了内部的“identity set”实现,这是一个根据它们的 id()而不是它们的哈希值对对象进行哈希的集合,以便实际上不调用对象的__hash__()
方法,这些对象通常是用户映射的对象。一些方法在实现的副作用中调用了这个方法。
参考:#5304 - [orm] [bug]
当尝试对一个不是实际映射实例的 ORM 多对一比较时,会引发一个信息性错误消息。不支持诸如与标量子查询的比较;使用Comparator.has()
更好地实现了与子查询的广义比较。
参考:#5269
engine
- [engine] [bug]
修复了一个相当关键的问题,即在仍处于未回滚状态时,DBAPI 连接可能会被返回到连接池。负责回滚连接的重置代理可能会在事务“关闭”而未回滚或提交的情况下被损坏,在使用 ORM 会话并以涉及保存点的某种模式发出.close()时可能会发生这种情况。修复确保重置代理始终处于活动状态。
参考:#5326
schema
- [schema] [bug]
修复了一个问题,即一个被延迟与表关联的Index
,例如当它包含一个尚未与任何Table
关联的Column
时,如果还包含非表导向表达式,则无法正确附加。
参考:#5298 - [schema] [bug]
当使用MetaData.sorted_tables
属性以及sort_tables()
函数时,如果给定的表由于外键约束之间存在循环依赖而无法正确排序时,会发出警告。在这种情况下,这些函数将不再按照外键对涉及的表进行排序,并将发出警告。不属于循环的其他表仍将按依赖顺序返回。以前,当检测到循环时,排序表例程会返回一个集合,该集合在检测到循环时会无条件省略所有外键,并且不会发出警告。
参考:#5316 - [schema]
在Column
的__repr__
方法中添加comment
属性。
参考:#4138
postgresql
- [postgresql] [usecase]
在 PostgreSQL 中添加了对Enum
的列或类型ARRAY
、JSON
或JSONB
的支持。在这些用例中以前需要使用一种解决方法。
参考:#5265 - [postgresql] [usecase]
当添加一个配置了Enum.native_enum
为False
的Enum
类型的ARRAY
列的表时,如果Enum.create_constraint
未设置为False
,则引发明确的CompileError
参考:#5266
mssql
- [mssql] [错误] [反射]
修复了在使用旧版 TDS 版本 4.2 时,在 MSSQL 中反射计算列引入的回归。方言将尝试检测首次连接的协议版本,并在无法检测到时运行在兼容模式下。
参考:#5255 - [mssql] [错误] [反射]
修复了在使用不支持concat
函数的 SQL Server 版本 2012 之前的版本时,在 MSSQL 中反射计算列引入的回归。
参考:#5271
oracle
- [oracle] [性能] [错误]
更改了获取 CLOB 和 BLOB 对象的实现方式,使用了 cx_Oracle 的本机实现,该实现将 CLOB/BLOB 对象与其他结果列一起获取,而不是执行单独的获取操作。如往常一样,可以通过将 auto_convert_lobs 设置为 False 来禁用此功能。
作为此更改的一部分,给定空字符串的 CLOB 现在在 INSERT 时返回 None,在 SELECT 时也返回 None,这与 Oracle 中 VARCHAR 的行为现在保持一致。
参考:#5314 - [oracle] [错误]
对于 LOB 和数字数据类型,对 cx_oracle 方言如何设置每列输出类型处理程序进行了一些修改,以适应即将到来的 cx_Oracle 8 中的潜在更改。
参考:#5246
杂项
- [变更] [firebird]
调整了对firebird://
URI 的方言加载,如果已安装外部的 sqlalchemy-firebird 方言,则使用该方言,否则回退到(现在已弃用的)内部 Firebird 方言。
参考:#5278
1.3.16
发布日期:2020 年 4 月 7 日
orm
- [orm] [性能]
修改了 subqueryload 和 selectinload 使用的查询,不再按照父实体的主键排序;这种排序是为了允许行按照它们进入的顺序直接复制到列表中,以便在 Python 端进行最小级别的排序。然而,这些 ORDER BY 子句可能会对查询的性能产生负面影响,因为在许多情况下,这些列是从子查询派生的,或者以其他方式不是实际的主键列,以至于 SQL 规划器无法使用索引。Python 端排序使用本机 itertools.group_by() 来整理传入的行,并已经修改为允许使用 list.extend() 将多个行组合到一起,这仍然可以实现相对快速的 Python 端性能。对于包含显式 order_by 参数的关系,仍将存在一个 ORDER BY,但这是两种加载方式的查询中唯一添加的 ORDER BY。
参考:#5162 - [orm] [bug]
修复了selectinload()
加载选项中的一个 bug,当两个或更多的加载器代表不同关系,并且具有相同的字符串键名称,从一个包含多个子类映射器的with_polymorphic()
构造中引用时,将无法单独调用每个 subqueryload,而是使用单个基于字符串的插槽,这将阻止其他加载器被调用。
参考:#5228 - [orm] [bug]
修复了一个问题,即 lazyload 使用会话本地的“get”针对目标多对一关系,当具有正确主键的对象存在时,但它是同级类的实例时,不会正确返回 None,就像懒加载器实际为该行发出加载时的情况一样。
参考:#5210
orm 声明式
- [orm] [declarative] [bug]
当使用声明式 API 时,relationship()
函数接受的第一个位置参数作为字符串参数不再使用 Python 的eval()
函数进行解释;相反,名称是点分隔的,并且名称直接在名称解析字典中查找,而不将值视为 Python 表达式。然而,将字符串参数传递给其他必须接受 Python 表达式的relationship()
参数仍将使用eval()
;文档已经澄清以确保没有歧义。
另请参阅
评估关系参数 - 字符串评估的详细信息
参考:#5238
sql
- [sql] [类型]
添加了在使用字符串方言进行调试时,能够对DateTime
、Date
或Time
进行文字编译的能力。此更改不会影响保留其当前行为的真实方言实现。
参考:#5052
模式
- [模式] [反射]
添加了对“计算”列的反射支持,这些列现在作为Inspector.get_columns()
返回的结构的一部分返回。在反映完整的Table
对象时,计算列将使用Computed
构造表示。
参考:#5063
postgresql
- [postgresql] [错误]
修复了“覆盖”索引的问题,例如具有 INCLUDE 子句的索引,将被反映为包含所有 INCLUDE 子句中的列的常规列。如果检测到这些额外列,现在会发出警告,指示它们当前被忽略。请注意,“覆盖”索引的全面支持是#4458的一部分。拉取请求由 Marat Sharafutdinov 提供。
参考:#5205
mysql
- [mysql] [错误]
修复了在连接到伪 MySQL 数据库(例如由 ProxySQL 提供的数据库)时 MySQL 方言中的问题,当它返回没有行时,对隔离级别的事先检查不会阻止方言继续连接。会发出警告,指出无法检测到隔离级别。
参考:#5239
sqlite
- [sqlite] [用例]
当使用 pysqlite 时,为 SQLite 实现了 AUTOCOMMIT 隔离级别。
参考:#5164
mssql
- [mssql] [用例] [mysql] [oracle]
为 SQL Server、MySQL 和 Oracle 添加了对ColumnOperators.is_distinct_from()
和ColumnOperators.isnot_distinct_from()
的支持。
参考:#5137
oracle
- [oracle] [用例]
当使用 cx_Oracle 时,为 Oracle 实现了 AUTOCOMMIT 隔离级别。还为 Oracle 添加了一个固定的默认隔离级别为 READ COMMITTED。
参考:#5200 - [oracle] [错误] [反射]
修复了由于#5146的修复导致的回归/不正确的修复,其中 Oracle 方言从“all_tab_comments”视图读取表注释,但未能适应请求的表的当前所有者,导致如果多个具有相同名称的表存在于多个模式中,则读取错误的注释。
参考:#5146
测试
- [测试] [错误]
修复了阻止测试套件在最近发布的 py.test 5.4.0 上运行的问题。
参考:#5201
杂项
- [枚举] [类型]
Enum
类型现在支持参数Enum.length
来指定创建 VARCHAR 列时的长度,当使用非本机枚举时,通过将Enum.native_enum
设置为False
。
参考:#5183 - [安装程序]
确保“pyproject.toml”文件不包含在构建中,因为此文件的存在表示 pip 应使用 pep-517 安装过程。由于当前工具/发行版似乎不太支持这种操作模式,在 SQLAlchemy 安装范围内通过省略文件来避免这些问题。
参考:#5207
1.3.15
发布日期:2020 年 3 月 11 日
orm
- [orm] [错误]
当Query.join()
无法定位左侧时,调整了错误消息,指出Query.select_from()
方法是解决问题的最佳方式。此外,在 1.3 系列中,从传递给Query
的给定列实体确定 FROM 子句时,使用确定性排序,以便每次确定相同的表达式。
参考:#5194 - [orm] [错误]
由于#4849导致的 1.3.14 中的回归错误已修复,当发生刷新错误时,sys.exc_info()调用未能正确调用。已为此异常情况添加了测试覆盖。
参考:#5196
1.3.14
发布日期:2020 年 3 月 10 日
通用
- [通用] [错误] [py3k]
对于大多数或全部在内部异常捕获中引发的内部异常,都明确添加了一个“cause”,以避免误导性的堆栈跟踪,这些堆栈跟踪表明在处理异常时出现了错误。虽然最好抑制内部捕获的异常,就像__suppress_context__
属性所做的那样,但目前似乎还没有一种方法可以在不抑制包含的用户构造上下文的情况下做到这一点,因此目前它将内部捕获的异常暴露为原因,以便维护有关错误上下文的全部信息。
参考文献:#4849
orm
- [orm] [usecase]
添加了一个新标志InstanceEvents.restore_load_context
和SessionEvents.restore_load_context
,适用于InstanceEvents.load()
、InstanceEvents.refresh()
和SessionEvents.loaded_as_persistent()
事件,当设置时,将在调用事件挂钩后恢复对象的“加载上下文”。这确保对象保持在已经进行的加载操作的“加载器上下文”中,而不是由于在事件中可能发生的刷新操作而将对象转移到新的加载上下文。当出现这种情况时,现在会发出警告,建议使用标志来解决这种情况。该标志是“选择加入”的,因此不会引入对现有应用程序的风险。
此更改还为会话生命周期事件添加了对raw=True
标志的支持。
参考文献:#5129 - [orm] [bug]
1.3.13 中由#5056引起的固定回归,其中 ORM 路径注册表系统的重构使路径不再可以与空元组进行比较,这可能发生在一种特定类型的连接式及加载路径中。已解决“空元组”用例,以便在所有情况下将路径注册表与路径注册表进行比较;PathRegistry
对象本身现在实现了__eq__()
和__ne__()
方法,这些方法将在所有等式比较中发生,并继续在预料之外的情况下成功进行,即比较非PathRegistry
对象时,同时发出警告,指出不应将该对象作为比较的主题。
参考文献:#5110 - [orm] [bug]
将一个关系设置为 viewonly=True,同时它也是 back_populates 或 backref 配置的目标,现在会发出警告,并最终被禁止。back_populates 具体指的是对属性或集合的改变,当属性受到 viewonly=True 的影响时,这是不允许的。viewonly 属性不受持久性行为的影响,这意味着当它在本地被改变时,它将不会反映出正确的结果。
参考:#5149 - [orm] [bug]
修复了与#5080相同区域的另一个回归,这是通过#4468在 1.3.0b3 中引入的,在with_polymorphic()
创建跨一个关系的选项时,该关系进入对该 with_polymorphic 的基类的关系,然后进一步进入常规映射关系将失败,因为基类组件不会以可被加载器策略定位的方式添加到加载路径中。在#5080中应用的更改已经进一步完善,以适应这种情况。
参考:#5121
engine
- [engine] [bug]
扩展了执行语句时游标/连接清理的范围,包括当结果对象构造失败时,或者 after_cursor_execute()事件引发错误时,或者 autocommit/autoclose 失败时。这允许在失败时清理 DBAPI 游标,并且对于无连接执行,允许关闭连接并将其返回到连接池,之前等待垃圾回收触发连接池返回。
参考:#5182
sql
- [sql] [bug] [postgresql]
修复了 CTE(Common Table Expression)的一个问题,该问题出现在 INSERT/UPDATE/DELETE 语句中同时使用 RETURNING,并且随后无法直接从中进行 SELECT,因为编译器的内部状态会尝试将外部 SELECT 当作一个 DELETE 语句来处理,并访问不存在的状态。
参考:#5181
postgresql
- [postgresql] [bug]
修复了“schema_translate_map”功能无法与 PostgreSQL 原生枚举类型(即Enum
,ENUM
)一起使用的问题。虽然“CREATE TYPE”语句会被正确地生成带有正确模式的枚举,但在引用枚举的 CREATE TABLE 语句中,模式不会被呈现出来。
参考:#5158 - [postgresql] [bug] [reflection]
修复了一个 bug,在该 bug 中,PostgreSQL 反射 CHECK 约束将无法解析约束,如果 SQL 文本包含换行符,则正则表达式已调整以适应此情况。拉取请求由 Eric Borczuk 提供。
参考:#5170
mysql
- [mysql] [错误]
修复了在 MySQLInsert.on_duplicate_key_update()
构造中使用 SQL 函数或其他组合表达式作为列参数时,不正确渲染列本身周围的VALUES
关键字的问题。
参考:#5173
mssql
- [mssql] [错误]
修复了DATETIMEOFFSET
类型不适应None
值的问题,这是为了解决此类型首次引入的一系列修复的一部分,首次引入于 #4983、#5045。此外,添加了支持通过此类型传递后端特定的日期格式字符串的支持,这通常允许在大多数其他 DBAPI 上的日期/时间类型上使用。
参考:#5132
oracle
- [oracle] [错误]
修复了一个反射错误,在该错误中,只能为实际由用户拥有但不是由用户拥有的表获取表注释,而不是对用户可见但由其他人拥有的表。由 Dave Hirschfeld 提供的拉取请求。
参考:#5146
其他
- [用例] [扩展]
向MutableList.sort()
函数添加了关键字参数,以便可以提供键函数和“reverse”关键字参数。
参考:#5114 - [性能] [错误]
对测试系统的内部更改进行了修订,该更改是由 #5085 导致的,该更改是无条件加载每个方言的与测试相关的模块,一旦使用了该方言,就会拉入 SQLAlchemy 的测试框架以及 ORM 到模块导入空间。这只会对初始启动时间和内存产生适度的影响,但最好这些附加模块不要对纯 Core 使用产生反向依赖。
参考:#5180 - [错误] [安装]
将inspect.formatannotation
函数放置在sqlalchemy.util.compat
内,该函数在 vendored 版本的inspect.formatargspec
中需要,该函数未在 cPython 中记录,并且不能保证在将来的 Python 版本中可用。
参考:#5138
1.3.13
发布日期:2020 年 1 月 22 日
orm
- [orm] [performance]
通过基于映射关系构建连接的系统中发现了性能问题。子句适配系统将用于大多数连接表达式,包括在常见情况下不需要适配的情况。已经对发生适配的条件进行了细化,以便平均非别名连接沿着简单关系使用约 70% 的函数调用。 - [orm] [bug] [engine]
添加了测试支持,并修复了在短暂对象中创建的大量不必要的引用循环,主要集中在 ORM 查询领域。非常感谢 Carson Ip 在此方面的帮助。
参考:#5050, #5056, #5071 - [orm] [bug]
修复了在 1.3.0b3 版本中引入的加载器选项中的回归问题,该问题通过 #4468 引入,其中使用PropComparator.of_type()
创建一个针对前一个关系引用的实体的继承子类的别名实体的加载器选项将无法生成匹配路径。另请参见在此相同版本中修复的 #5082,其中涉及类似类型的问题。
参考:#5107 - [orm] [bug]
修复了在 1.3.0b3 版本中引入的连接式预加载中的回归问题,该问题通过 #4468 引入,其中通过RelationshipProperty.of_type()
创建跨越with_polymorphic()
到多态子类的连接选项,然后沿着常规映射关系进一步失败,因为多态子类不会以可以被加载策略定位的方式将自身添加到加载路径中。已进行微调以解决此场景。
参考:#5082 - [orm] [bug]
修复了在删除使用“version_id”功能的对象时,在 ORM 刷新过程中出现的一个警告,该警告未被测试覆盖。通常情况下,此警告是无法触及的,除非使用的方言将“supports_sane_rowcount”标志设置为 False,这在大多数情况下并不是通常情况,但对于某些 MySQL 配置以及较旧的 Firebird 驱动程序以及可能的一些第三方方言可能是可能的。
参考:#5068 - [orm] [bug]
修复了一个 bug,即在使用连接的急加载时,当针对查询使用Query.group_by()
时,不会正确将查询包装在子查询中。当使用任何种类的结果限制方法时,例如 DISTINCT、LIMIT、OFFSET,连接的急加载会将行限制的查询嵌入到子查询中,以便不影响集合结果。出于某种原因,GROUP BY 的存在从未包含在此标准中,即使它具有与使用 DISTINCT 相同的效果。此外,该 bug 将阻止对大多数数据库平台的连接急加载查询使用 GROUP BY,这些数据库平台禁止在查询中存在非聚合、非分组的列,因为连接的急加载的附加列不会被数据库接受。
参考:#5065
引擎
- [引擎] [错误]
修复了一个问题,即在使用具有绑定值处理器的数据类型与“扩展 IN”参数一起使用时,Compiled
对象上的值处理器集合会发生变异;特别是,这意味着在使用语句缓存和/或烘焙查询时,同一 compiled._bind_processors 集合会同时发生变异。由于这些处理器对于给定的绑定参数命名空间每次都是相同的函数,因此这个问题实际上没有任何负面影响,但是,Compiled
对象的执行绝不应该导致其状态发生任何更改,尤其是考虑到它们旨在在完全构造后是线程安全和可重复使用的。
参考:#5048
sql
- [sql] [用例]
使用GenericFunction
创建的函数现在可以通过将quoted_name
构造分配给对象的.name 元素来指定函数的名称是否应该带引号或不带引号。在 1.3.4 之前,从不对函数名称应用引号,并且在#4467中引入了一些引号,但没有任何方法来强制对混合大小写名称进行引用。此外,当作为名称使用quoted_name
构造时,将正确在函数注册表中注册其小写名称,以便名称继续通过func.
注册表可用。
另请参阅GenericFunction
参考:#5079
postgresql
- [postgresql] [usecase]
为CTE
构造添加了前缀支持,以支持 Postgresql 12 中的“MATERIALIZED”和“NOT MATERIALIZED”短语。感谢 Marat Sharafutdinov 的拉取请求。
另请参阅HasCTE.cte()
参考:#5040 - [postgresql] [bug]
修复了 PostgreSQL 方言无法解析反射的 CHECK 约束的问题,该约束是一个布尔值函数(而不是布尔值表达式)。
参考:#5039
mssql
- [mssql] [bug]
修复了一个问题,即将时区感知的datetime
值转换为字符串以用作DATETIMEOFFSET
列的参数值时,省略了小数秒。
参考:#5045
测试
- [tests] [bug]
修复了一些在 Windows 上由于 SQLite 文件锁定问题而导致的测试失败,以及连接池相关测试中的一些时间问题;感谢 Federico Caselli 的拉取请求。
参考:#4946 - [tests] [postgresql]
通过测试 max_prepared_transactions 是否设置为大于 0 的值,改进了对 PostgreSQL 数据库的两阶段事务需求的检测。感谢 Federico Caselli 的拉取请求。
参考:#5057
杂项
- [bug] [ext]
修复了 sqlalchemy.ext.serializer 中的一个 bug,即如果一个唯一的BindParameter
对象同时存在于映射本身和查询的过滤条件中,那么它可能会与自身冲突,因为一侧将用于非反序列化版本,另一侧将用于反序列化版本。在BindParameter
中添加了类似于其“clone”方法的逻辑,该方法在反序列化时将参数名称唯一化,以避免与原始版本冲突。
参考:#5086
1.3.12
发布日期:2019 年 12 月 16 日
orm
- [orm] [bug]
修复了涉及lazy="raise"
策略的问题,其中 ORM 删除对象会对具有配置为lazy="raise"
的简单“use-get”样式的多对一关系引发异常。这与 1.3 中引入的更改不一致,作为#4353的一部分,其中确定了不期望发出 SQL 的历史操作应绕过lazy="raise"
检查,并且实际上将其视为此情况下的lazy="raise_on_sql"
。修复调整了延迟加载器策略,以便在指示延迟加载器不应发出 SQL 的情况下,如果对象不存在,则不会引发异常。
参考:#4997 - [orm] [bug]
修复了 1.3.0 中与#4351中的关联代理重构相关的回归,该回归阻止了composite()
属性在引用它们的关联代理方面的工作。
参考:#5000 - [orm] [bug]
在设置viewonly=True
的同时在relationship()
上设置与持久性相关的标志现在会发出常规警告,因为这些标志对于viewonly=True
关系没有意义。特别是,“cascade”设置有自己的警告,根据各个值生成,例如“delete, delete-orphan”,不应适用于viewonly
关系。但请注意,在“cascade”情况下,这些设置仍然错误地生效,即使关系设置为“viewonly”。在 1.4 中,将禁止在viewonly=True
关系上设置所有与持久性相关的级联设置,以解决此问题。
参考:#4993 - [orm] [bug] [py3k]
修复了将集合分配给自身作为切片时出现的问题,导致变异操作失败,因为它首先会意外地擦除分配的集合。由于不改变内容的赋值不应生成事件,因此该操作现在是一个空操作。请注意,此修复仅适用于 Python 3;在 Python 2 中,此情况下不会调用__setitem__
钩子;而是使用__setslice__
,它会在所有情况下逐个重新创建列表项。
参考:#4990 - [orm] [bug]
修复了一个问题,即如果在 Core 引擎/连接级别失败了事务的“begin”,例如由于网络错误或某些事务配方导致数据库被锁定,那么在从连接池获取该连接并立即返回它的 ORMSession
上下文中,ORMSession
将不会关闭连接,尽管该连接未存储在该Session
的状态中。这将导致连接被垃圾收集中的连接池弱引用处理程序清除,这是一种不理想的代码路径,在某些特殊配置中可能会在标准错误中发出错误。
参考:#5034
sql
- [sql] [bug]
修复了一个错误,即传递给select()
的 “distinct” 关键字不会像select.distinct()
那样将字符串值视为 “标签引用”,而是无条件地引发异常。这个关键字参数和其他传递给select()
的参数最终将在 SQLAlchemy 2.0 中被弃用。
参考:#5028 - [sql] [bug]
更改了“无法解析标签引用”异常的文本,以包括其他类型的标签强制转换,即在 PostgreSQL 方言下,“DISTINCT” 也属于此类别。
sqlite
- [sqlite] [bug]
修复了解决 SQLite 将 “numeric” 亲和性分配给 JSON 数据类型的行为问题,首次描述于 Support for SQLite JSON Added,该行为将标量数值 JSON 值返回为数字而不是可以进行 JSON 反序列化的字符串。SQLite 特定的 JSON 反序列化器现在对于这种情况会优雅地降级为异常,并且对于单个数值的情况绕过反序列化,因为从 JSON 视角来看,它们已经被反序列化了。
参考:#5014
mssql
- [mssql] [bug]
通过添加 PyODBC 级别的结果处理程序修复了对 PyODBC 上DATETIMEOFFSET
数据类型的支持,因为它不包括对此数据类型的本机支持。这包括使用 Python 3 中的“timezone” tzinfo 子类来设置时区,在 Python 2 中使用 sqlalchemy.util 中的“timezone”的最小回退。
参考:#4983
1.3.11
发布日期:2019 年 11 月 11 日
orm
- [orm] [usecase]
添加了访问器Query.is_single_entity()
到Query
,该访问器将指示此Query
返回的结果是一个 ORM 实体列表,还是实体或列表达式的元组。SQLAlchemy 希望在未来的版本中改进单个实体/元组的行为,以便行为在前期就是明确的,但是当前行为下此属性应该有所帮助。感谢 Patrick Hayes 提供的拉取请求。
参考:#4934 - [orm] [bug]
relationship.omit_join
标志并非意在手动设置为 True,当发生此情况时将会发出警告。omit_join
优化会被自动检测到,omit_join
标志仅用于在假设优化可能干扰正确结果的情况下禁用优化,但在现代版本中尚未观察到这种情况。在非默认主连接条件正在使用时,将标志设置为 True 可能会导致 selectin 加载功能无法正确工作。
参考:#4954 - [orm] [bug]
如果将主键值传递给Query.get()
,并且所有主键列位置都为 None,则会发出警告。以前,传递单个 None 会在元组之外引发TypeError
,传递复合 None(None 值的元组)会悄悄通过。现在的修复将单个 None 强制转换为元组,以便与其他 None 条件一致处理。感谢 Lev Izraelit 对此的帮助。
参考:#4915 - [orm] [bug]
BakedQuery
不会缓存通过QueryEvents.before_compile()
事件修改的查询,因此可能会对每次运行生效的编译钩子应用临时修改。特别是对于修改延迟加载和急加载中使用的查询的事件非常有帮助,比如“select in”加载。为了重新启用通过此事件修改的查询的缓存,添加了一个新标志bake_ok
;详细信息请参见使用 before_compile 事件。
提供一种新形式的 SQL 缓存的长期计划应该更全面地解决这种问题。
参考:#4947 - [orm] [bug]
修复了 ORM 中的 bug,其中引用某种方式引用本地主表的可选择的“secondary”表在生成关系相关的连接条件时,无论是通过Query.join()
还是通过joinedload()
,都会对连接条件的两侧应用别名。现在排除了“本地”一侧。
参考:#4974
engine
- [engine] [bug]
修复了一个 bug,在日志记录和错误报告中使用的参数 repr 需要额外的上下文以区分单个语句的参数列表和参数列表的列表,因为“列表的列表”结构也可能表示第一个参数本身是一个列表的单个参数列表,例如用于数组参数。引擎/连接现在传入一个额外的布尔值,指示参数应如何考虑。唯一期望数组作为参数的 SQLAlchemy 后端是使用 pyformat 参数的 psycopg2,因此这个问题并不太明显,但随着其他使用位置参数的驱动程序获得更多功能,支持这一点变得重要。它还消除了参数 repr 函数根据传递的参数结构猜测的需要。
参考:#4902 - [engine] [bug] [postgresql]
修复了Inspector
中的 bug,其中缓存键生成没有考虑以元组形式传递的参数,例如为了返回 PostgreSQL 方言的视图名称样式的元组。这将导致检查器对更具体的一组条件进行了过于一般化的缓存。逻辑已经调整为包含缓存中的每个关键字元素,因为每个参数都应适用于缓存,否则应该绕过方言的缓存装饰器。
参考:#4955
sql
- [sql] [usecase]
对JSON
类型的表达式添加了新的访问器,以允许特定数据类型的访问和比较,包括字符串、整数、数字、布尔元素。这修订了在比较值时将其转换为字符串的文档化方法,而是在 PostgreSQL、SQlite、MySQL 方言中添加了特定功能,以可靠地在所有情况下提供这些基本类型。
另请参见JSON
Comparator.as_string()
Comparator.as_boolean()
Comparator.as_float()
Comparator.as_integer()
参考:#4276 - [sql] [用例]
text()
构造现在支持“unique”绑定参数,这将在编译时动态使自己唯一,从而允许多个具有相同绑定参数名称的text()
构造组合在一起。
参考:#4933 - [sql] [bug] [py3k]
将quoted_name
构造的repr()
更改为在 Python 3 下使用常规字符串 repr(),而不是通过“backslashreplace”转义,这可能会误导。
参考:#4931
模式
- [模式] [用例]
增加了对“计算列”(computed columns)的 DDL 支持;这些是针对具有服务器计算值的列的 DDL 列规范,无论是在 SELECT 时(称为“虚拟”)还是在它们被 INSERT 或 UPDATE 时(称为“存储”)都有。支持已建立在 Postgresql、MySQL、Oracle SQL Server 和 Firebird 上。感谢 Federico Caselli 在这方面的大量工作。
另请参阅
计算列 (GENERATED ALWAYS AS)
参考:#4894 - [模式] [bug]
修复了一个 bug,即一个表的列标签与普通列名重叠,例如“foo.id AS foo_id”与“foo.foo_id”,会在此重叠被检测之前过早生成._label
属性,因为在列上使用index=True
或unique=True
标志与默认命名约定"column_0_label"
结合使用。然后,当稍后使用._label
生成绑定参数名称时,特别是在 ORM 生成 UPDATE 语句的 WHERE 子句时,会导致失败。通过使用用于 DDL 生成的替代._label
访问器来修复此问题,该访问器不会影响Column
的状态。该访问器还绕过了键去重步骤,因为对于 DDL 来说这是不必要的,命名现在在 DDL 中一致地是"_"
,在用于 DDL 时不会有任何后续的数字符号。
参考:#4911
mysql
- [mysql] [bug]
添加了从基本 pymysql.Error 类中解释的“连接被终止”消息,以便检测到关闭的连接,根据报告,此消息通过 pymysql.InternalError() 对象到达,这表明 pymysql 未正确处理它。
参考:#4945
mssql
- [mssql] [bug]
修复了 MSSQL 方言中的问题,即在 SELECT 中基于表达式的 OFFSET 值会被拒绝,尽管方言可以在 ROW NUMBER 导向的 LIMIT/OFFSET 结构中呈现此表达式。
参考:#4973 - [mssql] [bug]
修复了Engine.table_names()
方法中的问题,该方法会将方言的默认模式名称反馈给方言级别的表函数,在 SQL Server 的情况下,会将其解释为 mssql 方言视图中的点标记模式名称,这会导致在数据库用户名实际上包含点的情况下该方法失败。在 1.3 版本中,此方法仍然被MetaData.reflect()
函数使用,因此是一个重要的代码路径。在当前主开发分支 1.4 中,这个问题不存在,因为MetaData.reflect()
没有使用这个方法,也不会显式传递默认模式名称。尽管如此,修复仍然通过将方言返回的默认服务器名称值用 quoted_name() 包装来防止在任何情况下被解释为点标记名称。
参考:#4923
oracle
- [oracle] [usecase]
为 cx_Oracle 方言添加了方言级别标志encoding_errors
,可以作为create_engine()
的一部分指定。在 Python 2 下,这将传递给 SQLAlchemy 的 unicode 解码转换器,而在 Python 3 下,这将传递给 cx_Oracle 的cursor.var()
对象作为encodingErrors
参数,用于目标数据库中存在无法获取的破损编码的非常罕见情况,除非放宽错误处理。该值最终是传递给decode()
的 Python “编码错误”参数之一。
参考:#4799 - [oracle] [bug] [firebird]
修改了 Oracle 和 Firebird 方言的“名称规范化”方法,将这些方言的大写作为不区分大小写的约定转换为 SQLAlchemy 中的小写作为不区分大小写的约定,以便不自动将quoted_name
构造应用于在大写或小写转换下匹配自身的名称,这对许多非欧洲字符来说是一种情况。在元数据结构中使用的所有名称都会转换为quoted_name
对象;这里的更改只会影响一些检查函数的输出。
参考:#4931 - [oracle] [bug]
当使用绑定参数时,NCHAR
数据类型现在将绑定到cx_Oracle.FIXED_NCHAR
DBAPI 数据绑定,从而提供针对可变长度字符串的正确比较行为。以前,NCHAR
数据类型会绑定到cx_oracle.NCHAR
,这不是固定长度;CHAR
数据类型已经绑定到cx_Oracle.FIXED_CHAR
,因此现在一致的是NCHAR
绑定到cx_Oracle.FIXED_NCHAR
。
��考:#4913
测试
- [tests] [bug]
修复了在新版本 SQLite(3.30 或更高版本)中可能出现的测试失败,这是由于它们添加了空值排序语法以及对聚合函数的新限制。感谢 Nils Philippsen 提交的拉取请求。
参考:#4920
杂项
- [bug] [installation] [windows]
添加了一个解决方案,用于解决在 Windows 安装中观察到的 setuptools 相关故障,当未安装 MSVC 构建依赖项时,setuptools 没有正确报告构建错误,因此不允许优雅地降级为非 C 扩展构建。
参考:#4967 - [bug] [firebird]
向 Firebird 断开检测添加了额外的“断开”消息“写入数据到连接时出错”。拉取请求由 lukens 提供。
参考:#4903
1.3.10
发布日期:2019 年 10 月 9 日
mssql
- [mssql] [bug]
修复了 SQL Server 方言中新“max_identifier_length”功能的错误,其中 mssql 方言已经具有此标志,但实现未正确适应新的初始化挂钩。
参考:#4857
oracle
- [oracle] [bug]
修复了 Oracle 方言中的回归,该方言在 Oracle 服务器 12.2 及更高版本上无意中使用了 128 个字符的最大标识符长度,尽管 1.3 系列的其余部分的规定是该值保持在 30,直到 SQLAlchemy 1.4 版本。还修复了检索“兼容性”版本的问题,并删除了当“v$parameter”视图不可访问时发出的警告,因为这导致用户困惑。
参考:#4857, #4898
SqlAlchemy 2.0 中文文档(六十)(2)https://developer.aliyun.com/article/1560729