SqlAlchemy 2.0 中文文档(六十)(5)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,独享型 2核4GB
简介: SqlAlchemy 2.0 中文文档(六十)

SqlAlchemy 2.0 中文文档(六十)(4)https://developer.aliyun.com/article/1560732


1.3.5

发布日期:2019 年 6 月 17 日

orm

  • [orm] [bug]
    修复了一系列关于连接表继承超过两级深度的相关错误,与修改主键值结合使用,其中这些主键列也以外键关系链接在一起,这是连接表继承的典型情况。在三级继承层次结构中,中间表现在将获得其  UPDATE,仅在主键值更改且 passive_updates=False(例如,不执行外键约束)时,而以前会被跳过;类似地,如果  passive_updates=True(例如,ON UPDATE CASCADE 生效),则第三级表将不会收到 UPDATE  语句,这与早期的情况相同,因为 CASCADE  已经修改了它。在相关问题中,与连接继承层次结构中间表的主键相关联的关系,在父对象的主键被修改时也将正确地更新其外键列,即使该父对象是链接父类的子类,而在此之前,这些类将不会被计算。
    参考:#4723
  • [orm] [bug]
    修复了Mapper.all_orm_descriptors访问器的错误,当此项不是描述符时,它会在声明性__mapper__键下返回一个条目。现在将考虑到所有InspectionAttr对象上存在的.is_attribute标志,这也已被修改为对于关联代理是True,因为对于此对象错误地设置为 False。
    参考:#4729
  • [orm] [bug]
    修复了Query.join()中的回归问题,其中aliased=True标志未能正确地应用于过滤条件的子句适配,如果之前对同一实体进行了连接。这是因为适配器放置顺序错误。已经将顺序反转,以使最近的aliased=True调用的适配器优先,就像 1.2 及更早版本一样。这破坏了“elementtree”示例等内容。
    参考:#4704
  • [orm] [bug] [py3k]
    用 Python 3.3 中的完全供应版本替换了 getfullargspec() 的 Python 兼容性例程。最初,Python 在 Python 3.8 alpha 版本中为此函数发出了弃用警告。尽管已回滚此更改,但观察到 Python 3 实现的 getfullargspec() 在 3.4 系列中被重写为 Signature 后变得慢了一个数量级。虽然 Python 打算改进这种情况,但 SQLAlchemy 项目目前使用简单的替代方案来避免任何未来问题。
    参考:#4674
  • [orm] [bug]
    重新设计了 AliasedClass 使用的属性机制,不再依赖于在包装类的 MRO 上调用 __getattribute__,而是在包装类上正常解析属性使用 getattr(),然后解包/适应它。这允许在映射类上使用更广泛的属性样式,包括特殊的 __getattr__() 方案;但它也使代码更简单、更具弹性。
    参考:#4694

sql

  • [sql] [bug]
    解决了因使用 literal_column()构造而导致的一系列引号问题。当这个构造通过子查询“代理”并由其文本匹配的标签引用时,即使字符串在Label中是使用quoted_name`` 构造设置的,该标签也不会应用引号规则。不将引号应用于 Label 的文本是一个错误,因为该文本严格地说是 SQL 标识符名称,而不是 SQL 表达式,该字符串不应该已经嵌入引号,不像 literal_column() 可能会应用于。维护了一个未标记的 literal_column() 在子查询外部传播的现有行为,以帮助手动引号方案,尽管目前尚不清楚是否可以为这种情况生成有效的 SQL。
    参考:#4730

postgresql

  • [postgresql] [usecase]
    在为 PostgreSQL 反射索引时添加了列排序标志的支持,包括 ASC、DESC、NULLSFIRST、NULLSLAST。还将此功能添加到了通用的反射系统中,在未来的发布中可以应用于其他方言。拉取请求由 Eli Collins 提供。
    参考:#4717
  • [postgresql] [bug]
    修复了 PostgreSQL 方言无法正确反映没有成员的 ENUM 数据类型的错误,对于get_enums()调用返回一个带有None的列表,并在反映具有此类数据类型的列时引发 TypeError。现在检查返回一个空列表。
    参考:#4701

mysql

  • [mysql] [bug]
    修复了 MySQL ON DUPLICATE KEY UPDATE 无法将列设置为值 NULL 的错误。感谢 Lukáš Banič的拉取请求。
    参考:#4715

orm

  • [orm] [bug]
    修复了关于联接表继承超过两层深度的一系列相关错误,与修改主键值相结合,其中这些主键列也以外键关系相互链接,这在联接表继承中是典型的。在三级继承层次结构中的中间表现在将获得其  UPDATE,仅当主键值发生变化且 passive_updates=False(例如,外键约束未被执行)时;而以前会被跳过;类似地,当  passive_updates=True(例如,ON UPDATE CASCADE 生效)时,第三级表将不会收到 UPDATE  语句,这与以前的情况相同,因为 CASCADE  已经修改了它。在一个相关问题中,与联接继承层次结构的中间表的主键相关联的关系也将在父对象的主键被修改时正确地更新其外键列,即使该父对象是链接父类的子类,而以前这些类不会被计算。
    参考:#4723
  • [orm] [bug]
    修复了Mapper.all_orm_descriptors访问器会在声明性__mapper__键下返回一个关于Mapper本身的条目的错误,当这不是一个描述符时。现在将查询所有InspectionAttr对象上存在的.is_attribute标志,这也已被修改为对于关联代理为True,因为对于此对象错误地设置为 False。
    参考:#4729
  • [orm] [bug]
    修复了Query.join()中的回归问题,其中aliased=True标志未能正确应用于过滤条件的子句适配,如果之前对相同实体进行了联接。这是因为适配器的顺序放置错误。现已将顺序反转,以便最近的aliased=True调用的适配器优先级较高,就像在 1.2 及之前的情况一样。这破坏了“elementtree”示例等其他内容。
    参考:#4704
  • [orm] [bug] [py3k]
    用 Python 3.3 完全供应的版本替换了getfullargspec()的 Python 兼容性例程。最初,Python 在 Python 3.8 alpha 版本中对此函数发出了弃用警告。尽管此更改已被撤销,但观察到自 Python 3.4 系列以来,用于getfullargspec()的 Python 3 实现慢了一个数量级,因为它是针对Signature重写的。虽然 Python 计划改进这种情况,但 SQLAlchemy 项目目前正在使用简单的替换来避免任何未来的问题。
    参考:#4674
  • [orm] [bug]
    重构了AliasedClass使用的属性机制,不再依赖于在包装类的 MRO 上调用__getattribute__,而是在包装类上使用 getattr()正常解析属性,然后解包/适配。这允许映射类上的更广泛的属性样式,包括特殊的__getattr__()方案;但它也使代码在一般情况下更简单和更具弹性。
    参考:#4694

sql

  • [sql] [bug]
    解决了由于使用literal_column()构造引起的一系列引号问题。当此构造通过子查询“代理”并由与其文本匹配的标签引用时,即使在使用quoted_name``构造设置Label的字符串时,标签也不会应用引号规则。不对Label的文本应用引号是一个 bug,因为此文本严格来说是 SQL 标识符名称,而不是 SQL 表达式,该字符串不应该已经包含引号,不像可能应用于的literal_column()。保留了非标记的literal_column()在子查询外部传播的现有行为,以帮助手动引号方案,尽管目前尚不清楚是否可以为这种构造生成有效的 SQL。
    参考:#4730

postgresql

  • [postgresql] [usecase]
    在反映 PostgreSQL 索引时,添加了对列排序标志的支持,包括 ASC、DESC、NULLSFIRST、NULLSLAST。还将此功能添加到反射系统中,以便在将来的版本中应用于其他方言。感谢 Eli Collins 提供的拉取请求。
    参考:#4717
  • [postgresql] [bug]
    修复了一个 bug,即 PostgreSQL 方言无法正确反映没有成员的 ENUM 数据类型,对于get_enums()调用返回一个带有None的列表,并在反映具有此数据类型的列时引发 TypeError。现在检查返回一个空列表。
    参考:#4701

mysql

  • [mysql] [bug]
    修复了一个 bug,即 MySQL 的 ON DUPLICATE KEY UPDATE 无法将列设置为 NULL 值。感谢 Lukáš Banič提供的拉取请求。
    参考:#4715

1.3.4

发布日期:2019 年 5 月 27 日

orm

  • [orm] [bug]
    修复了AttributeEvents.active_history标志未设置为通过AttributeEvents.propagate标志传播到子类的事件侦听器的问题。这个 bug 存在于整个AttributeEvents系统的整个时间段。
    参考:#4695
  • [orm] [bug]
    修复了新的关联代理系统仍然不代理混合属性的回归,当它们使用@hybrid_property.expression装饰器返回另一个 SQL 表达式,或者当混合返回一个任意的PropComparator时,涉及到进一步通用化的启发式,用于检测在QueryableAttribute级别检测被代理对象的类型,以更好地检测描述符最终是否服务于映射类或列表达式。
    引用:#4690
  • [orm] [bug]
    对声明性类映射过程应用了“配置互斥体”映射器,以防止在动态模块导入方案仍在为相关类配置映射器的过程中使用映射器时可能发生的竞态。这并不能防止所有可能的竞态条件,比如并发导入尚未遇到相关类的情况,但它可以在 SQLAlchemy 声明性过程中尽可能地防范。
    引用:#4686
  • [orm] [bug]
    在将一个瞬态对象与Session.merge()一起合并到Session时,现在会发出警告,当对象在Session中已经是瞬态时。这种情况下会发出警告,表示对象通常会被双重插入。
    引用:#4647
  • [orm] [bug]
    修复了在新的关系  m2o 比较逻辑中的回归,该逻辑最初在 Improvement to the behavior of many-to-one query  expressions 中引入,当与持久化为 NULL  并且在映射实例中处于未获取状态的属性进行比较时。由于该属性没有显式默认值,在持久化设置中访问时需要默认为 NULL。
    引用:#4676

engine

  • [engine] [bug] [postgresql]
    将在方言初始化期间发生的“回滚”移动到在执行其他方言特定初始化步骤之后发生,特别是  psycopg2 方言的步骤,该步骤无意中会在第一个新连接上留下事务状态,这可能会干扰某些需要确保没有启动事务的 psycopg2 特定  API。感谢 Matthew Wilkes 提供的拉取请求。
    引用:#4663

sql

  • [sql] [bug]
    修复了GenericFunction类意外地注册自身为命名函数的问题。感谢 Adrien Berchet 提供的拉取请求。
    参考:#4653
  • [sql] [bug]
    修复了布尔列的双重否定不会重置“NOT”运算符的问题。
    参考:#4618
  • [sql] [bug]
    GenericFunction命名空间正在迁移,以便以不区分大小写的方式查找函数名称,因为 SQL 函数在区分大小写的差异上不会发生冲突,用户定义的函数或存储过程也不会发生这种情况。现在使用GenericFunction声明的函数查找采用不区分大小写的方案,但支持一个弃用案例,允许存在两个或更多具有不同大小写的相同名称的GenericFunction对象,这将导致对该特定名称进行区分大小写查找,同时在函数注册时发出警告。感谢 Adrien Berchet 在这个复杂功能上的大量工作。
    参考:#4569

postgresql

  • [postgresql] [bug] [orm]
    修复了一个问题,即“匹配的行数”警告即使方言报告“supports_sane_multi_rowcount=False”也会发出,例如对于 psycogp2 使用use_batch_mode=True等情况。
    参考:#4661

mysql

  • [mysql] [bug]
    添加了对 DROP CHECK  约束的支持,MySQL 8.0.16 需要此约束才能删除 CHECK 约束;MariaDB 支持普通的 DROP  CONSTRAINT。该逻辑通过检查服务器版本字符串是否存在 MariaDB 来区分这两种语法。Alembic 迁移已经解决了这个问题,通过在  MySQL / MariaDB CHECK 约束上实现自己的 DROP,但这个改变直接在 Core 中实现,以便普遍使用。感谢 Hannes  Hansen 提供的拉取请求。
    参考:#4650

mssql

  • [mssql] [feature]
    添加了对 SQL Server 过滤索引的支持,通过mssql_where参数实现,其工作方式类似于 PostgreSQL 方言中的postgresql_where索引函数。
    另请参阅
    过滤索引
    参考:#4657
  • [mssql] [bug]
    为 pymssql 添加了错误代码 20047 到“is_disconnect”。感谢 Jon Schuff 提供的拉取请求。
    引用:#4680

杂项

  • [杂项] [bug]
    从 MANIFEST.in 中删除了错误的“sqla_nose.py”符号,这会创建一个不希望的警告消息。
    引用:#4625

orm

  • [orm] [bug]
    修复了AttributeEvents.active_history标志未设置为通过AttributeEvents.propagate标志传播到子类的事件侦听器的问题。这个错误存在于整个AttributeEvents系统的整个时间段。
    引用:#4695
  • [orm] [bug]
    修复了新的关联代理系统仍未代理混合属性的回归,当它们使用@hybrid_property.expression装饰器返回替代的 SQL 表达式,或者当混合属性在表达式级别返回任意的PropComparator时。这涉及进一步泛化用于检测在QueryableAttribute级别代理的对象类型的启发式方法,以更好地检测描述符最终是为映射类还是列表达式服务。
    引用:#4690
  • [orm] [bug]
    对声明类映射过程应用了映射器“配置互斥锁”,以防止在动态模块导入方案仍在为相关类配置映射器的过程中发生的竞争。这并不防范所有可能的竞争条件,比如如果并发导入尚未遇到相关类,但它在 SQLAlchemy 声明过程中尽可能地防范了尽可能多的情况。
    引用:#4686
  • [orm] [bug]
    现在对将瞬态对象与Session.merge()合并到Session中已经是瞬态的对象的情况发出警告。这为通常会导致对象被双重插入的情况发出警告。
    引用:#4647
  • [orm] [bug]
    修复了在新关系 m2o 比较逻辑中引入的回归问题,该逻辑首次出现在改进了一对多查询表达式的行为时,当与在映射实例中处于未获取状态的持久化为 NULL 的属性进行比较时。由于属性没有明确的默认值,在持久化设置中访问时需要默认为 NULL。
    参考:#4676

引擎

  • [engine] [bug] [postgresql]
    将在方言初始化期间发生的“回滚”移动到额外的方言特定初始化步骤之后,特别是  psycopg2 方言的初始化步骤,该步骤会在第一个新连接上无意中保留事务状态,这可能会干扰一些需要不启动事务的 psycopg2 特定  API。感谢 Matthew Wilkes 提供的拉取请求。
    参考:#4663

sql

  • [sql] [bug]
    修复了GenericFunction类无意中注册自身为命名函数的问题。感谢 Adrien Berchet 提供的拉取请求。
    参考:#4653
  • [sql] [bug]
    修复了布尔列的双重否定不会重置“NOT”运算符的问题。
    参考:#4618
  • [sql] [bug]
    GenericFunction命名空间正在迁移,以便以不区分大小写的方式查找函数名称,因为 SQL 函数不会因区分大小写而发生冲突,用户定义的函数或存储过程也不会发生这种情况。现在使用不区分大小写的方案查找使用GenericFunction声明的函数,但支持一个弃用案例,允许存在两个或更多具有不同大小写的相同名称的GenericFunction对象,这将导致对该特定名称进行区分大小写查找,同时在函数注册时发出警告。感谢 Adrien Berchet 在这个复杂功能上的大量工作。
    参考:#4569

postgresql

  • [postgresql] [bug] [orm]
    修复了一个问题,即“匹配的行数”警告即使方言报告“supports_sane_multi_rowcount=False”也会发出,例如对于 psycogp2 与use_batch_mode=True和其他情况。
    参考:#4661

mysql

  • [mysql] [bug]
    添加了对 DROP CHECK  约束的支持,MySQL 8.0.16 要求删除 CHECK 约束;MariaDB 支持普通的 DROP  CONSTRAINT。该逻辑通过检查服务器版本字符串是否存在 MariaDB 来区分这两种语法。Alembic 迁移已经通过实现自己的  MySQL / MariaDB CHECK 约束删除来解决了这个问题,但是这个改变直接在 Core 中实现了这一功能,以便供一般使用。感谢  Hannes Hansen 的拉取请求。
    参考:#4650

mssql

  • [mssql] [功能]
    添加了对 SQL Server 过滤索引的支持,通过 mssql_where 参数实现,其工作方式类似于 PostgreSQL 方言中的 postgresql_where 索引函数。
    参见
    过滤索引
    参考:#4657
  • [mssql] [错误]
    为 pymssql 添加了错误代码 20047 到“is_disconnect”。感谢 Jon Schuff 的拉取请求。
    参考:#4680

杂项

  • [杂项] [错误]
    从 MANIFEST.in 中删除了错误的“sqla_nose.py”符号,这会导致不必要的警告消息。
    参考:#4625

1.3.3

发布日期:2019 年 4 月 15 日

orm

  • [orm] [错误]
    修复了 1.3 版本中新的“模糊 FROMs”查询逻辑中的回归问题,该问题是在 Query.join() 处理在决定“左”侧时的模糊性更加明确 中引入的,其中一个 Query 明确将一个实体放在 FROM 子句中,并使用 Query.join() 进行连接,如果该实体在额外的连接中使用,那么稍后将会导致“模糊 FROM”错误,因为该实体在 Query 的“from”列表中出现两次。修复此模糊性的方法是将独立实体合并到已经存在的连接中,就像在渲染 SELECT 语句时最终发生的那样。
    参考:#4584
  • [orm] [错误]
    调整了 Query.filter_by() 方法,不再在多个条件内部调用 and(),而是将其作为一系列条件传递给 Query.filter(),而不是单个条件。这允许 Query.filter_by() 推迟到 Query.filter() 处理可变数量的子句,包括列表为空的情况。在这种情况下,Query 对象将不会有 .whereclause,这允许后续的“无 whereclause”方法如 Query.select_from() 保持一致的行为。
    参考:#4606

postgresql

  • [postgresql] [bug]
    从 1.3.2 版本中的回归修复引起的问题,该问题是由 #4562 引起的,其中包含了仅包含查询字符串而不包含主机名的 URL,例如用于指定包含连接信息的服务文件时,将不再正确地传播到 psycopg2。对 #4562 中的更改已经调整以进一步适应 psycopg2 的确切要求,即如果存在任何连接参数,那么“dsn”参数不再是必需的,因此在这种情况下,只传递查询字符串参数。
    参考:#4601

mssql

  • [mssql] [bug]
    修复了 SQL Server  方言中的问题,即如果 ORDER BY 表达式中存在一个绑定参数,最终在 SQL Server  版本的语句中不会呈现,那么这些参数仍然会成为执行参数的一部分,导致 DBAPI 级别的错误。感谢 Matt Lewellyn 的拉取请求。
    参考:#4587

杂项

  • [bug] [pool]
    由于弃用了Pooluse_threadlocal标志,导致行为回归修复,SingletonThreadPool不再使用此选项,这会导致在事务的上下文中多次使用相同的Engine连接或隐式执行时发生“返回时回滚”逻辑,从而取消事务。虽然这不是与引擎和连接一起工作的推荐方式,但这仍然是一个令人困惑的行为变化,因为当使用SingletonThreadPool时,无论在同一线程中对相同引擎做了什么,事务都应该保持打开状态。use_threadlocal标志仍然被弃用,但SingletonThreadPool现在实现了自己版本的相同逻辑。
    参考:#4585
  • [bug] [ext]
    修复了在MutableList上使用copy.copy()copy.deepcopy()会导致列表内的项目被复制的错误,这是由于 Python pickle 和 copy 在处理列表时如何使用__getstate__()__setstate__()存在不一致性。为了解决这个问题,必须向MutableList添加一个__reduce_ex__方法。为了与基于__getstate__()的现有 pickle 保持向后兼容性,__setstate__()方法也保留;测试套件断言,对旧版本类进行的 pickle 仍然可以被 pickle 模块反序列化。
    参考:#4603

orm

  • [orm] [bug]
    修复了新“模糊 FROMs”查询逻辑中的 1.3 回归,该逻辑是在 Query.join()更明确地处理决定“左”侧的模糊性中引入的,其中一个Query在 FROM 子句中明确放置一个实体,并使用Query.join()进行连接,如果该实体在额外的连接中使用,那么稍后将导致“模糊 FROM”错误,因为该实体在Query的“from”列表中出现两次。 该修复通过将独立实体折叠到已经是一部分的连接中来解决这种模糊性,就像在渲染 SELECT 语句时最终发生的那样。
    参考:#4584
  • [orm] [bug]
    调整了Query.filter_by()方法,不再在多个条件内部调用and(),而是将其作为一系列条件传递给Query.filter(),而不是单个条件。 这允许Query.filter_by()推迟到Query.filter()对变量数量的子句的处理,包括列表为空的情况。 在这种情况下,Query对象将不具有.whereclause,这允许随后的“无 whereclause”方法(如Query.select_from())保持一致的行为。
    参考:#4606

postgresql

  • [postgresql] [bug]
    修复了从版本 1.3.2 发布引起的回归,原因是#4562,其中包含仅查询字符串而没有主机名的 URL,例如用于指定包含连接信息的服务文件,将不再正确传播到 psycopg2。 #4562中的更改已经调整以进一步适应 psycopg2 的确切要求,即如果有任何连接参数,那么“dsn”参数将不再是必需的,因此在这种情况下,仅传递查询字符串参数。
    参考:#4601

mssql

  • [mssql] [bug]
    修复了 SQL Server  方言中的问题,如果 ORDER BY 表达式中存在一个绑定参数,最终在 SQL Server  版本的语句中不会呈现,那么这些参数仍然会成为执行参数的一部分,导致 DBAPI 级别的错误。感谢 Matt Lewellyn 的拉取请求。
    参考:#4587

misc

  • [bug] [pool]
    修复了行为回归问题,因为取消了对Pooluse_threadlocal标志,SingletonThreadPool不再使用此选项,导致在事务的上下文中多次使用相同的Engine连接或隐式执行时发生“回滚返回”逻辑,从而取消事务。虽然这不是推荐的引擎和连接工作方式,但当使用SingletonThreadPool时,事务应该保持打开状态,无论在同一线程中对相同引擎做了什么。use_threadlocal标志仍然被弃用,但SingletonThreadPool现在实现了自己版本的相同逻辑。
    参考:#4585
  • [bug] [ext]
    修复了在对MutableList使用copy.copy()copy.deepcopy()时出现的 bug,由于 Python 的 pickle 和 copy 在处理列表时使用__getstate__()__setstate__()存在不一致性,导致列表内的项目被复制。为了解决这个问题,必须向MutableList添加一个__reduce_ex__方法。为了与基于__getstate__()的现有 pickle 兼容,__setstate__()方法也保留了;测试套件断言,对旧版本类进行的 pickle 仍然可以被 pickle 模块反序列化。
    参考:#4603

1.3.2

发布日期:2019 年 4 月 2 日

orm

  • [orm] [bug] [ext]
    恢复了对纯 Python 描述符(例如@property对象)的实例级支持,与关联代理一起使用时,如果代理对象根本不在 ORM 范围内,则被归类为“模糊”,但直接被代理。对于类级别访问,基本类级别__get__()现在直接返回AmbiguousAssociationProxyInstance,而不是引发其异常,这是返回可能的最接近以前返回AssociationProxy本身的行为的近似值。还改进了这些对象的字符串表示,以更具描述性地反映当前状态。
    参考:#4573, #4574
  • [orm] [bug]
    修复了一个 bug,当使用with_polymorphic()或其他别名构造时,当别名目标被用作子查询中的column_property()Select.correlate_except()目标时,适配不正确。这需要修复子句适配机制,以正确处理出现在“除了关联”列表中的可选择项,类似于出现在“关联”列表中的可选择项的方式。这实际上是一个相当基本的 bug,已经存在很长时间,但很难遇到。
    参考:#4537
  • [orm] [bug]
    修复了一个回归问题,当尝试将关系选项链接到一个未使用PropComparator.of_type()的 AliasedClass 时,本应引发一个新的错误消息,而实际上会引发AttributeError。请注意,在 1.3 版本中,从普通映射关系到AliasedClass创建选项路径而不使用PropComparator.of_type()已不再有效。
    参考:#4566

sql

  • [sql] [bug] [documentation]
    多亏了 TypeEngine methods bind_expression, column_expression work with Variant, type-specific types,我们不再需要依赖直接子类化特定方言类型的配方,TypeDecorator现在可以处理所有情况。此外,上述更改使得直接子类化基本 SQLAlchemy 类型的直接子类工作的可能性稍微降低,这可能会产生误导。文档已更新,以在这些示例中使用TypeDecorator,包括 PostgreSQL 的“ArrayOfEnum”示例数据类型,并且已删除了对“直接子类化类型”的直接支持。
    参考:#4580

postgresql

  • [postgresql] [功能]
    为 psycopg2 方言添加了对无参数连接 URL 的支持,这意味着可以将 URL 作为"postgresql+psycopg2://"传递给create_engine(),而不需要额外的参数来指示传递给 libpq 的空 DSN,这表示连接到“localhost”而不提供用户名、密码或数据库。感谢 Julian Mehnle 提交的拉取请求。
    参考:#4562
  • [postgresql] [错误]
    修改了Select.with_for_update.of参数,如果传递了联接或其他组合可选择的对象,则将从中过滤出各个Table对象,允许将 join()对象传递给参数,就像在使用 ORM 时正常情况下使用联接表继承一样。感谢 Raymond Lu 提交的拉取请求。
    参考:#4550

orm

  • [orm] [错误] [扩展]
    恢复了对纯 Python 描述符(例如@property对象)的实例级支持,与关联代理一起使用,如果代理对象根本不在 ORM 范围内,则被归类为“模糊”,但直接进行代理。对于类级别访问,基本类级别__get__()现在直接返回AmbiguousAssociationProxyInstance,而不是引发其异常,这是返回可能的最接近以前返回AssociationProxy本身的行为的近似值。还改进了这些对象的字符串表��,以更具描述性地反映当前状态。
    参考:#4573#4574
  • [orm] [错误]
    修复了一个错误,当使用with_polymorphic()或其他别名构造时,当别名目标被用作子查询中的Select.correlate_except()目标时,适配不会正确进行。这需要修复子句适配机制,以正确处理出现在“除外关联”列表中的可选择项,类似于出现在“关联”列表中的可选择项的方式。这实际上是一个相当基本的长期存在的 bug,但很难遇到它。
    参考:#4537
  • [orm] [bug]
    修复了一个回归,当尝试将一个关系选项链接到一个未使用PropComparator.of_type()的别名类(AliasedClass)时,本应该引发一个新的错误消息,而实际上会引发一个AttributeError。请注意,在 1.3 版本中,不再允许从普通的映射关系到一个AliasedClass创建选项路径,而不使用PropComparator.of_type()
    参考:#4566

sql

  • [sql] [bug] [documentation]
    由于 TypeEngine methods bind_expression, column_expression work with Variant, type-specific types 的改动,我们不再需要依赖直接子类化特定于方言的类型的食谱,TypeDecorator现在可以处理所有情况。此外,上述更改使得直接基于 SQLAlchemy 类型的子类的预期工作几率略微降低,这可能会误导。文档已更新为在这些示例中使用TypeDecorator,包括 PostgreSQL 的“ArrayOfEnum”示例数据类型,并且直接支持“直接子类化类型”的已被移除。
    参考:#4580

postgresql

  • [postgresql] [feature]
    为 psycopg2 方言添加了无参数连接 URL 的支持,这意味着可以将 URL 作为"postgresql+psycopg2://"传递给create_engine(),而不需要额外的参数来指示传递给 libpq 的空 DSN,这表示连接到“localhost”而不提供用户名、密码或数据库。感谢 Julian Mehnle 的拉取请求。
    参考:#4562
  • [postgresql] [bug]
    修改了Select.with_for_update.of参数,以便如果传递了连接或其他组合可选择项,则将从中过滤出各个Table对象,允许将 join()对象传递给参数,就像在使用 ORM 时通常发生的那样。感谢 Raymond Lu 的拉取请求。
    参考:#4550

1.3.1

发布日期:2019 年 3 月 9 日

orm

  • [orm] [bug] [ext]
    修复了关联代理链接到同义词时不再工作的回归,无论是在实例级别还是在类级别。
    参考:#4522

mssql

  • [mssql] [bug]
    在将隔离级别更改为 SNAPSHOT 后会发出一个 commit(),因为 pyodbc 和 pymssql 都会打开一个隐式事务,这会阻止当前事务中发出后续的 SQL。
    此更改也回溯到:1.2.19
    参考:#4536
  • [mssql] [bug]
    修复了 SQL Server 反射中的回归,原因是#4393中从Float数据类型中删除了开放式**kw,导致此类型的反射失败,因为传递了一个“scale”参数。
    参考:#4525

orm

  • [orm] [bug] [ext]
    修复了关联代理链接到同义词时不再工作的回归,无论是在实例级别还是在类级别。
    参考:#4522

mssql

  • [mssql] [bug]
    在将隔离级别更改为 SNAPSHOT 后会发出一个 commit(),因为 pyodbc 和 pymssql 都会打开一个隐式事务,这会阻止当前事务中发出后续的 SQL。
    此更改也回溯到:1.2.19
    参考:#4536
  • [mssql] [bug]
    修复了 SQL Server 反射中的回归,原因是#4393中从Float数据类型中删除了开放式**kw,导致此类型的反射失败,因为传递了一个“scale”参数。
    参考:#4525

1.3.0

发布日期:2019 年 3 月 4 日

orm

  • [orm] [特性]
    Query.get() 方法现在可以接受一个属性键和值的字典,作为指示要加载的主键值的手段;特别适用于复合主键。感谢 Sanjana S 提交的拉取请求。
    参考:#4316
  • [orm] [特性]
    现在可以将  SQL 表达式分配给 ORM 刷新中的主键属性,方式与普通属性描述的方式相同,如将 SQL  插入/更新表达式嵌入到刷新中,其中表达式将被评估,然后使用 RETURNING 返回给 ORM,或者在 pysqlite 的情况下,使用  cursor.lastrowid 属性工作。需要支持 RETURNING 的数据库(例如 Postgresql、Oracle、SQL  Server)或 pysqlite。
    参考:#3133

engine

  • [engine] [特性]
    修订了当字符串化时 StatementError 的格式。每个错误细节都分布在多个新行上,而不是在单行上间隔开。此外,SQL 表示现在将 SQL 语句字符串化,而不是使用 repr(),因此换行符会按原样呈现。感谢 Nate Clark 提交的拉取请求。
    另请参阅
    更改 StatementError 格式(换行和 %s)
    参考:#4500

sql

  • [sql] [错误]
    Alias 类及相关子类 CTELateralTableSample 已经重新设计,用户不再能直接构造这些对象。这些构造需要使用独立的构造函数或可选择绑定的方法来实例化新对象。
    参考:#4509

schema

  • [schema] [特性]
    添加了新参数Table.resolve_fksMetaData.reflect.resolve_fks,当设置为 False 时,将禁用遇到的ForeignKey对象的自动反射,这既可以减少省略表的 SQL 开销,也可以避免由于数据库特定原因无法反射的表。同一MetaData集合中存在的两个Table对象仍然可以相互引用,即使两个表的反射是分开进行的。
    参考:#4517

ORM

  • [ORM] [特性]
    Query.get()方法现在可以接受一个属性键和值的字典作为指示要加载的主键值的手段;对于复合主键特别有用。感谢 Sanjana S.的拉取请求。
    参考:#4316
  • [ORM] [特性]
    现在可以将  SQL 表达式分配给 ORM 刷新中的主键属性,方式与普通属性描述的方式相同,如将 SQL  插入/更新表达式嵌入到刷新中,其中表达式将被评估,然后使用 RETURNING 返回给 ORM,或者在 pysqlite 的情况下,使用  cursor.lastrowid 属性工作。需要支持 RETURNING 的数据库(例如 Postgresql、Oracle、SQL  Server)或 pysqlite。
    参考:#3133

引擎

  • [引擎] [特性]
    修订了在字符串化时的StatementError格式。每个错误细节现在分布在多个新行上,而不是在单行上间隔开。此外,SQL 表示现在将 SQL 语句字符串化,而不是使用repr(),因此换行符将按原样呈现。感谢 Nate Clark 的拉取请求。
    另请参阅
    更改了 StatementError 的格式(换行和%s)
    参考:#4500

SQL

  • [SQL] [错误]
    Alias类及其相关子类CTELateralTableSample已经重新设计,用户不再可以直接构造这些对象。这些构造要求使用独立的构造函数或可选择绑定方法来实例化新对象。
    参考:#4509

模式

  • [schema] [feature]
    添加了新参数Table.resolve_fksMetaData.reflect.resolve_fks,当设置为 False 时,将禁用在ForeignKey对象中遇到的相关表的自动反射,这既可以减少省略表的 SQL 开销,也可以避免由于数据库特定原因无法反射的表。同一MetaData集合中存在的两个Table对象仍然可以相互引用,即使两个表的反射是分开进行的。
    参考:#4517

1.3.0b3

发布日期:2019 年 2 月 8 日

orm

  • [orm] [bug]
    改进了with_polymorphic()与加载器选项一起使用的行为,特别是通配符操作以及load_only()。多态对象将更准确地被定位,以便实体上的列级选项能够正确生效。该问题是在#4468中修复的相同类型问题的延续。
    参考:#4469

orm 声明

  • [orm] [declarative] [bug]
    添加了一些辅助异常,当基于AbstractConcreteBaseDeferredReflectionAutoMap的映射在映射准备好使用之前被使用时,这些异常包含有关类的描述性信息,而不是陷入其他信息较少的故障模式中。
    参考:#4470

sql

  • [sql] [bug]
    完全删除了直接作为select()Query对象组件传递的字符串被自动强制转换为text()构造的行为;现在发出的警告现在是一个 ArgumentError 或在 order_by() / group_by()的情况下是 CompileError。自 1.0 版本以来一直发出警告,但其存在继续引起对此行为潜在误用的担忧。
    请注意,已发布了关于 order_by() / group_by()的公共 CVE,这些 CVE 由此提交解决:CVE-2019-7164 CVE-2019-7548
    另请参阅
    完全删除将字符串 SQL 片段强制转换为 text()
    参考:#4481
  • [sql] [bug]
    引用应用于Function名称,这些名称通常但不一定是从sqlalchemy.sql.expression.func构造生成的,在编译时如果它们包含非法字符,比如空格或标点符号。这些名称仍然被视为不区分大小写,这意味着如果名称包含大写字母或混合大小写字符,仅此并不会触发引用。目前为了向后兼容性而保持不区分大小写。
    参考:#4467
  • [sql] [bug]
    添加了对被接受为纯字符串的关键 DDL 短语的“SQL 短语验证”,包括 ForeignKeyConstraint.on_deleteForeignKeyConstraint.on_updateExcludeConstraint.usingForeignKeyConstraint.initially 等,用于预期仅有一系列 SQL 关键字的区域。任何非空格字符都暗示该短语需要引用,则会引发 CompileError。此更改与作为 #4481 一部分提交的一系列更改相关。
    参考:#4481

postgresql

  • [postgresql] [bug]
    修复了使用大写名称作为索引类型(例如 GIST、BTREE 等)或 EXCLUDE 约束时将其视为要引用的标识符的问题,而不是直接呈现。新行为将这些类型转换为小写,并确保它们只包含有效的 SQL 字符。
    参考:#4473

测试

  • [tests] [change]
    测试系统已移除对多年未维护且在 Python 3 下产生警告的 Nose 的支持。测试套件目前标准化为 Pytest。感谢 Parth Shandilya 提交的拉取请求。
    参考:#4460

其他

  • [bug] [ext]
    当使用关联代理与集合或字典时,实现了更全面的赋值操作(例如“批量替换”)。修复了创建冗余代理对象以替换旧对象的问题,这导致了过多的事件和 SQL,在唯一约束的情况下将导致刷新失败。
    参见
    使用关联代理对集合、字典实现批量替换
    参考:#2642

orm

  • [orm] [bug]
    改进了 with_polymorphic() 与加载器选项一起的行为,特别是通配符操作以及 load_only()。多态对象将更准确地被定位,以便实体的列级选项能够正确生效。该问题是在 #4468 中修复的相同类型的问题的延续。
    参考:#4469

orm 声明式

  • [orm] [declarative] [bug]
    添加了一些辅助异常,当基于AbstractConcreteBaseDeferredReflectionAutoMap的映射在映射准备好使用之前被使用时,这些异常会被触发,其中包含有关类的描述性信息,而不是陷入其他不够信息丰富的失败模式中。
    参考:#4470

sql

  • [sql] [bug]
    完全移除了直接作为select()Query对象的组件传递的字符串被自动强制转换为text()构造的行为;自版本 1.0 以来已发出警告,但其存在继续引发对此行为潜在误用的担忧。
    请注意,已发布了关于 order_by() / group_by()的公共 CVE,这些 CVE 已通过此提交解决:CVE-2019-7164 CVE-2019-7548
    另请参阅
    将字符串 SQL 片段强制转换为 text()已完全移除
    参考:#4481
  • [sql] [bug]
    引用被应用于Function名称,这些名称通常但不一定是从sqlalchemy.sql.expression.func构造生成的,在编译时如果它们包含非法字符,比如空格或标点符号。这些名称仍然被视为不区分大小写,这意味着如果名称包含大写字母或混合大小写字符,仅此并不会触发引用。目前为了向后兼容性,大小写不敏感性仍然被保留。
    参考:#4467
  • [sql] [bug]
    添加了对被接受为纯字符串的关键 DDL 短语“SQL 短语验证”的支持,包括ForeignKeyConstraint.on_deleteForeignKeyConstraint.on_updateExcludeConstraint.usingForeignKeyConstraint.initially等,用于期望一系列 SQL 关键字的地方。任何非空格字符表明该短语需要引号的情况将引发CompileError。此更改与提交的一系列更改相关,作为#4481的一部分。
    参考:#4481

postgresql

  • [postgresql] [bug]
    修复了使用大写名称作为索引类型(例如 GIST、BTREE 等)或 EXCLUDE 约束时将其视为需要引用的标识符的问题,而不是按原样呈现。新行为将这些类型转换为小写,并确保它们只包含有效的 SQL 字符。
    参考:#4473

测试

  • [tests] [change]
    测试系统已移除对 Nose 的支持,Nose 已多年未维护,并在 Python 3 下产生警告。测试套件目前标准化为 Pytest。感谢 Parth Shandilya 的拉取请求。
    参考:#4460

杂项

  • [bug] [ext]
    当使用关联代理与集合或字典时,实现了更全面的赋值操作(例如“批量替换”)。修复了创建多余代理对象以替换旧对象的问题,这会导致事件和 SQL 过多,并且在唯一约束的情况下会导致刷新失败。
    另请参阅
    为 AssociationProxy 实现了集合、字典的批量替换
    参考:#2642

1.3.0b2

发布日期:2019 年 1 月 25 日

一般

  • [general] [change]
    在整个库中进行了大规模的更改,确保所有被标记为已弃用或遗留的对象、参数和行为在调用时都会发出DeprecationWarning警告。由于  Python 3 解释器现在默认显示弃用警告,以及基于像 tox 和 pytest 这样的现代测试套件 tend to  显示弃用警告,这个更改应该使得更容易注意到哪些 API  功能已经过时。这个更改的一个主要原因是,长期被弃用的功能,尽管仍然在实际应用中使用,但最终将在不久的将来被移除;其中最大的例子是自版本 0.7  以来就已被弃用但仍然存在于库中的SessionExtensionMapperExtension类,以及少数其他的预事件扩展钩子。另一个是,还将弃用几个长期存在的行为,包括线程本地引擎策略、convert_unicode 标志和非主映射器。
    参见
    对所有已弃用元素发出弃用警告;添加新的弃用
    参考:#4393

orm

  • [orm] [feature]
    实现了一个新功能,可以将AliasedClass构造用作relationship()的目标。这样就不再需要“非主映射器”的概念,因为AliasedClass更容易配置,并自动继承了映射类的所有关系,同时保留了加载器选项正常工作的能力。
    参见
    关系到 AliasedClass 取代了非主映射器的需要
    参考:#4423
  • [orm] [feature]
    添加了新的MapperEvents.before_mapper_configured()事件。这个事件与其他“配置”阶段的映射器事件相辅相成,接收每个Mapper在其配置步骤之前的事件,并且可以用于阻止或延迟特定Mapper对象的配置,使用新的返回值interfaces.EXT_SKIP。请参考文档链接获取示例。
    参见
    MapperEvents.before_mapper_configured()
    参考:#4397
  • [orm] [change]
    添加了一个新函数close_all_sessions(),它接管了Session.close_all()方法的任务,后者现已被弃用,因为这会让人误解为类方法。感谢 Augustin Trancart 提供的拉取请求。
    参考:#4412
  • [orm] [bug]
    修复了长期存在的问题,即重复的集合成员会导致反向引用在删除其中一个重复项时删除成员与其父对象之间的关联,就像在一条语句中交换两个对象的副作用一样。
    另请参阅
    在删除操作期间检查多对一反向引用的集合重复项
    参考:#1103
  • [orm] [bug]
    将首次作为#3287的一部分进行的修复扩展,其中针对使用通配符的子类的加载器选项将扩展自身以包括将通配符应用于超类属性的“绑定”加载器选项,例如在表达式中Load(SomeSubClass).load_only('foo')SomeSubClass的父类的列也将被排除,就像使用未绑定选项load_only('foo')一样。
    参考:#4373
  • [orm] [bug]
    在 ORM 领域改进了由加载器选项遍历引发的错误消息。这包括早期检测到不匹配的加载器策略,以及更清晰地解释为什么这些策略不匹配。
    参考:#4433
  • [orm] [bug]
    collection.remove()方法中,现在在删除项目之前调用“remove”集合事件,这与大多数其他形式的集合项目删除行为一致(例如__delitem____setitem__下的替换)。对于pop()方法,删除事件仍然在操作之后触发。
  • [orm] [bug] [engine]
    为 Core 和 ORM 添加了执行选项的访问器,通过 Query.get_execution_options()Connection.get_execution_options()Engine.get_execution_options()Executable.get_execution_options()。感谢 Daniel Lister 提交的 PR。
    参考:#4464
  • [orm] [bug]
    由于 #3423 导致关联代理中存在问题,该问题导致自定义 PropComparator 对象与混合属性(例如在 dictlike-polymorphic 示例中演示的对象)在关联代理中无法正常工作。在 #3423 中添加的严格性已经放宽,并添加了额外的逻辑以适应关联代理链接到自定义混合的情况。
    参考:#4446
  • [orm] [bug]
    实现了 .get_history() 方法,这也意味着 synonym() 属性的可用性,以前,尝试通过同义词访问属性历史会引发 AttributeError
    参考:#3777

orm 声明式

  • [bug] [orm declarative]
    ColumnProperty 添加了 __clause_element__() 方法,该方法可以在声明式映射类中更友好地使用未完全声明的列或延迟属性,当它在类声明中用于约束或其他基于列的场景时,虽然这仍无法在开放式表达式中工作;如果收到 TypeError,建议调用 ColumnProperty.expression 属性。
    参考:#4372

engine

  • [engine] [feature]
    添加了公共访问器 QueuePool.timeout(),用于返回 QueuePool 对象的配置超时时间。感谢 Irina Delamare 提交的拉取请求。
    参考文献:#3689
  • [engine] [change]
    自 SQLAlchemy 大约版本 0.2 起就是遗留功能的“threadlocal”引擎策略现已弃用,以及 PoolPool.threadlocal 参数,在大多数现代用例中没有效果。
    请参阅
    “threadlocal” 引擎策略已弃用
    参考文献:#4393

sql

  • [sql] [feature]
    修改了 AnsiFunction 类,这是像 CURRENT_TIMESTAMP 这样的常见 SQL 函数的基类,以接受像常规即席函数一样的位置参数。这适用于特定后端上许多这些函数接受“分数秒”精度等参数的情况。如果函数是带参数创建的,则呈现括号和参数。如果没有参数,则编译器生成非括号形式。
    参考文献:#4386
  • [sql] [change]
    create_engine.convert_unicodeString.convert_unicode 参数已经弃用。这些参数是在大多数 Python DBAPI 几乎不支持 Python Unicode 对象时构建的,而 SQLAlchemy  需要以高性能的方式在整个系统中处理 Unicode 和字节串之间的数据和 SQL 字符串的复杂任务。多亏了 Python 3,DBAPI  被迫适应了 Unicode 感知的 API,今天由 SQLAlchemy 支持的所有 DBAPI 都原生支持 Unicode,包括在  Python 2 上,这样就可以最终(大部分)删除这个长期存在且非常复杂的功能。当然,在一些 Python 2  的边缘情况下,SQLAlchemy 仍然需要处理 Unicode,但这些情况都是自动处理的;在现代使用中,用户不应该与这些标志进行交互。
    请参阅
    弃用 convert_unicode 参数
    参考文献:#4393

mssql

  • [mssql] [bug]
    UnicodeUnicodeText 数据类型的 literal_processor 现在在 SQL 表达式中呈现一个 N 字符,这是 SQL Server 要求的用于呈现 SQL 表达式中的 Unicode 字符串值的方式。
    参考文献:#4442

杂项

  • [bug] [ext]
    修复了 1.3.0b1 中由#3423引起的回归,其中访问仅存在于多态子类上的属性的关联代理对象会引发AttributeError,尽管实际被访问的实例是该子类的实例。
    参考:#4401

通用

  • [general] [change]
    在整个库中进行了大规模的更改,确保所有被标记为弃用或遗留的对象、参数和行为在调用时现在会发出DeprecationWarning警告。由于  Python 3 解释器现在默认显示弃用警告,以及基于像 tox 和 pytest 这样的现代测试套件 tend to  显示弃用警告,这个更改应该使得更容易注意到哪些 API  功能已经过时。这个更改的一个主要原因是,长期弃用的功能,尽管仍然在实际应用中使用,但最终还是会在不久的将来被移除;其中最大的例子是SessionExtensionMapperExtension类以及一些其他自版本 0.7 以来就已被弃用但仍然存在于库中的预事件扩展钩子。另一个是,还将弃用几个长期存在的行为,包括线程本地引擎策略、convert_unicode 标志和非主映射器。
    另请参阅
    对所有弃用元素发出弃用警告;添加新的弃用
    参考:#4393

orm

  • [orm] [feature]
    实现了一个新功能,使得AliasedClass构造现在可以作为relationship()的目标使用。这样就不再需要“非主映射器”的概念,因为AliasedClass更容易配置,并且自动继承了映射类的所有关系,同时保留了加载器选项正常工作的能力。
    另请参阅
    AliasedClass 替代非主映射器的关系
    参考:#4423
  • [orm] [feature]
    添加了新的MapperEvents.before_mapper_configured()事件。该事件与其他“配置”阶段的映射器事件相辅相成,接收每个Mapper在其配置步骤之前的事件,并且还可以用于阻止或延迟特定Mapper对象的配置,使用新的返回值interfaces.EXT_SKIP。请参阅文档链接以获取示例。
    参见
    MapperEvents.before_mapper_configured()
    参考:#4397
  • [orm] [change]
    添加了一个新函数close_all_sessions(),它接管了Session.close_all()方法的任务,该方法现已被弃用,因为这会让人误解为一个类方法。感谢 Augustin Trancart 的拉取请求。
    参考:#4412
  • [orm] [bug]
    修复了长期存在的问题,即重复集合成员会导致反向引用在删除其中一个重复项时删除成员与其父对象之间的关联,这是在一条语句中交换两个对象的副作用。
    参见
    删除操作期间的一对多反向引用检查集合重复项
    参考:#1103
  • [orm] [bug]
    扩展了首次作为#3287的一部分进行的修复,其中针对使用通配符的子类进行的加载器选项将扩展到包括对超类属性应用通配符的情况,以及“绑定”加载器选项,例如在表达式中Load(SomeSubClass).load_only('foo')SomeSubClass的父类的列也将被排除,就像使用未绑定选项load_only('foo')一样。
    参考:#4373
  • [orm] [bug]
    改进了 ORM 在加载器选项遍历领域发出的错误消息。这包括对不匹配的加载器策略的早期检测,以及更清晰地解释为什么这些策略不匹配。
    参考:#4433
  • [orm] [bug]
    collection.remove()方法中,现在在删除项目之前调用集合的“remove”事件,这与大多数其他形式的集合项目删除行为一致(例如__delitem____setitem__下的替换)。对于pop()方法,删除事件仍然在操作之后触发。
  • [orm] [bug] [engine]
    通过Query.get_execution_options()Connection.get_execution_options()Engine.get_execution_options()Executable.get_execution_options()为 Core 和 ORM 添加了执行选项的访问器。PR 由 Daniel Lister 提供。
    参考:#4464
  • [orm] [bug]
    修复了与#3423相关的关联代理中的问题,该问题导致使用自定义PropComparator对象与混合属性(例如在dictlike-polymorphic示例中演示的属性)在关联代理中无法正常工作。在#3423中添加的严格性已经放宽,并且添加了额外的逻辑以适应关联到自定义混合的关联代理。
    参考:#4446
  • [orm] [bug]
    实现了.get_history()方法,这也意味着对于synonym()属性的AttributeState.history的可用性。以前,尝试通过同义词访问属性历史会引发AttributeError
    参考:#3777

orm 声明式

  • [bug] [orm 声明式]
    ColumnProperty添加了一个__clause_element__()方法,当在声明映射类中的约束或其他基于列的场景中使用未完全声明的列或延迟属性时,这可以使其在类声明中稍微更友好,尽管这仍然无法在开放式表达式中工作;如果收到TypeError,请优先调用ColumnProperty.expression属性。
    参考:#4372

engine

  • [engine] [功能]
    添加了公共访问器QueuePool.timeout(),返回QueuePool对象的配置超时时间。感谢 Irina Delamare 的拉取请求。
    参考:#3689
  • [engine] [更改]
    “threadlocal”引擎策略自 SQLAlchemy 大约 0.2 版本以来一直是一个传统功能,现已被弃用,以及PoolPool.threadlocal参数在大多数现代用例中没有效果。
    另请参阅
    “threadlocal”引擎策略已弃用
    参考:#4393

sql

  • [sql] [功能]
    修改了AnsiFunction类,这是常见 SQL 函数的基础,如CURRENT_TIMESTAMP,以接受位置参数,就像常规的临时函数一样。这样可以适应许多特定后端的这些函数接受参数,例如“分数秒”精度等情况。如果函数带有参数创建,它会呈现括号和参数。如果没有参数,则编译器生成非括号形式。
    参考:#4386
  • [sql] [更改]
    create_engine.convert_unicodeString.convert_unicode参数已被弃用。这些参数是在大多数  Python DBAPI 几乎不支持 Python Unicode 对象时构建的,而 SQLAlchemy 需要以高效的方式在 Unicode  和字节字符串之间传递数据和 SQL 字符串。由于 Python 3,DBAPI 被迫适应了支持 Unicode 的 API,今天  SQLAlchemy 支持的所有 DBAPI 都原生支持 Unicode,包括在 Python 2  上,允许这个长期存在且非常复杂的功能最终被(大部分)移除。当然,在一些 Python 2 的边缘情况下,SQLAlchemy 仍然需要处理  Unicode,但这些都是自动处理的;在现代用法中,用户不应该需要与这些标志进行交互。
    另请参阅
    convert_unicode 参数已弃用
    参考:#4393

mssql

  • [mssql] [错误]
    The literal_processor for the Unicode and UnicodeText datatypes now render an N character in front of the literal string expression as required by SQL  Server for Unicode string values rendered in SQL expressions.
    References: #4442

misc

  • [bug] [ext]
    Fixed a regression in 1.3.0b1 caused by #3423 where association proxy objects that access an attribute that’s only present on a polymorphic subclass would raise an AttributeError even though the actual instance being accessed was an instance of that subclass.
    References: #4401

1.3.0b1

Released: November 16, 2018

orm

  • [orm] [feature]
    Added new feature Query.only_return_tuples(). Causes the Query object to return keyed tuple objects unconditionally even if the query  is against a single entity. Pull request courtesy Eric Atkin.
    This change is also backported to: 1.2.5
  • [orm] [feature]
    Added new flag Session.bulk_save_objects.preserve_order to the Session.bulk_save_objects() method, which defaults to True. When set to False, the given mappings  will be grouped into inserts and updates per each object type, to allow  for greater opportunities to batch common operations together. Pull  request courtesy Alessandro Cucci.
  • [orm] [feature]
    The  “selectin” loader strategy now omits the JOIN in the case of a simple  one-to-many load, where it instead relies loads only from the related  table, relying upon the foreign key columns of the related table in  order to match up to primary keys in the parent table. This optimization  can be disabled by setting the relationship.omit_join flag to False. Many thanks to Jayson Reis for the efforts on this.
    See also
    selectin loading no longer uses JOIN for simple one-to-many
    References: #4340
  • [orm] [feature]
    Added .info dictionary to the InstanceState class, the object that comes from calling inspect() on a mapped object.
    See also
    info dictionary added to InstanceState
    参考:#4257
  • [orm] [bug]
    修复了在与Query.join()以及Query.select_entity_from()结合使用Lateral构造时,右侧的 join 不会应用子句适应的 bug。 “lateral”引入了 join 右侧可关联的用例。以前,未考虑适应此子句。请注意,在 1.2 版本中,由Query.subquery()引入的可选择项仍未适应,因为#4304;可选择项需要由select()函数生成,以成为“lateral” join 的右侧。
    此更改也回溯到:1.2.12
    参考:#4334
  • [orm] [bug]
    修复了关于passive_deletes=”all”的问题,即对象的外键属性在从其父集合中移除后仍保持其值。以前,工作单元会将其设置为 NULL,尽管passive_deletes指示不应修改它。
    另请参见
    passive_deletes=’all’将使从集合中移除的对象的 FK 保持不变
    参考:#3844
  • [orm] [bug]
    改进了与关系绑定的多对一对象表达式的行为,使得在相关对象上检索列值现在对于对象从其父Session分离后仍具有弹性,即使属性已过期。在InstanceState内部使用了新功能来记忆特定列属性在其过期之前的最后已知值,以便在对象分离和过期同时发生时表达式仍然可以评估。使用现代属性状态功能改进了错误条件,以根据需要生成更具体的消息。
    另请参见
    改进了多对一查询表达式的行为
    参考:#4359
  • [orm] [bug] [mysql] [postgresql]
    在某些情况下,ORM  现在会在子查询中对“FOR UPDATE”子句进行加倍渲染,因为观察到 MySQL 不会锁定子查询的行。这意味着查询将呈现两个 FOR  UPDATE 子句;请注意,在某些后端(例如 Oracle)上,由于不必要,子查询上的 FOR UPDATE 子句会被静默忽略。此外,在主要与  PostgreSQL 一起使用的“OF”子句的情况下,仅在使用此子句时,才会在内部子查询中呈现 FOR  UPDATE,以便可选择地将可选择的目标定位到 SELECT 语句中的表。
    另请参阅
    FOR UPDATE 子句在连接的预加载子查询中以及外部进行渲染
    参考:#4246
  • [orm] [bug]
    Query.join() 进行了重构,进一步澄清了结构化连接的各个组成部分。此重构增加了对于 Query.join() 的功能,当 FROM 列表中存在多个元素或查询涉及多个实体时,它可以确定连接的最适当的“左”侧。如果有多个 FROM/实体匹配,将引发错误,要求指定 ON 子句以解决歧义。特别是针对我们在 #4363 中看到的回归,但也具有一般用途。 Query.join() 中的代码路径现在更容易理解,并且错误情况更具体地在操作的较早阶段决定。
    另请参阅
    Query.join() 在更明确地决定“左”侧的歧义方面进行了处理
    参考资料:#4365
  • [orm] [bug]
    修复了 Query 中的一个长期存在的问题,即标量子查询(例如由 Query.exists()Query.as_scalar() 以及其他从 Query.statement 派生的查询生成的)在被用于需要实体适配的新 Query 中(例如当查询被转换为 union 或 from_self() 等时)不会被正确适配。此更改从由 Query.statement 访问器生成的 select() 对象中移除了“无适配”注释。
    参考:#4304
  • [orm] [bug]
    在 Python 中,在 ORM 刷新期间,当主键值不可排序时,会引发一个信息性异常,比如一个没有__lt__()方法的Enum;通常情况下,Python 3 会在这种情况下引发一个TypeError。在 Python 中,刷新过程按照主键对持久化对象进行排序,因此这些值必须是可排序的。
    参考:#4232
  • [orm] [bug]
    移除了MappedCollection类使用的集合转换器。此转换器仅用于断言传入的字典键与其对应对象的键匹配,并且仅在批量设置操作期间使用。该转换器可能会干扰自定义验证器或想要进一步转换传入值的 AttributeEvents.bulk_replace() 监听器。当传入的键与值不匹配时,此转换器将引发的TypeError被移除;在批量赋值期间,传入的值将被键入其生成的键,而不是显式存在于字典中的键。
    总的来说,@converter 被 AttributeEvents.bulk_replace() 事件处理程序所取代,这是作为 #3896 的一部分添加的。
    参考:#3604
  • [orm] [bug]
    添加了一种新的行为,当检索到多对一的“old”值时,会触发延迟加载,这样就可以跳过由于lazy="raise"或分离会话错误而引发的异常。
    另请参见
    多对一替换不会对“raiseload”或“old”对象引发异常
    参考:#4353
  • [orm] [bug]
    ORM 中长期存在的一个疏忽是,对于一对多关系的__delete__方法是无效的,例如对于del a.b这样的操作。现在已经实现了这一功能,并且等同于将属性设置为None
    另请参阅
    为 ORM 属性实现了“del”操作
    参考:#4354

orm declarative

  • [orm] [declarative] [bug]
    修复了声明式在调用并记忆化映射属性集合后,当添加或删除其他属性后不会更新Mapper状态的 bug。此外,如果从当前已映射的类中删除了完全映射的属性(例如列、关系等),则现在会引发NotImplementedError,因为如果删除了属性,则映射器将无法正确运行。
    参考:#4133

engine

  • [engine] [feature]
    QueuePool中添加了新的“lifo”模式,通常通过将标志create_engine.pool_use_lifo设置为 True 来启用。 “lifo”模式意味着刚刚检入的相同连接将首先被再次检出,允许在池仅部分利用时从服务器端清理多余的连接。感谢 Taem Park 提交的拉取请求。
    另请参阅
    队列池的新后进先出策略

sql

  • [sql] [feature]
    重构了SQLCompiler以公开类似于SQLCompiler.order_by_clause()SQLCompiler.limit_clause()方法的SQLCompiler.group_by_clause()方法,可以被方言重写以自定义 GROUP BY 的渲染方式。感谢 Samuel Chou 提交的拉取请求。
    此更改也回溯到:1.2.13
  • [sql] [feature]
    在“字符串 SQL”系统中添加了Sequence,当在没有方言的情况下将包含“序列下一个值”表达式的语句字符串化时,会生成一个有意义的字符串表达式("<next sequence value: my_sequence>"),而不是引发编译错误。
    参考:#4144
  • [sql] [feature]
    添加了新的命名约定标记column_0N_namecolumn_0_N_name等,将为特定约束中引用的所有列的名称/键/标签生成名称。为了适应这种命名约定的长度,SQL 编译器的自动截断功能现在也适用于约束名称,这将为约束创建一个缩短的、确定性生成的名称,该名称将适用于目标后端而不会超过该后端的字符限制。
    此更改还修复了另外两个问题。一个是column_0_key标记尽管已经记录在案,但却无法使用,另一个是如果这两个值不同,referred_column_0_name标记会错误地呈现.key而不是.name
    另请参阅
    新的多列命名约定标记,长名称截断
    参考:[#3989](https://www.sqlalchemy.org/trac/tick
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
Python
SqlAlchemy 2.0 中文文档(三十)(3)
SqlAlchemy 2.0 中文文档(三十)
13 1
|
6天前
|
SQL 存储 缓存
SqlAlchemy 2.0 中文文档(三十)(5)
SqlAlchemy 2.0 中文文档(三十)
15 1
|
6天前
|
SQL 存储 缓存
SqlAlchemy 2.0 中文文档(三十)(4)
SqlAlchemy 2.0 中文文档(三十)
15 0
|
6天前
|
数据库连接 API 数据库
SqlAlchemy 2.0 中文文档(三十)(2)
SqlAlchemy 2.0 中文文档(三十)
15 0
|
6天前
|
数据库 Python
SqlAlchemy 2.0 中文文档(三十)(1)
SqlAlchemy 2.0 中文文档(三十)
11 1
|
8天前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(七十)(5)
SqlAlchemy 2.0 中文文档(七十)
11 1
|
8天前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(七十)(3)
SqlAlchemy 2.0 中文文档(七十)
14 1
|
8天前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(七十)(1)
SqlAlchemy 2.0 中文文档(七十)
11 1
|
8天前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(七十)(4)
SqlAlchemy 2.0 中文文档(七十)
11 1
|
5天前
|
JSON 数据库 数据格式
SqlAlchemy 2.0 中文文档(五十)(5)
SqlAlchemy 2.0 中文文档(五十)
8 0