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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: SqlAlchemy 2.0 中文文档(六十七)

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


0.6beta2

发布日期:2010 年 3 月 20 日

orm

  • [orm]
    relation() 函数的官方名称现在是 relationship(),以消除对关系代数术语的混淆。然而,relation() 在可预见的未来仍将以相同的能力可用。
    参考:#1740
  • [orm]
    向 Mapper 添加了 “version_id_generator” 参数,这是一个可调用对象,给定 “version_id_col” 的当前值,返回下一个版本号。可用于替代版本控制方案,如 uuid、timestamps。
    参考:#1692
  • [orm]
    在 Session.refresh() 中添加了 “lockmode” kw 参数,将字符串值传递给 Query,与 with_lockmode() 中的行为相同,还将为启用 version_id_col 的映射执行版本检查。
  • [orm]
    修复了在联合继承场景中调用 query(A).join(A.bs).add_entity(B) 会将 B 重复添加为目标并生成无效查询的 bug。
    参考:#1188
  • [orm]
    修复了 session.rollback() 中的 bug,涉及在重新整合“删除”对象之前未从会话中移除以前的“挂起”对象,通常发生在自然主键上。如果它们之间存在主键冲突,删除的附加将在内部失败。现在首先清除以前的“挂起”对象。
    参考:#1674
  • [orm]
    删除了很多没有人真正关心的日志记录,保留的日志记录将响应日志级别的实时更改。不会增加显著的开销。
    参考:#1719
  • [orm]
    修复了 session.merge()中的 bug,该 bug 阻止了类似字典的集合的合并。
  • [orm]
    session.merge()可以与明确不包括“merge”在其级联选项中的关系一起工作-目标完全被忽略。
  • [orm]
    如果目标具有该属性的值,则 session.merge()不会使现有目标上的现有标量属性过期,即使传入的合并没有该属性的值。这可以防止对现有项目进行不必要的加载。但是,如果目标没有该属性,它仍将标记为过期,这符合延迟列的某些约定。
    参考:#1681
  • [orm]
    “allow_null_pks”标志现在称为“allow_partial_pks”,默认为 True,像 0.5 中一样起作用。除此之外,它还在 merge()中实现,如果标志为 False,则不会为具有部分 NULL 主键的传入实例发出 SELECT。
    参考:#1680
  • [orm]
    修复了 0.6 重做的“多对一”优化中的 bug,即针对远程表上的非主键列(即针对唯一列的外键)的多对一在更改时会从数据库中拉取“旧”值,因为如果它在会话中,我们将需要它进行正确的历史/反向引用记账,而在非主键列上无法从本地标识映射中拉取。
    参考:#1737
  • [orm]
    修复了在单表继承关系上调用 has()或类似复杂表达式时可能发生的内部错误。
    参考:#1731
  • [orm]
    query.one()不再对查询应用   LIMIT,以确保它完全计算结果中存在的所有对象标识,即使在连接可能隐藏两个或更多行的多个标识的情况下也是如此。作为奖励,由于它不再修改查询,现在也可以使用从  from_statement()发出的查询调用 one()。
    参考:#1688
  • [orm]
    调用 query.get()现在会返回 None,如果查询的标识符在身份映射中以不同于请求的类的方式存在,即在使用多态加载时。
    参考:#1727
  • [orm]
    在 query.join()中进行了重大修复,当“on”子句是 aliased()构造的属性时,但已经存在对兼容目标的现有连接时,查询会正确地连接到正确的 aliased()构造,而不是粘附到现有连接的右侧。
    参考:#1706
  • [orm]
    对于不会在所谓的“行切换”操作中不必要地更新主键列的修复进行了轻微改进,即对具有相同主键的两个对象进行添加 + 删除。
    参考:#1362
  • [orm]
    现在在属性加载或刷新操作失败时使用 sqlalchemy.orm.exc.DetachedInstanceError,因为对象从任何会话中分离。UnboundExecutionError 专用于绑定到会话和语句的引擎。
  • [orm]
    在表达式上下文中调用的 Query 将在所有情况下呈现消除歧义的标签。请注意,这不适用于现有的 .statement 和 .subquery() 访问器/方法,它仍然遵循默认值为 False 的 .with_labels() 设置。
  • [orm]
    Query.union() 在返回的语句中保留了消除歧义的标签,从而避免了由列名冲突导致的各种 SQL 组合错误。
    参考:#1676
  • [orm]
    修复了属性历史中的错误,意外地在映射实例上调用了 eq
  • [orm]
    对对象加载的一些内部优化使大型结果加速了一小部分,估计约为 10-15%。对“state”内部进行了彻底的清理,减少了复杂性、数据成员、方法调用以及空字典的创建。
  • [orm]
    对 query.delete() 进行了文档澄清。
    参考:#1689
  • [orm]
    修复了许多对一关系(many-to-one relation())中级联 bug,在属性设置为 None 时引入,出现在 r6711 中(在 add() 过程中将已删除的项级联到会话中)。
  • [orm]
    在调用  query.select_from()、query.with_polymorphic() 或 query.from_statement()  之前调用 query.order_by() 或 query.distinct() 现在会引发异常,而不是静默地删除这些条件。
    参考:#1736
  • [orm]
    如果返回多于一行,则 query.scalar() 现在会引发异常。所有其他行为保持不变。
    参考:#1735
  • [orm]
    修复了使用 version_id_col 时“行切换”逻辑(即用 UPDATE 替换的 INSERT 和 DELETE)失败的 bug。
    参考:#1692

示例

  • [示例]
    稍微修改了 beaker 缓存示例,以便为懒加载缓存设置单独的 RelationCache 选项。通过将多个潜在属性分组到一个共同的结构中,此对象可以更有效地进行查找。FromCache 和 RelationCache 分别更简单。

sql

  • [sql]
    join() 现在默认情况下会模拟 NATURAL JOIN。这意味着,如果左侧是一个连接,它将尝试首先将右侧连接到左侧的最右侧,并且如果成功,则不会引发有关模糊连接条件的任何异常,即使在左侧的其余连接目标中还有进一步的连接目标。
    参考:#1714
  • [sql]
    最常见的结果处理器转换函数已移至新的“processors”模块。鼓励方言作者在需要时使用这些函数,而不是实现自定义函数。
  • [sql]
    SchemaType 和子类 Boolean、Enum 现在是可序列化的,包括它们的 ddl 监听器和其他事件可调用函数。
    参考:#1694, #1698
  • [sql]
    一些平台现在会将某些文字值解释为非绑定参数,直接呈现在  SQL 语句中。这是为了支持某些平台(包括 MS-SQL 和 Sybase)强制执行的严格 SQL-92  规则。在这种模式下,绑定参数不允许出现在 SELECT  的列子句中,也不允许出现某些模糊表达式如“?=?”。当启用此模式时,基本编译器将把绑定参数呈现为内联文字,但仅限于字符串和数值。其他类型如日期将会引发错误,除非方言子类为其定义了文字呈现函数。绑定参数必须已经包含嵌入的文字值,否则会引发错误(即无法使用直接的  bindparam(‘x’))。方言还可以扩展绑定不被接受的领域,比如在函数的参数列表中(当使用本地 SQL 绑定时,在 MS-SQL  上无法工作)。
  • [sql]
    为 String、Unicode  等添加了“unicode_errors”参数。行为类似于标准库的 string.decode()函数的‘errors’关键字参数。此标志要求  convert_unicode 设置为“force” - 否则,SQLAlchemy 不能保证处理 unicode  转换的任务。请注意,对于已经本地返回 unicode 对象的后端(大多数 DBAPI  都是这样),此标志会给行提取操作带来显著的性能开销。此标志应仅作为从具有不同或损坏编码的列中读取字符串的绝对最后手段使用,这仅适用于首先接受无效编码的数据库(即  MySQL,是 PG,Sqlite 等)。
  • [sql]
    增加了数学否定运算符支持,-x。
  • [sql]
    FunctionElement 子类现在可以直接执行,就像任何 func.foo()构造一样,在传递给 execute()时会自动应用 SELECT。
  • [sql]
    func.foo()构造的“type”和“bind”关键字参数现在局限于“func.”构造,并不是 FunctionElement 基类的一部分,允许在自定义构造函数或类级变量中处理“type”。
  • [sql]
    将 keys()方法恢复到 ResultProxy。
  • [sql]
    现在,类型/表达式系统会更完整地确定表达式的返回类型以及将  Python 运算符适应为 SQL 运算符,这是根据给定表达式的完整 left/right/operator 基础上进行的。特别是针对  PostgreSQL EXTRACT 创建的日期/时间/间隔系统现已被泛化到类型系统中。以前的行为通常是表达式“column +  literal”强制“literal”的类型与“column”的类型相同,现在通常不会发生 - “literal”的类型首先是从字面的  Python 类型派生的,假设是标准的本机 Python 类型 + 日期类型,然后再回退到表达式另一侧的已知类型。如果“回退”类型是兼容的(即  String 的 CHAR),则字面量侧将使用该类型。TypeDecorator  类型默认覆盖此行为以无条件地强制转换“literal”侧,这可以通过实现 coerce_compared_value()  方法来更改。同样是部分。
    参考:#1647, #1683
  • [sql]
    使  sqlalchemy.sql.expressions.Executable 成为公共 API 的一部分,用于可以发送到 execute()  的任何表达式构造。FunctionElement 现在继承了 Executable,因此它获得了  execution_options(),这些选项也会传播到 execute() 内部生成的 select()。Executable 又是  _Generative 的子类,标记了任何支持 @_generative 装饰器的 ClauseElement -  这些在某些时候也可能变为编译器扩展的“公共”。
  • [sql]
    解决了 - 用户定义的绑定参数名称直接与 update/insert 的 SET 或 VALUES 子句生成的列名绑定发生冲突的解决方案生成编译错误。这降低了调用次数,并消除了一些仍可能发生不良名称冲突的情况。
    参考:#1579
  • [sql]
    如果 Column() 没有外键,则需要一个类型(这不是新的)。如果 Column() 没有类型和没有外键,则会引发错误。
    参考:#1705
  • [sql]
    在将返回的浮点值强制转换为 Decimal 的字符串时,Numeric() 类型的“scale”参数会受到尊重 - 这允许 SQLite、MySQL 上的准确性功能。
    参考:#1717
  • [sql]
    Column 的 copy() 方法现在会复制未初始化的“on table attach”事件。有助于新的声明性“mixin”功能。

mysql

  • [mysql]
    修复了反射 bug,即当 COLLATE 存在时,nullable 标志和服务器默认值不会反映出来。
    参考:#1655
  • [mysql]
    修复了 TINYINT(1) “boolean” 列的反射问题,该列使用像 UNSIGNED 这样的整数标志定义。
  • [mysql]
    进一步修复了 mysql-connector 方言。
    参考:#1668
  • [mysql]
    在 InnoDB 上的复合 PK 表中,“autoincrement”列不是第一个将在 CREATE TABLE 中发出显式的“KEY”短语,从而避免错误。
    参考:#1496
  • [mysql]
    为广泛的 MySQL 关键字增加了反射/创建表支持。
    参考:#1634
  • [mysql]
    修复了在 Windows 主机上反射表时可能发生的导入错误
    参考:#1580

sqlite

  • [sqlite]
    在  create_engine()中添加了“native_datetime=True”标志。这将导致 DATE 和 TIMESTAMP  类型跳过所有绑定参数和结果行处理,假设连接上已启用  PARSE_DECLTYPES。请注意,这与“func.current_date()”不完全兼容,它将作为字符串返回。
    参考:#1685

mssql

  • [mssql]
    重新建立了对 pymssql 方言的支持。
  • [mssql]
    隐式返回、反射等的各种修复 - MS-SQL 方言在 0.6 中还不完全(但接近了)
  • [mssql]
    增加了对 mxODBC 的基本支持。
    参考:#1710
  • [mssql]
    移除了 text_as_varchar 选项。

oracle

  • [oracle]
    ”out”参数需要一个 cx_oracle 支持的类型。如果找不到 cx_oracle 类型,将引发错误。
  • [oracle]
    Oracle  的‘DATE’现在不执行任何结果处理,因为 Oracle 中的 DATE  类型存储完整的日期+时间对象,这就是你将得到的。请注意,通用类型.Date 类型仍将在传入值上调用  value.date(),但是在反射表时,反射的类型将是‘DATE’。
  • [oracle]
    增加了对  Oracle 的 WITH_UNICODE 模式的初步支持。至少在 Python 3 中建立了与 cx_Oracle 的初始支持。在  Python 2.xx 中使用 WITH_UNICODE 模式时,会发出一个大而可怕的警告,要求用户认真考虑这种困难的操作模式。
    参考:#1670
  • [oracle]
    except_()方法现在在 Oracle 上呈现为 MINUS,这在该平台上更或多是等效的。
    参考:#1712
  • [oracle]
    增加了对渲染和反射 TIMESTAMP WITH TIME ZONE 的支持,即 TIMESTAMP(timezone=True)。
    参考:#651
  • [oracle]
    Oracle INTERVAL 类型现在可以反射。

杂项

  • [py3k]
    改进了关于 Python 3 的安装/测试设置,现在 Distribute 在 Py3k 上运行。现在包含 distribute_setup.py。请查看 README.py3k 以获取 Python 3 的安装/测试说明。
  • [engines]
    添加了一个可选的  C 扩展,通过重新实现 RowProxy 和最常见的结果处理器来加速 sql 层。实际的加速将严重依赖于您的 DBAPI  和表中使用的数据类型的混合,并且可以从 30%的改进到 200%以上不等。对于大查询,还为 ORM  速度提供了适度的(~15-20%)间接改进。请注意,默认情况下构建/安装它。请参阅 README 以获取安装说明。
  • [引擎]
    在“自动提交”场景中,在调用 DBAPI 连接上的 commit()之前,执行顺序会从游标中提取所有的 rowcount/last inserted ID 信息。这有助于 mxodbc 处理 rowcount,并且总体上可能是一个好主意。
  • [引擎]
    打开了日志记录,使得更频繁地调用 isEnabledFor(),以便在下次连接时反映引擎/池的日志级别更改。这会增加一点方法调用开销。这是可以忽略的,将使得在调用 create_engine()后配置日志记录的所有情况变得更加容易。
    参考:#1719
  • [引擎]
    assert_unicode  标志已被弃用。当要求对非 unicode Python 字符串进行编码时,SQLAlchemy 将在所有情况下引发警告,以及当显式传递一个  bytestring 给 Unicode 或 UnicodeType 类型时。String 类型对于已经接受 Python unicode  对象的 DBAPI 不会执行任何操作。
  • [引擎]
    绑定参数将作为元组而不是列表发送。一些后端驱动程序将不接受绑定参数作为列表。
  • [引擎]
    线程本地引擎在 close()时未正确关闭连接 - 已修复。
  • [引擎]
    如果事务对象不是“活动”的话,将不会回滚或提交,允许更准确地嵌套 begin/rollback/commit。
  • [引擎]
    Python unicode 对象作为绑定结果会产生 Unicode 类型,而不是字符串,从而消除了一定类别的不支持 unicode 绑定的驱动程序上的 unicode 错误。
  • [引擎]
    在  create_engine()、Pool()构造函数中添加了“logging_name”参数,以及在  create_engine()中添加了“pool_logging_name”参数,该参数过滤到 Pool  的名称。在日志消息的“name”字段中发出给定的字符串名称,而不是默认的十六进制标识符字符串。
    参考:#1555
  • [引擎]
    Dialect  的 visit_pool()方法已被移除,并替换为 on_connect()。该方法返回一个可调用对象,在每次创建原始 DBAPI  连接后接收该连接。如果非 None,则由连接策略将其组装成一个 first_connect/connect 池监听器。为方言提供了更简单的接口。
  • [引擎]
    StaticPool 现在在不打开新连接的情况下初始化、处理和重新创建 - 仅在首次请求时才打开连接。dispose()现在也适用于 AssertionPool。
    参考:#1728
  • [元数据] [票号:1673]
    通过传递“schema=None”作为参数,现在可以在使用“tometadata”时剥离模式信息。如果未指定模式,则保留表的模式。
  • [declarative]
    DeclarativeMeta 专门使用 cls.dict(而不是 dict_)作为类信息的来源;as_declarative 专门使用传递给它的 dict 作为类信息的来源(当使用 DeclarativeMeta 时,这是 cls.dict)。理论上,这应该使得自定义元类更容易修改传递给 _as_declarative 的状态。
  • [declarative]
    declarative 现在直接接受 mixin 类,作为在所有子类上提供共同功能和基于列的元素的手段,以及传播一组固定的 table_argsmapper_args 到子类的手段。对于从继承的 mixin 到本地的自定义组合 table_args/__mapper_args,现在可以使用描述符。有关所有新细节,请参阅 Declarative 文档。感谢 Chris Withers 在这方面的支持。
    参考:#1707
  • [declarative]
    在传播到子类时,mapper_args 字典被复制,并直接从类 dict 中取出,以避免从父类传播任何内容。映射器继承已经传播了您从父映射器中希望的内容。
    参考:#1393
  • [declarative]
    当单表子类指定已经存在于基类上的列时,会引发异常。
    参考:#1732
  • [sybase]
    实现了针对 Sybase 的初步工作方言,包括 Python-Sybase 和 Pyodbc 的子实现。处理表的创建/删除和基本的往返功能。目前还不包括反射或全面支持 unicode/特殊表达式等。
  • [documentation]
    在文档中进行了重要的清理工作,将类、函数和方法名称链接到 API 文档中。
    参考:#1700

orm

  • [orm]
    relation()函数的官方名称现在是 relationship(),以消除关于关系代数术语的混淆。然而,relation()将在可预见的未来保持相同的功能。
    参考:#1740
  • [orm]
    向 Mapper 添加了“version_id_generator”参数,这是一个可调用对象,给定“version_id_col”的当前值,返回下一个版本号。可用于替代版本控制方案,如 uuid、时间戳等。
    参考:#1692
  • [orm]
    向 Session.refresh()添加了“lockmode”关键字参数,将字符串值传递给 Query,与 with_lockmode()中的操作相同,还将为启用 version_id_col 的映射执行版本检查。
  • [orm]
    修复了在联合继承场景中调用 query(A).join(A.bs).add_entity(B)会将 B 重复添加为目标并生成无效查询的错误。
    参考:#1188
  • [orm]
    修复了 session.rollback()中的错误,涉及在重新整合“已删除”对象之前未从会话中移除以前“挂起”对象的问题,通常出现在自然主键上。如果它们之间存在主键冲突,那么删除的附加将在内部失败。以前“挂起”的对象现在首先被清除。
    参考:#1674
  • [orm]
    移除了很多没有人真正关心的日志记录,保留的日志记录将响应日志级别的实时更改。不会增加显著的开销。
    参考:#1719
  • [orm]
    修复了 session.merge()中阻止类似字典的集合合并的错误。
  • [orm]
    session.merge()与明确不包括“merge”在其级联选项中的关系一起工作-目标完全被忽略。
  • [orm]
    如果目标具有该属性的值,则 session.merge()不会使现有目标上的现有标量属性过期,即使传入的合并没有该属性的值。这可以避免对现有项目进行不必要的加载。但是,如果目标没有该属性,它仍将标记为过期,这可以满足延迟列的某些约定。
    参考:#1681
  • [orm]
    “allow_null_pks”标志现在称为“allow_partial_pks”,默认为 True,像 0.5 中一样起作用。但是,如果标志为 False,则在 merge()中实现了这一点,对于具有部分 NULL 主键的传入实例不会发出 SELECT。
    参考:#1680
  • [orm]
    修复了 0.6 重做的“多对一”优化中的错误,使得针对远程表上的非主键列(即针对唯一列的外键)的多对一在更改时会从数据库中拉取“旧”值,因为如果它在会话中,我们将需要它进行正确的历史/反向引用计算,并且在非主键列上无法从本地标识映射中拉取。
    参考:#1737
  • [orm]
    修复了在单表继承关系上调用 has()或类似复杂表达式时可能出现的内部错误。
    参考:#1731
  • [orm]
    query.one()不再对查询应用  LIMIT,以确保它完全计算结果中存在的所有对象标识,即使在连接可能隐藏两个或更多行的多个标识的情况下也是如此。作为奖励,现在也可以使用从  from_statement()发出的查询调用 one(),因为它不再修改查询。
    参考:#1688
  • [orm]
    现在,如果查询一个在标识映射中具有不同类的标识符,即在使用多态加载时,query.get()会返回 None。
    参考:#1727
  • [orm]
    在 query.join()中进行了一个重大修复,当“on”子句是 aliased()构造的属性时,但已经存在一个指向兼容目标的现有连接时,query 会正确地连接到正确的 aliased()构造,而不是粘附到现有连接的右侧。
    参考:#1706
  • [orm]
    对于不发出不必要的更新主键列的修复进行了轻微改进,即在所谓的“行切换”操作期间,即两个具有相同 PK 的对象的添加+删除。
    参考:#1362
  • [orm]
    现在,当由于对象与任何会话分离而导致属性加载或刷新操作失败时,会使用 sqlalchemy.orm.exc.DetachedInstanceError。UnboundExecutionError 特定于绑定到会话和语句的引擎。
  • [orm]
    在表达式上调用的 Query 将在所有情况下呈现消除歧义的标签。请注意,这不适用于现有的.statement 和.subquery()访问器/方法,它仍然遵循默认为 False 的.with_labels()设置。
  • [orm]
    Query.union()在返回的语句中保留了消除歧义的标签,从而避免了由于列名冲突而导致的各种 SQL 组合错误。
    参考:#1676
  • [orm]
    修复了属性历史中的错误,无意中调用了映射实例上的 eq
  • [orm]
    对对象加载进行了一些内部优化,为大结果提供了一点速度提升,估计在 10-15%左右。对“state”内部进行了彻底的清理,减少了复杂性,数据成员,方法调用,空字典的创建。
  • [orm]
    对 query.delete()进行了文档澄清
    参考:#1689
  • [orm]
    修复了 many-to-one relation()中的级联 bug,当属性设置为 None 时,在 r6711 中引入(在 add()期间将删除的项目级联到会话中)。
  • [orm]
    在调用  query.select_from()、query.with_polymorphic()或  query.from_statement()之前调用 query.order_by()或  query.distinct()现在会引异常,而不是悄悄地丢弃这些条件。
    参考:#1736
  • [orm]
    现在,如果查询返回多行,query.scalar()会引发异常。所有其他行为保持不变。
    参考:#1735
  • [orm]
    修复了一个 bug,当 version_id_col 在使用时,“行切换”逻辑失败,即 INSERT 和 DELETE 被 UPDATE 替换。
    参考:#1692

示例

  • [examples]
    稍微修改了 beaker 缓存示例,为 lazyload 缓存添加了一个单独的 RelationCache 选项。这个对象通过将几个潜在属性分组到一个公共结构中,更有效地进行查找。FromCache 和 RelationCache 两者单独来说更简单。

sql

  • [sql]
    join()现在默认模拟 NATURAL JOIN。这意味着,如果左侧是一个连接,它将尝试首先将右侧连接到左侧的最右侧,并且如果成功,即使在左侧的其余部分有更多的连接目标,也不会引发任何关于模糊连接条件的异常。
    参考:#1714
  • [sql]
    最常见的结果处理器转换函数已移至新的“processors”模块。鼓励方言作者在需要时使用这些函数,而不是实现自定义函数。
  • [sql]
    SchemaType 和其子类 Boolean、Enum 现在是可序列化的,包括它们的 ddl 监听器和其他事件可调用对象。
    参考:#1694, #1698
  • [sql]
    现在,某些平台将解释某些文字值为非绑定参数,直接呈现到  SQL 语句中。这是为了支持一些平台(包括 MS-SQL 和 Sybase)强制执行的严格 SQL-92 规则。在这种模式下,不允许在  SELECT  的列子句中使用绑定参数,也不允许使用诸如“?=?”之类的模糊表达式。当启用此模式时,基本编译器将把绑定呈现为内联文字,但仅限于字符串和数值。其他类型如日期将引发错误,除非方言子类为其定义了文字呈现函数。绑定参数必须已经嵌入文字值,否则将引发错误(即不适用于直接  bindparam(‘x’))。方言还可以扩展绑定不被接受的领域,例如在函数的参数列表中(当使用本地 SQL 绑定时,在 MS-SQL  上不起作用)。
  • [sql]
    在 String、Unicode  等中添加了“unicode_errors”参数。其行为类似于标准库的  string.decode()函数的‘errors’关键字参数。此标志要求将 convert_unicode 设置为“force” -  否则,SQLAlchemy 不能保证处理 Unicode 转换的任务。请注意,对于已经原生返回 Unicode 对象的后端(大多数 DBAPI  都是如此),此标志会给行提取操作增加显著的性能开销。此标志应仅在从具有不同或损坏编码的列中读取字符串时使用,这仅适用于首先接受无效编码的数据库(即  MySQL。不是PG、Sqlite 等)。
  • [sql]
    添加了数学否定运算符支持,-x。
  • [sql]
    FunctionElement 子类现在可以直接执行,与任何 func.foo() 结构一样,当传递给 execute() 时会自动应用 SELECT。
  • [sql]
    func.foo() 结构的“type”和“bind”关键字参数现在仅局限于“func.” 结构,并不属于 FunctionElement 基类,允许在自定义构造函数或类级别变量中处理“type”。
  • [sql]
    恢复了 ResultProxy 的 keys() 方法。
  • [sql]
    现在,类型/表达式系统在确定表达式的返回类型以及将  Python 运算符转换为 SQL 运算符方面做得更完整了,基于给定表达式的完整左/右/运算符。特别是为 PostgreSQL 中的  EXTRACT 创建的日期/时间/间隔系统现在已经泛化为类型系统。以前经常发生的“列 +  文字”的表达式强制“文字”的类型与“列”的类型相同的行为现在通常不会发生 - “文字”的类型首先从文字的 Python  类型推导出来,假设标准的原生 Python 类型 + 日期类型,然后再回退到表达式另一侧已知类型的类型。如果“回退”类型兼容(即来自  String 的 CHAR),则文字一侧将使用该类型。TypeDecorator 类型默认覆盖此行为,无条件地强制“文字”一侧,这可以通过实现  coerce_compared_value() 方法来更改。也是其中的一部分。
    参考资料:#1647#1683
  • [sql]
    使  sqlalchemy.sql.expressions.Executable 成为公共 API 的一部分,用于可以发送到 execute()  的任何表达式构造。FunctionElement 现在继承 Executable,以便获得  execution_options(),这些选项也传播到 execute() 中生成的 select()。Executable 又继承了  _Generative,标记了任何支持 @_generative 装饰器的 ClauseElement -  这些也可能在某些时候成为编译器扩展的“公共”部分。
  • [sql]
    解决方案的变更为 - 一个端用户定义的绑定参数名称,它直接与来自 update/insert 的 SET 或 VALUES 子句生成的列命名绑定发生冲突时,将生成编译错误。这减少了调用次数,并消除了一些仍可能发生不良名称冲突的情况。
    参考资料:#1579
  • [sql]
    如果 Column() 没有外键,则需要类型(这不是新内容)。如果 Column() 没有类型和外键,则现在会引发错误。
    参考资料:#1705
  • [sql]
    Numeric() 类型的“scale”参数在将返回的浮点值转换为 Decimal 的字符串时被尊重 - 这允许 SQLite、MySQL 上的准确性工作。
    参考资料:#1717
  • [sql]
    Column 的 copy()方法现在会复制未初始化的“on table attach”事件。有助于新的声明性“mixin”功能。

mysql

  • [mysql]
    修复了反射错误,即当 COLLATE 存在时,nullable 标志和服务器默认值不会被反映。
    参考:#1655
  • [mysql]
    修复了反射 TINYINT(1)“boolean”列时定义为 UNSIGNED 的整数标志的问题。
  • [mysql]
    进一步修复了 mysql-connector 方言的问题。
    参考:#1668
  • [mysql]
    在 InnoDB 上的复合主键表中,“autoincrement”列不是第一个将在 CREATE TABLE 中发出显式的“KEY”短语,从而避免错误。
    参考:#1496
  • [mysql]
    为许多 MySQL 关键字添加了反射/创建表支持。
    参考:#1634
  • [mysql]
    修复了在 Windows 主机上反射表时可能发生的导入错误。
    参考:#1580

sqlite

  • [sqlite]
    添加了“native_datetime=True”标志到  create_engine()。这将导致 DATE 和 TIMESTAMP 类型跳过所有绑定参数和结果行处理,假设连接上已启用  PARSE_DECLTYPES。请注意,这与“func.current_date()”不完全兼容,它将返回一个字符串。
    参考:#1685

mssql

  • [mssql]
    重新支持了 pymssql 方言。
  • [mssql]
    隐式返回、反射等方面的各种修复 - MS-SQL 方言在 0.6 版本中还不完全(但接近完成)
  • [mssql]
    添加了对 mxODBC 的基本支持。
    参考:#1710
  • [mssql]
    移除了 text_as_varchar 选项。

oracle

  • [oracle]
    ”out”参数需要 cx_oracle 支持的类型。如果找不到 cx_oracle 类型,将引发错误。
  • [oracle]
    Oracle 的‘DATE’现在不执行任何结果处理,因为 Oracle 中的 DATE 类型存储完整的日期+时间对象,这就是你将得到的。请注意,通用类型 Date 类型仍然会在传入值上调用 value.date()。在反射表时,反射的类型将是‘DATE’。
  • [oracle]
    添加了对  Oracle 的 WITH_UNICODE 模式的初步支持。至少这为 Python 3 中的 cx_Oracle 建立了初始支持。在  Python 2.xx 中使用 WITH_UNICODE 模式时,会发出一个大而可怕的警告,要求用户认真考虑这种困难的操作模式的使用。
    参考:#1670
  • [oracle]
    在 Oracle,except_()方法现在呈现为 MINUS,这在该平台上更或多或少是等效的。
    参考:#1712
  • [oracle]
    添加了对渲染和反射 TIMESTAMP WITH TIME ZONE 的支持,即 TIMESTAMP(timezone=True)。
    参考:#651
  • [oracle]
    Oracle INTERVAL 类型现在可以反射。

杂项

  • [py3k]
    改进了关于 Python 3 的安装/测试设置,现在 Distribute 在 Py3k 上运行。distribute_setup.py 现在已包含在内。请参阅 README.py3k 以获取 Python 3 安装/测试说明。
  • [engines]
    添加了一个可选的  C 扩展,通过重新实现 RowProxy 和最常见的结果处理器来加速 sql 层。实际的加速将严重依赖于您的 DBAPI  和表中使用的数据类型的混合,并且可以从 30%的改进到 200%以上的变化。对于大查询,它还为 ORM  速度提供了适度的(~15-20%)间接改进。请注意,默认情况下构建/安装它。请参阅 README 以获取安装说明。
  • [engines]
    在“自动提交”场景中,在调用 DBAPI 连接上的 commit()之前,执行顺序会从游标中提取所有 rowcount/最后插入的 ID 信息。这有助于 mxodbc 处理 rowcount,并且总体上可能是一个好主意。
  • [engines]
    打开了日志记录,使得更频繁地调用 isEnabledFor(),以便在下次连接时反映引擎/池的日志级别更改。这会增加一点方法调用开销。这是微不足道的,将使得在调用 create_engine()之后配置日志记录变得更加容易。
    参考:#1719
  • [engines]
    assert_unicode  标志已被弃用。在所有要求对非 Unicode Python 字符串进行编码的情况下,SQLAlchemy 都会发出警告,以及当 Unicode  或 UnicodeType 类型明确传递了字节字符串时。String 类型对于已经接受 Python unicode 对象的 DBAPI  不会执行任何操作。
  • [engines]
    绑定参数被发送为元组而不是列表。一些后端驱动程序将不接受绑定参数作为列表。
  • [engines]
    threadlocal 引擎在 close()时没有正确关闭连接 - 已修复。
  • [engines]
    如果事务对象不是“活动”的话,就不会回滚或提交,允许更准确地嵌套 begin/rollback/commit。
  • [engines]
    Python unicode 对象作为绑定结果会产生 Unicode 类型,而不是字符串,从而消除了一定类别的不支持 Unicode 绑定的驱动程序上的 Unicode 错误。
  • [engines]
    在 create_engine()、Pool()构造函数以及 create_engine()中添加了“logging_name”参数,该参数会过滤到 Pool 的名称。在日志消息的“name”字段中发出给定的字符串名称,而不是默认的十六进制标识符字符串。
    参考:#1555
  • [engines]
    Dialect  的 visit_pool() 方法已被移除,并替换为 on_connect()。此方法返回一个可调用对象,在每次创建原始 DBAPI  连接后接收该连接。如果非 None,则该可调用对象将被连接策略组装成一个 first_connect/connect  池监听器。为方言提供了更简单的接口。
  • [engines]
    StaticPool 现在在不打开新连接的情况下初始化、释放和重新创建 - 只有在首次请求时才会打开连接。dispose() 现在也适用于 AssertionPool。
    参考:#1728
  • [metadata] [ticket: 1673]
    添加了在使用“tometadata”时剥离模式信息的能力,通过传递“schema=None”作为参数。如果未指定模式,则保留表的模式。
  • [declarative]
    DeclarativeMeta 专门使用 cls.dict(而不是 dict_)作为类信息的来源;as_declarative 专门使用传递给它的 dict 作为类信息的来源(当使用 DeclarativeMeta 时是 cls.dict)。理论上,这应该使得自定义元类更容易修改传递给 _as_declarative 的状态。
  • [declarative]
    declarative 现在直接接受 mixin 类,作为在所有子类上提供常见功能和基于列的元素的手段,以及传播一组固定的 table_argsmapper_args 到子类的手段。对于从继承的 mixin 到本地的自定义组合的 table_args/mapper_args,现在可以使用描述符。有关所有新细节,请参阅 Declarative 文档。感谢 Chris Withers 在这面的支持。
    参考:#1707
  • [declarative]
    在传播到子类时,mapper_args 字典被复制,并直接从类 dict 中取出,以避免从父类传播。映射器继承已经传播了您从父映射器中想要的内容。
    参考:#1393
  • [declarative]
    当单表子类指定已经存在于基类上的列时,会引发异常。
    参考:#1732
  • [sybase]
    实现了一个初步可用的 Sybase 方言,包括 Python-Sybase 和 Pyodbc 的子实现。处理表的创建/删除和基本的往返功能。尚未包括反射或全面支持 unicode/特殊表达式等。
  • [documentation]
    在文档中进行了重大清理工作,将类、函数和方法名称链接到 API 文档中。
    参考:#1700

0.6beta1

发布日期:2010 年 2 月 3 日 星期三

orm

  • [orm]query.update() 和 query.delete() 的更改:
  • query.update() 上的 ‘expire’ 选项已重命名为 ‘fetch’,与 query.delete() 的匹配。‘expire’ 已被弃用并发出警告。
  • query.update()和 query.delete()在同步策略上默认为“evaluate”。
  • 对于 update()和 delete()的“同步”策略在失败时会引发错误。没有隐式回退到“fetch”。评估的失败基于条件的结构,因此成功/失败是基于代码结构的确定性。
  • [orm]多对一关系的增强:
  • 多对一关系现在在更少的情况下触发延迟加载,包括在大多数情况下,当替换新值时不会获取“旧”值。
  • 多对一关系到一个连接表子类现在使用 get()进行简单加载(称为“use_get”条件),即 Related->Sub(Base),无需重新定义基表的主连接条件。
  • 使用声明性列指定外键,即 ForeignKey(MyRelatedClass.id)不会破坏“use_get”条件的发生
  • relation(),eagerload()和  eagerload_all()现在具有一个名为“innerjoin”的选项。指定 True 或 False  以控制急切连接是构建为内连接还是外连接。默认始终为 False。映射器选项将覆盖  relation()上指定的任何设置。通常应为多对一,非空外键关系设置,以允许改进的连接性能。
  • 急切加载的行为,即当 LIMIT/OFFSET 存在时,主查询被包装在子查询中,现在对所有急切加载都是多对一连接的情况做了一个例外。在这些情况下,急切连接直接针对父表进行,同时具有限制/偏移量,而不会增加子查询的额外开销,因为多对一连接不会向结果添加行。
  • 参考:#1186, #1492, #1544
  • [orm]
    Session.merge()的增强/更改:
  • [orm]
    “dont_load=True”标志在 Session.merge()上已被弃用,现在是“load=False”。
  • [orm]
    Session.merge()经过性能优化,在“load=False”模式下调用次数减少一半,与 0.5 相比,在“load=True”模式下在集合的情况下显著减少 SQL 查询。
  • [orm]
    如果给定实例与已经存在的实例相同,则 merge()不会发出属性的不必要合并。
  • [orm]
    merge()现在还会合并与给定状态相关联的“options”,即通过 query.options()传递的那些随实例一起传递的选项,例如急切加载或懒加载各种属性的选项。这对于构建高度集成的缓存方案至关重要。这与 0.5 版本相比是一个微妙的行为变化。
  • [orm]
    修复了关于实例状态上存在的“loader path”序列化的错误,这在将 merge()与序列化状态和应保留的相关选项结合使用时也是必要的。
  • [orm]
    全新的 merge()在一个新的全面示例中展示了如何将 Beaker 与 SQLAlchemy 集成。请参见下面的“examples”注释中的说明。
  • [orm]
    现在可以在联接表继承对象上更改主键值,并且在刷新时将考虑 ON UPDATE CASCADE。在使用 SQLite 或 MySQL/MyISAM 时,在 mapper()上设置新的“passive_updates”标志为 False。
    参考:#1362
  • [orm]
    flush()现在可以检测到主键列是否被另一个主键的  ON UPDATE CASCADE 操作更新,并且可以在刷新时定位用于对新 PK 值进行后续 UPDATE 的行。当存在  relation()以建立关系并且 passive_updates=True 时会发生这种情况。
    参考:#1671
  • [orm]
    “save-update”级联现在将挂起的已移除值级联到新会话中的 add()操作中。这样,flush()操作也将删除或修改这些断开连接项目的行。
  • [orm]
    使用“dynamic”加载器与“secondary”表现在会产生一个查询,其中“secondary”表不被别名化。这允许在 relation()的“order_by”属性中使用 secondary Table 对象,并且还允许在动态关系的筛选条件中使用它。
    参考:#1531
  • [orm]
    当 relation()的 uselist=False 在急切或延迟加载中找到多个有效值时,将发出警告。这可能是由于不适合急切 LEFT OUTER JOIN 或其他条件的 primaryjoin/secondaryjoin 条件造成的。
    参考:#1643
  • [orm]
    当 synonym()与 map_column=True 一起使用时,会显式检查是否在与相同键名一起发送到 mapper 的属性字典中存在单独的 ColumnProperty(延迟或其他)。而不是默默地替换现有属性(以及可能在该属性上的选项),会引发错误。
    参考:#1633
  • [orm]
    “dynamic”加载器在构造时设置其查询条件,以便从非克隆访问器(如“statement”)返回实际查询。
  • [orm]
    迭代 Query()时返回的“named tuple”对象现在是可 pickle 的。
  • [orm]
    映射到 select()构造现在要求您将其明确地制作为别名()。这是为了消除对诸如
    参考:#1542
  • [orm]
    query.join()已经重新设计,以提供更一致的行为和更多的灵活性(包括)
    参考:#1537
  • [orm]
    query.select_from() 接受多个子句以在 FROM 子句中产生多个逗号分隔的条目。在从多个 join()子句选择时非常有用。
  • [orm]
    query.select_from() 也接受映射类、别名构造和映射器作为参数。特别是在从多个连接表类查询时,确保完整连接被渲染时非常有用。
  • [orm]
    query.get() 可以与映射到外连接的情况一起使用,其中一个或多个主键值为 None。
    参考:#1135
  • [orm]
    query.from_self(),  query.union(), 其他执行“SELECT * from  (SELECT…)”类型嵌套的操作将更好地将子查询中的列表达式转换为外部查询的列子句。这可能与 0.5  版本不兼容,因为这可能会破坏没有应用标签的文字表达式的查询(即 literal(‘foo’), 等等)。
    参考:#1568
  • [orm]
    主连接和次连接现在检查它们是否是列表达式,而不仅仅是子句元素。这禁止了直接在那里放置 FROM 表达式等情况。
    参考:#1622
  • [orm]
    expression.null() 在使用 query.filter()、filter_by()等方法时与 None 的比较方式完全相同。
    参考:#1415
  • [orm]
    添加了“make_transient()”辅助函数,将持久化/分离实例转换为瞬态实例(即删除实例键并从任何会话中移除)。
    参考:#1052
  • [orm]
    mapper()上的 allow_null_pks 标志已被弃用,并且该功能默认为“on”。这意味着对于任何主键列具有非空值的行将被视为标识。通常只有在映射到外连接时才会出现这种情况。
    参考:#1339
  • [orm]
    “backref”的机制已完全合并到更精细的“back_populates”系统中,并完全在  RelationProperty 的 _generate_backref()方法中进行。这使得 RelationProperty  的初始化过程更简单,允许更容易地将设置(例如从 RelationProperty 的子类)传播到反向引用中。内部的  BackRef()已经消失,backref()返回一个普通元组,RelationProperty 能够理解。
  • [orm]
    mapper()上的 version_id_col 功能在使用不充分支持“rowcount”的方言时将引发警告。
    参考:#1569
  • [orm]
    在  Query 中添加了“execution_options()”,以便将选项传递给生成的语句。目前只有 Select  语句有这些选项,而且唯一使用的选项是“stream_results”,唯一知道“stream_results”的方言是 psycopg2。
  • [orm]
    Query.yield_per()将自动设置“stream_results”语句选项。
  • [orm]已弃用或移除:
  • mapper()上的‘allow_null_pks’标志已被弃用。现在它不起作用,设置在所有情况下都是“on”。
  • sessionmaker()和其他地方的“transactional”标志已移除。使用‘autocommit=True’表示‘transactional=False’。
  • mapper()中的‘polymorphic_fetch’参数已移除。加载可以通过‘with_polymorphic’选项进行控制。
  • mapper()中的‘select_table’参数已移除。使用‘with_polymorphic=(“*”, )’来实现此功能。
  • synonym()中的‘proxy’参数已移除。此标志在 0.5 版本中没有任何作用,因为“proxy generation”行为现在是自动的。
  • eagerload()eagerload_all()contains_eager()lazyload()defer()undefer()传递单个元素列表而不是多个位置参数已被弃用。
  • query.order_by()query.group_by()query.join()query.outerjoin()传递单个元素列表而不是多个位置参数已被弃用。
  • 除了 query.iterate_instances()。使用 query.instances()。
  • 移除了 Query.query_from_parent()。使用 sqlalchemy.orm.with_parent()函数生成“parent”子句,或者使用 query.with_parent()。
  • 移除了 query._from_self(),请改用 query.from_self()。
  • composite()中的“comparator”参数已移除。使用“comparator_factory”。
  • 移除了 RelationProperty._get_join()。
  • Session 上的‘echo_uow’标志已移除。在“sqlalchemy.orm.unitofwork”名称上记录日志。
  • 移除了 session.clear()。使用 session.expunge_all()。
  • 移除了 session.save()、session.update()、session.save_or_update()。使用 session.add()和 session.add_all()。
  • session.flush()上的“objects”标志仍然被弃用。
  • session.merge()上的“dont_load=True”标志已被弃用,改用“load=False”。
  • ScopedSession.mapper 仍然被弃用。请参阅www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper中的用法示例。
  • 将 InstanceState(内部 SQLAlchemy 状态对象)传递给 attributes.init_collection()或 attributes.get_history()已被弃用。这些函数是公共 API,通常期望一个常规映射对象实例。
  • declarative_base()中的‘engine’参数已移除。使用‘bind’关键字参数。

sql

  • [sql]
    select()和  text()上的“autocommit”标志以及 select().autocommit()已被弃用 -  现在在这些构造上调用.execution_options(autocommit=True),也可以直接在 Connection 和  orm.Query 上使用。
  • [sql]
    现在,列上的 autoincrement 标志表示应链接到 cursor.lastrowid 的列,如果使用该方法。有关详细信息,请参阅 API 文档。
  • [sql]
    现在,executemany()要求所有绑定参数集中都要包含第一个绑定参数集中存在的所有键。插入/更新语句的结构和行为在很大程度上由第一个参数集确定,包括哪些默认值将触发,并且对其余所有参数不进行最少的猜测,以确保不影响性能。因此,否则默认值会对缺少的参数“失败”,因此现在已经防范。
    参考:#1566
  • [sql]
    returning()支持原生于  insert()、update()、delete()。对于 PostgreSQL、Firebird、MSSQL 和  Oracle,存在不同功能级别的实现。returning()可以显式调用列表达式,然后通过 fetchone()或  first()通常返回结果集。
    insert()构造还将隐式使用 RETURNING 来获取新生成的主键值,如果正在使用的数据库版本支持它(执行版本号检查)。如果没有指定最终用户 returning(),则会发生这种情况。
  • [sql]
    union()、intersect()、except()和其他“复合”类型的语句在括号方面具有更一致的行为。现在,嵌入在另一个中的每个复合元素将使用括号分组  - 以前,列表中的第一个复合元素不会被分组,因为 SQLite 不喜欢以括号开头的语句。然而,特别是 PostgreSQL 对于  INTERSECT 有优先规则,对于所有子元素应用括号更一致。因此,现在,SQLite 的解决方法也是以前 PG 的解决方法 -  在嵌套复合元素时,通常需要对第一个元素调用“.alias().select()”以将其包装在子查询中。
    参考:#1665
  • [sql]
    insert()和 update()构造现在可以使用与列键匹配的名称嵌入 bindparam()对象。这些绑定参数将绕过通常的路径,使这些键出现在生成的 SQL 的 VALUES 或 SET 子句中。
    参考:#1579
  • [sql]
    Binary 类型现在将数据作为 Python 字符串(或 Python 3 中的“bytes”类型)返回,而不是内置的“buffer”类型。这允许二进制数据进行对称往返。
    参考:#1524
  • [sql]
    添加了一个 tuple_()构造,允许将一组表达式与另一组进行比较,通常使用 IN 针对复合主键或类似的情况。还接受具有多个列的 IN。删除了“标量选择只能有一列”错误消息 - 将依赖数据库报告列不匹配的问题。
  • [sql]
    用户定义的“default”和“onupdate”可调用函数现在应该调用“context.current_parameters”来获取当前正在处理的绑定参数字典。无论是单次执行还是 executemany-style 语句执行,这个字典都以相同的方式可用。
  • [SQL]
    多部分模式名称,例如带有点号的“dbo.master”,现在在 select()标签中用下划线代替点号,即“dbo_master_table_column”。这是一个在结果集中表现更好的“友好”标签。
    参考:#1428
  • [SQL]
    移除了不必要的“counter”行为,即对于与表中列名匹配的   select()标签名生成“tablename_id”而不是“tablename_id_1”,以避免命名冲突,当表中实际上有一个名为“tablename_id”的列时  - 这是因为标签逻辑总是应用于所有列,因此永远不会发生命名冲突。
  • [SQL]
    调用 expr.in_([]),即使用空列表,会在发出通常的“expr != expr”子句之前发出警告。 “expr != expr”可能非常昂贵,最好是如果列表为空,则用户不发出 in_(),而是简单地不查询,或根据更复杂的情况修改条件。
    参考:#1628
  • [SQL]
    为 select()/text()添加了“execution_options()”,用于设置 Connection 的默认选项。请参见“engines”中的说明。
  • [SQL]已弃用或移除:
  • select()上的“scalar”标志已移除,使用 select.as_scalar()。
  • 在 bindparam()上的“shortname”属性已移除。
  • insert(),update(),delete()上的 postgres_returning,firebird_returning 标志已弃用,使用新的 returning()方法。
  • join 上的 fold_equivalents 标志已弃用(将保留直到实现)

模式

  • [模式]
    MetaData 的 contains()方法现在接受字符串或 Table 对象作为参数。如果给定一个 Table,则首先将参数转换为 table.key,即“[schemaname.]”
    参考:#1541
  • [模式]
    移除了不推荐使用的 MetaData.connect()和 ThreadLocalMetaData.connect() - 将“bind”属性发送到绑定元数据。
  • [模式]
    移除了不推荐使用的 metadata.table_iterator()方法(使用 sorted_tables)
  • [模式]
    不推荐使用 PassiveDefault - 使用 DefaultClause。
  • [模式]
    DefaultGenerator 及其子类中移除了“metadata”参数,但在 Sequence 上仍然存在,Sequence 是 DDL 中的一个独立构造。
  • [模式]
    从 Index 和 Constraint 对象中移除了公共可变性:
  • ForeignKeyConstraint.append_element()

  • Index.append_column()

  • UniqueConstraint.append_column()

  • PrimaryKeyConstraint.add()

  • PrimaryKeyConstraint.remove()
  • 这些应该以声明性的方式构建(即在一个构造中)。
  • [模式]
    Sequence 上的 “start” 和 “increment” 属性现在默认生成 “START WITH” 和 “INCREMENT BY”,在 Oracle 和 PostgreSQL 上。Firebird 目前不支持这些关键字。
    参:#1545
  • [schema]
    UniqueConstraint、Index、PrimaryKeyConstraint 都接受列名或列对象的列表作为参数。
  • [schema]其他已移除的内容:
  • Table.key(不知道这是用来做什么的)
  • Table.primary_key 不可分配 - 使用 table.append_constraint(PrimaryKeyConstraint(…))
  • Column.bind(通过 column.table.bind 获取)
  • Column.metadata(通过 column.table.metadata 获取)
  • Column.sequence(使用 column.default)
  • ForeignKey(constraint=some_parent)(现在是私有 _constraint)
  • [schema]
    ForeignKey 上的 use_alter 标志现在是一个快捷选项,用于可以使用 DDL() 事件系统手动构建的操作。这次重构的副作用是,具有 use_alter=True 的 ForeignKeyConstraint 对象将 不会 在 SQLite 上发出,因为 SQLite 不支持外键的 ALTER。
  • [schema]
    ForeignKey 和 ForeignKeyConstraint 对象现在正确地复制所有它们的公共关键字参数。
    参考:#1605

postgresql

  • [postgresql]
    新的方言:pg8000、zxjdbc 和 pypostgresql 在 py3k 上。
  • [postgresql]
    “postgres” 方言现在更名为 “postgresql”!连接字符串如下:

postgresql://scott:tiger@localhost/test postgresql+pg8000://scott:tiger@localhost/test

“postgres” 名称仍然保留以确保向后兼容性,具体如下:

  • 存在一个“postgres.py”虚拟方言,允许旧的 URL 正常工作,即 postgres://scott:tiger@localhost/test

  • “postgres”  名称可以从旧的 “databases” 模块中导入,即 “from sqlalchemy.databases import  postgres”,以及 “dialects”,“from sqlalchemy.dialects.postgres import base  as pg”,将发出弃用警告。

  • 特殊表达式参数现在命名为 “postgresql_returning” 和 “postgresql_where”,但旧的 “postgres_returning” 和 “postgres_where” 名称仍然可以使用,会发出弃用警告。
  • [postgresql]
    ”postgresql_where” 现在接受 SQL 表达式,这些表达式也可以包含文字,需要时会加上引号。
  • [postgresql]
    psycopg2  方言现在在所有新连接上使用 psycopg2 的 “unicode extension”,这允许所有 String/Text  等类型跳过将字节字符串后处理为 Unicode 的步骤(由于其数量大,这是一个昂贵的步骤)。其他本地返回 Unicode  的方言(pg8000、zxjdbc)也跳过 Unicode 后处理。
  • [postgresql]
    添加了新的 ENUM 类型,作为一个模式级别的构造,并扩展了通用的 Enum 类型。自动与表及其父元数据关联,根据需要发出适当的 CREATE TYPE/DROP TYPE 命令,支持 Unicode 标签,支持反射。
    参考:#1511
  • [postgresql]
    INTERVAL 支持一个可选的“precision”参数,对应 PG 接受的参数。
  • [postgresql]
    使用新的 dialect.initialize() 功能来设置版本相关的行为。
  • [postgresql]
    对于表/列名称中的 % 符号提供了更好的支持;然而 psycopg2 无法处理绑定参数名为 %(foobar)s 的情况,SQLA 不想增加开销来处理这种不存在的用例。
    参考:#1279
  • [postgresql]
    向主键 + 外键列插入 NULL 将允许“非空约束”错误引发,而不是尝试执行不存在的“col_id_seq”序列。
    参考:#1516
  • [postgresql]
    自增 SELECT 语句,即从修改行的过程中选择的语句,现在可以与服务器端游标模式一起工作(命名游标不用于这种语句。)
  • [postgresql]
    postgresql 方言现在可以正确识别 pg 的“devel”版本字符串,例如“8.5devel”
    参考:#1636
  • [postgresql]
    psycopg2  现在尊重语句选项“stream_results”。此选项会覆盖连接设置“server_side_cursors”。如果为  true,则语句将使用服务器端游标。如果为 false,则不会使用,即使连接上的“server_side_cursors”为 true。
    参考:#1619

mysql

  • [mysql]
    新的方言:oursql,一个新的本地方言,MySQL Connector/Python,MySQLdb 的本地 Python 移植,当然还有 Jython 上的 zxjdbc。
  • [mysql]
    VARCHAR/NVARCHAR 如果没有长度将无法渲染,在传递给 MySQL 之前会引发错误。不影响 CAST,因为在 MySQL CAST 中不允许 VARCHAR,在这种情况下方言会渲染 CHAR/NCHAR。
  • [mysql]
    所有 _detect_XXX() 函数现在在 dialect.initialize() 下运行一次
  • [mysql]
    对于表/列名称中的 % 符号提供了更好的支持;当使用 executemany() 时,MySQLdb 无法处理 SQL 中的 % 符号,SQLA 不想增加开销来处理这种不存在的用例。
    参考:#1279
  • [mysql]
    BINARY 和 MSBinary 类型现在在所有情况下生成“BINARY”。省略“length”参数将生成没有长度的“BINARY”。使用 BLOB 来生成一个无长度的二进制列。
  • [mysql]
    MSEnum/ENUM 的“quoting=‘quoted’”参数已被弃用。最好依赖自动引用。
  • [mysql]
    ENUM 现在是新的通用 Enum 类型的子类,并且如果给定的标签名是 unicode 对象,还会隐式处理 unicode 值。
  • [mysql]
    如果未传递“nullable=False”给  Column(),并且没有默认值,则 TIMESTAMP 类型的列现在默认为 NULL。这与所有其他类型保持一致,并且在 TIMESTAMP  的情况下明确渲染为“NULL”,因为 MySQL 对 TIMESTAMP 列的默认可空性进行了“切换”。
    参考:#1539

sqlite

  • [sqlite]
    DATE、TIME 和 DATETIME 类型现在可以使用可选的 storage_format 和 regexp 参数。storage_format 可以用于使用自定义字符串格式存储这些类型。regexp 允许使用自定义正则表达式来匹配数据库中的字符串值。
  • [sqlite]
    时间和日期时间类型现在默认使用更严格的正则表达式来匹配数据库中的字符串。如果使用存储在传统格式中的数据,请使用 regexp 参数。
  • [sqlite]
    SQLite 时间和日期时间类型上的 legacy_microseconds 不再受支持。您应该使用 storage_format 参数代替。
  • [sqlite]
    日期、时间和日期时间类型现在在接受绑定参数方面更加严格:日期类型只接受日期对象(以及日期时间对象,因为它们继承自日期),时间类型只接受时间对象,日期时间类型只接受日期和日期时间对象。
  • [sqlite]
    Table() 支持一个关键字参数“sqlite_autoincrement”,在生成 DDL 时将 SQLite 关键字“AUTOINCREMENT”应用于单个整数主键列。将阻止生成单独的 PRIMARY KEY 约束。
    参考:#1016

mssql

  • [mssql]
    MSSQL + Pyodbc + FreeTDS 现在在很大程度上可以正常工作,可能会有关于二进制数据以及 Unicode 模式标识符的异常情况。
  • [mssql]
    “has_window_funcs”标志已被移除。LIMIT/OFFSET  的使用将像以往一样使用 ROW NUMBER,如果在较旧版本的 SQL Server 上,则操作将失败。行为完全相同,只是错误由 SQL  Server 而不是方言引发,不需要设置标志来启用它。
  • [mssql]
    “auto_identity_insert”标志已被移除。当 INSERT 语句覆盖已知具有序列的列时,此功能始终生效。与“has_window_funcs”一样,如果底层驱动程序不支持此功能,则无论如何都无法执行此操作,因此没有设置标志的必要。
  • [mssql]
    使用新的 dialect.initialize() 功能来设置版本相关的行为。
  • [mssql]
    移除了不再使用的序列引用。在 MSSQL 中,隐式标识与其他方言上的隐式序列相同。通过使用“default=Sequence()”启用显式序列。有关更多信息,请参阅 MSSQL 方言文档。

oracle

  • [oracle]
    使用 cx_oracle 进行的单元测试全部通过!
  • [oracle]
    支持 cx_Oracle 的“本地 Unicode”模式,不需要设置 NLS_LANG。请使用最新的 5.0.2 或更高版本的 cx_oracle。
  • [oracle]
    基本类型中添加了 NCLOB 类型。
  • [oracle]
    use_ansi=False 不会泄漏到从子查询中选择的语句的 FROM/WHERE 子句中,该子查询还使用了 JOIN/OUTERJOIN。
  • [oracle]
    向方言添加了本机 INTERVAL 类型。目前仅支持 DAY TO SECOND 的间隔类型,因为 cx_oracle 不支持 YEAR TO MONTH。
    参考:#1467
  • [oracle]
    使用 CHAR 类型会导致 cx_oracle 的 FIXED_CHAR dbapi 类型绑定到语句。
  • [oracle]
    Oracle 方言现在具有 NUMBER,旨在像 Oracle 的 NUMBER 类型一样运行。它是表反射返回的主要数值类型,并尝试根据精度/比例参数返回 Decimal()/float/int。
    参考:#885
  • [oracle]
    func.char_length 是用于 LENGTH 的通用函数
  • [oracle]
    ForeignKey() 包括 onupdate= 将发出警告,不会发出不受 Oracle 支持的 ON UPDATE CASCADE
  • [oracle]
    RowProxy() 的 keys() 方法现在返回已标准化为 SQLAlchemy 大小写不敏感名称的结果列名。这意味着对于大小写不敏感名称,它们将是小写的,而 DBAPI 通常会将它们返回为大写名称。这使得行键() 可与进一步的 SQLAlchemy 操作兼容。
  • [oracle]
    使用新的 dialect.initialize() 功能来设置版本相关的行为。
  • [oracle]
    在 Oracle 中使用 types.BigInteger 将生成 NUMBER(19)
    参考:#1125
  • [oracle]
    “大小写敏感”功能将在反射期间检测到全小写大小写敏感列名,并向生成的 Column 添加“quote=True”,以便保持正确的引用。

杂项

  • [主要] [发布]
    有关完整功能描述集,请参阅 docs.sqlalchemy.org/en/latest/changelog/migration_06.html 。此文档正在进行中。
  • [主要] [发布]
    所有最新版本 0.5 及以下的所有错误修复和功能增强也包含在 0.6 中。
  • [主要] [发布]
    现在针对的平台包括 Python 2.4/2.5/2.6,Python 3.1,Jython2.5。
  • [引擎]
    可以使用 create_engine(… isolation_level=”…”) 指定事务隔离级别;在 postgresql 和 sqlite 上可用。
    参考:#443
  • [引擎]
    Connection  具有 execution_options(),接受影响语句在 DBAPI  方面执行方式的关键字的生成方法。目前支持“stream_results”,导致 psycopg2  使用服务器端游标执行该语句,以及“autocommit”,这是 select() 和 text()  中“autocommit”选项的新位置。select() 和 text() 也有 .execution_options(),以及 ORM  Query()。
  • [引擎]
    修复了为基于入口点驱动的方言导入不依赖于愚蠢的 tb_info 技巧来确定导入错误状态。
    参考:#1630
  • [引擎]
    在 ResultProxy 中添加了 first()方法,返回第一行并立即关闭结果集。
  • [引擎]
    RowProxy 对象现在是可 pickle 化的,即 result.fetchone()、result.fetchall()等返回的对象。
  • [引擎]
    RowProxy 不再有 close()方法,因为行不再保持对父行的引用。请在父 ResultProxy 上调用 close(),或使用 autoclose。
  • [引擎]
    ResultProxy  内部已进行了大规模的改进,大大减少了在获取列时的方法调用次数。在获取大型结果集时,可以提供大幅度的速度提升(高达  100%以上)。当获取没有应用类型级处理的列并且将结果用作元组(而不是字典)时,改进更大。非常感谢 Elixir 的 Gaëtan de  Menten 为这一巨大改进所做的努力!
    参考:#1586
  • [引擎]
    依赖于“last inserted id”进行生成序列值的数据库(例如 MySQL、MS-SQL)现在在复合主键中正常工作,其中“autoincrement”列不是表中的第一个主键列。
  • [引擎]
    last_inserted_ids()方法已重命名为描述符“inserted_primary_key”。
  • [引擎]
    将  echo=False 设置在 create_engine()上现在会将日志级别设置为 WARN,而不是  NOTSET。这样,即使总体上启用了“sqlalchemy.engine”的日志记录,也可以为特定引擎禁用日志记录。请注意,“echo”的默认设置为  None。
    参考:#1554
  • [引擎]
    ConnectionProxy  现在对所有事务生命周期事件都有包装方法,包括  begin()、rollback()、commit()、begin_nested()、begin_prepared()、prepare()、release_savepoint()等。
  • [引擎]
    连接池日志现在使用 INFO 和 DEBUG 日志级别进行记录。INFO 用于主要事件,如无效的连接,DEBUG 用于所有获取/返回日志记录。echo_pool 可以是 False、None、True 或“debug”,方式与 echo 相同。
  • [引擎]
    所有 pyodbc 方言现在支持额外的 pyodbc 特定的 kw 参数‘ansi’、‘unicode_results’、‘autocommit’。
    参考:#1621
  • [引擎]
    “threadlocal”引擎已重写和简化,现在支持 SAVEPOINT 操作。
  • [引擎]已弃用或移除
  • result.last_inserted_ids()已弃用。使用 result.inserted_primary_key
  • dialect.get_default_schema_name(connection)现在通过 dialect.default_schema_name 公开。
  • 从  engine.transaction()和  engine.run_callable()中移除了“connection”参数——Connection  本身现在具有这些方法。所有四个方法都接受*args 和**kwargs,这些参数被传递给给定的可调用对象,以及操作连接。
  • [反射/检查]
    表反射已扩展并泛化为一个名为“sqlalchemy.engine.reflection.Inspector”的新 API。Inspector 对象提供关于各种模式信息的细粒度信息,包括表名、列名、视图定义、序列、索引等,还有扩展的空间。
  • [反射/检查]
    视图现在可以反映为普通的 Table 对象。使用相同的 Table 构造函数,但要注意“有效”的主键和外键约束不是反射结果的一部分;如果需要,必须明确指定这些。
  • [反射/检查]
    现有的 autoload=True 系统现在在底层使用 Inspector,以便每个方言只需返回关于表和其他对象的“原始”数据 - Inspector 是将信息编译成 Table 对象的单一位置,以确保一致性最大化。
  • [ddl]
    DDL 系统已大大扩展。DDL()类现在扩展了更通用的 DDLElement(),它构成了许多新构造的基础:
  • CreateTable()

  • DropTable()

  • AddConstraint()

  • DropConstraint()

  • CreateIndex()

  • DropIndex()

  • CreateSequence()

  • DropSequence()

这些支持“on”和“execute-at()”,就像普通 DDL()一样。用户定义的 DDLElement 子类可以被创建并链接到一个编译器,使用 sqlalchemy.ext.compiler 扩展。

  • [ddl]
    传递给 DDL()和 DDLElement()“on”可调用的签名如下所示:

ddl

DDLElement 对象本身

事件

字符串事件名称。

目标

以前是“schema_item”,触发事件的 Table 或 MetaData 对象。

连接

用于操作的 Connection 对象。

**kw

关键字参数。在 MetaData 之前/之后创建/删除的情况下,要发出 CREATE/DROP DDL 的 Table 对象列表作为 kw 参数“tables”传递。这对于依赖于特定表存在的元数据级 DDL 是必要的。

  • DDL 的“schema_item”属性已重命名为
    ”目标”。
  • [方言] [重构]
    方言模块现在分为数据库方言和 DBAPI 实现。现在更倾向于使用方言+驱动程序的连接 URL 来指定,即“mysql+mysqldb://scott:tiger@localhost/test”。请参阅 0.6 文档以获取示例。
  • [方言] [重构]
    外部方言的 setuptools 入口现在称为“sqlalchemy.dialects”。
  • [方言] [重构]
    从 Table 中删除了“owner”关键字参数。使用“schema”表示要预先添加到表名的任何命名空间。
  • [方言] [重构]
    server_version_info 成为静态属性。
  • [方言] [重构]
    方言在初始连接时接收到 initialize()事件,以确定连接属性。
  • [方言] [重构]
    方言在接收到 visit_pool 事件时有机会建立池监听器。
  • [方言] [重构]
    缓存的 TypeEngine 类现在按照每个方言类进行缓存,而不是按照每个方言进行缓存。
  • [方言] [重构]
    新的 UserDefinedType 应作为新类型的基类使用,以保留 get_col_spec() 的 0.5 行为。
  • [方言] [重构]
    所有类型类的 result_processor() 方法现在接受第二个参数“coltype”,这是来自 cursor.description 的 DBAPI 类型参数。此参数可以帮助某些类型决定对结果值进行最有效的处理。
  • [方言] [重构]
    废弃的 Dialect.get_params() 已移除。
  • [方言] [重构]
    Dialect.get_rowcount() 已重命名为描述符“rowcount”,并直接调用 cursor.rowcount。需要为某些调用硬编码行数的方言应重写该方法以提供不同的行为。
  • [方言] [重构]
    DefaultRunner 及其子类已移除。该对象的工作已简化并移至 ExecutionContext 中。支持序列的方言应在其执行上下文实现中添加 fire_sequence() 方法。
    参考:#1566
  • [方言] [重构]
    编译器生成的函数和运算符现在使用(几乎)常规的分发函数形式“visit_”和“visit__fn”来提供定制处理。这取代了在编译器子类中复制“functions”和“operators”字典的需要,改为使用直接的访问方法,并且还允许编译器子类完全控制渲染,因为完整的  _Function 或 _BinaryExpression 对象被传递进来。
  • [firebird]
    RowProxy() 的 keys() 方法现在返回结果列名标准化为 SQLAlchemy 不区分大小写的名称。这意味着对于不区分大小写的名称,它们将是小写的,而 DBAPI 通常会将它们返回为大写名称。这使得行键() 可与进一步的 SQLAlchemy 操作兼容。
  • [firebird]
    使用新的 dialect.initialize() 功能设置版本相关行为。
  • [firebird]
    “大小写敏感”功能将在反射期间检测到全小写的大小写敏感列名,并向生成的 Column 添加 “quote=True”,以保持适当的引用。
  • [类型]
    方言内部类型的构建已完全重构。方言现在仅以大写名称定义公开可用的类型,并使用下划线标识符(即私有)定义内部实现类型。表达类型在  SQL 和 DDL 中的系统已移至编译器系统。这样做的效果是大多数方言中的类型对象大大减少。有关方言作者的详细文档在  lib/sqlalchemy/dialects/type_migration_guidelines.txt 中。
  • [类型]
    类型不再对默认参数进行任何猜测。特别是,Numeric、Float、NUMERIC、FLOAT、DECIMAL 不会生成任何长度或精度,除非指定。
  • [类型]
    types.Binary  被重命名为 types.LargeBinary,它只产生 BLOB、BYTEA 或类似的“长二进制”类型。新增了基本的 BINARY 和  VARBINARY 类型,以一种与 MySQL/MS-SQL 特定类型无关的方式访问这些类型。
    参考:#1664
  • [类型]
    如果  dialect 检测到 DBAPI 原生返回 Python unicode 对象,则 String/Text/Unicode  类型现在会跳过每个结果列值上的 unicode()检查。此检查在首次连接时使用“SELECT CAST ‘some text’ AS  VARCHAR(10)”或等效方式发出,然后检查返回的对象是否为 Python unicode。这允许对原生 unicode DBAPI(包括  pysqlite/sqlite3、psycopg2 和 pg8000)进行大幅性能提升。
  • [类型]
    大多数类型结果处理器已经经过检查,以寻找可能的速度改进。具体来说,以下通用类型已经经过优化,导致不同程度的速度改进:Unicode、PickleType、Interval、TypeDecorator、Binary。此外,以下特定于  dbapi 的实现已经得到改进:Sqlite 上的 Time、Date 和 DateTime,PostgreSQL 上的  ARRAY,MySQL 上的 Time,MySQL 上的 Numeric(as_decimal=False),oursql 和  pypostgresql,cx_oracle 上的 DateTime 以及 cx_oracle 上的 LOB 类型。
  • [类型]
    现在类型的反射将返回 types.py 中的确切大写类型,或者如果类型不是标准 SQL 类型,则返回 dialect 本身中的大写类型。这意味着反射现在返回有关反射类型的更准确信息。
  • [类型]
    添加了一个新的  Enum 通用类型。Enum 是一个 schema-aware 对象,用于支持需要特定 DDL 才能使用 enum 或等效的数据库;在 PG  的情况下,它处理 CREATE TYPE 的详细信息,在其他没有本地枚举支持的数据库上,将生成 VARCHAR +内联 CHECK  约束以强制执行枚举。
    参考:#1109#1511
  • [类型]
    Interval  类型包括一个“native”标志,控制是否选择本机 INTERVAL 类型(postgresql +  oracle)(如果可用)或不选择。还添加了“day_precision”和“second_precision”参数,适当地传播到这些本机类型。相关链接。
    参考:#1467
  • [类型]
    当在没有本地布尔支持的后端上使用  Boolean 类型时,将生成一个 CHECK 约束“col IN (0, 1)”以及基于 int/smallint  的列类型。如果需要,可以通过 create_constraint=False 关闭此功能。请注意,MySQL 没有本地布尔CHECK 约束支持,因此该功能在该平台上不可用。
    参考:#1589
  • [类型]
    当 mutable=True 时,PickleType 现在使用 == 比较值,除非为类型指定了带有比较函数的 “comparator” 参数。如果未重写 eq() 或未提供比较函数,则将根据标识比较被 pickled 的对象(这会破坏 mutable=True 的目的)。
  • [types]
    Numeric 和 Float 的默认 “precision” 和 “scale” 参数已被移除,现在默认为 None。除非提供这些值,否则 NUMERIC 和 FLOAT 将默认不带数字参数呈现。
  • [types]
    AbstractType.get_search_list() 被移除 - 不再需要使用它的游戏。
  • [types]
    添加了一个通用的 BigInteger 类型,编译为 BIGINT 或 NUMBER(19)。
    参考:#1125
  • [types]
    sqlsoup  已进行了全面改进,明确支持 0.5 风格的会话,使用 autocommit=False,autoflush=True。SQLSoup  的默认行为现在需要通常使用 commit() 和 rollback(),这些已添加到其接口中。可以将显式的 Session 或  scoped_session 传递给构造函数,允许覆盖这些参数。
  • [types]
    sqlsoup db..update() 和 delete() 现在分别调用 query(cls).update() 和 delete()。
  • [types]
    sqlsoup 现在具有 execute() 和 connection(),它们调用那些名称的 Session 方法,确保绑定是基于 SqlSoup 对象的绑定。
  • [types]
    sqlsoup 对象不再具有 ‘query’ 属性 - 对于 sqlsoup 的使用范式而言不需要它,并且它会妨碍一个实际上命名为 ‘query’ 的列。
  • [types]
    传递给  association_proxy 的 proxy_factory 可调用对象的签名现在是 (lazy_collection,  creator, value_attr, association_proxy),添加了第四个参数,即父级 AssociationProxy  参数。允许内置集合的序列化和子类化。
    参考:#1259
  • [types]
    association_proxy 现在具有基本的比较方法 .any()、.has()、.contains()、==、!=,感谢 Scott Torborg。
    参考:#1372

orm

  • [orm]对 query.update() 和 query.delete() 的更改:
  • query.update() 上的 ‘expire’ 选项已重命名为 ‘fetch’,与 query.delete() 的命名相匹配。‘expire’ 已被弃用并发出警告。
  • query.update() 和 query.delete() 默认都使用“evaluate”作为同步策略。
  • update() 和 delete() 的“同步”策略在失败时会引发错误。没有隐式回退到“fetch”。评估的成功/失败基于条件的结构,因此成功/失败是基于代码结构的确定性的。
  • [orm]对于多对一关系的增强:
  • 多对一关系现在在更少的情况下触发延迟加载,包括在大多数情况下在替换新值时不会获取“旧”值。
  • 与联接表子类的多对一关系现在使用 get()进行简单加载(称为“use_get”条件),即 Related->Sub(Base),无需重新定义基表的 primaryjoin 条件。
  • 使用声明性列指定外键,即 ForeignKey(MyRelatedClass.id),不会阻止“use_get”条件的发生。
  • relation()、eagerload()和  eagerload_all()现在具有名为“innerjoin”的选项。指定 True 或 False 以控制是否将急加载构建为 INNER 或  OUTER 连接。默认始终为 False。mapper 选项将覆盖  relation()上指定的任何设置。通常应为多对一、非空外键关系设置以允许改进的连接性能。
  • 对于急加载的行为,当存在 LIMIT/OFFSET 时,主查询现在会在所有急加载都是多对一连接时进行包装成子查询,这种情况下,急加载将直接针对父表进行连接,同时带有限制/偏移量,而不会增加子查询的额外开销,因为多对一连接不会向结果添加行。
  • 参考:#1186, #1492, #1544
  • [orm]
    Session.merge()的增强/更改:
  • [orm]
    在 Session.merge()上的“dont_load=True”标志已被弃用,现在是“load=False”。
  • [orm]
    Session.merge()经过性能优化,在“load=False”模式下的调用次数仅为 0.5 的一半,并且在“load=True”模式下对于集合的 SQL 查询显著减少。
  • [orm]
    如果给定的实例与已经存在的实例相同,则 merge()不会发出不必要的属性合并。
  • [orm]
    merge()现在还会合并与给定状态相关联的“options”,即通过 query.options()传递的那些随实例一起传递的选项,例如急加载或延迟加载各种属性的选项。这对于构建高度集成的缓存方案至关重要。这是与 0.5 版本相比的一个微妙的行为变化。
  • [orm]
    修复了关于实例状态中存在的“loader path”序列化的 bug,这在将 merge()与应保留的序列化状态和相关选项结合使用时也是必要的。
  • [orm]
    全新的 merge()在一个全面的示例中展示了如何将 Beaker 与 SQLAlchemy 集成。请参见下面的“示例”注释中的说明。
  • [orm]
    现在可以在联接表继承对象上更改主键值,并且在刷新时将考虑 ON UPDATE CASCADE。在使用 SQLite 或 MySQL/MyISAM 时,在 mapper()上设置新的“passive_updates”标志为 False。
    参考:#1362
  • [orm]
    flush()  现在可以检测到主键列是否被另一个主键的 ON UPDATE CASCADE 操作更新,并且可以在新的主键值上进行后续 UPDATE  时定位行。当存在 relation() 来建立关系以及 passive_updates=True 时会发生这种情况。
    参考:#1671
  • [orm]
    “save-update” 级联现在会将标量或集合属性中待处理的移除值级联到新会话中的 add() 操作中。这样,flush() 操作也会删除或修改这些断开连接项目的行。
  • [orm]
    使用“dynamic”加载器与“secondary”表现在会生成一个查询,其中“secondary”表不会被别名化。这允许在 relation() 的“order_by”属性中使用“secondary”表对象,并且还允许在动态关系的筛选条件中使用它。
    参考:#1531
  • [orm]
    当  relation() 的 uselist=False 时,当 eager 或 lazy load 定位到多个有效值时会发出警告。这可能是由于  primaryjoin/secondaryjoin 条件不适用于 eager LEFT OUTER JOIN 或其他条件。
    参考:#1643
  • [orm]
    当使用 synonym() 与 map_column=True 时,会显式检查是否在发送到 mapper 的属性字典中存在与同一键名的 ColumnProperty(延迟或其他方式)。不会静默替换现有属性(以及可能存在的属性选项),而是会引发错误。
    参考:#1633
  • [orm]
    “dynamic”加载器在构建时设置其查询条件,以便从非克隆访问器(如“statement”)返回实际查询。
  • [orm]
    迭代 Query() 时返回的“named tuple”对象现在是可 pickle 的。
  • [orm]
    映射到 select() 构造现在要求您将其明确地制作为 alias()。这是为了消除诸如此类问题的混淆
    参考:#1542
  • [orm]
    重新设计了 query.join(),以提供更一致的行为和更灵活的功能(包括)。
    参考:#1537
  • [orm]
    query.select_from() 接受多个子句以在 FROM 子句中生成多个逗号分隔的条目。在从多个 join() 子句中选择时很有用。
  • [orm]
    query.select_from() 还接受映射类、aliased() 构造和 mappers 作为参数。特别是在从多个连接表类查询时,确保完整连接被渲染。
  • [orm]
    query.get() 可以与映射到一个外连接的情况一起使用,其中一个或多个主键值为 None。
    参考:#1135
  • [orm]
    query.from_self()、query.union()等执行“SELECT  * from (SELECT…)”类型嵌套的操作将更好地将子查询中的列表达式转换为外部查询的列子句。这可能与 0.5  版本不兼容,因为这可能会破坏没有应用标签的文字表达式的查询(即 literal(‘foo’)等)。
    参考:#1568
  • [orm]
    relation primaryjoin 和 secondaryjoin 现在检查它们是否是列表达式,而不仅仅是子句元素。这禁止了直接在那里放置 FROM 表达式等情况。
    参考:#1622
  • [orm]
    expression.null()在使用 query.filter()、filter_by()等时与 None 的比较方式完全相同。
    参考:#1415
  • [orm]
    添加了“make_transient()”辅助函数,将持久化/分离实例转换为瞬态实例(即删除实例键并从任何会话中移除)。
    参考:#1052
  • [orm]
    在 mapper()上的 allow_null_pks 标志已被弃用,并且该功能默认为“on”。这意味着对于任何主键列具有非空值的行将被视为标识。通常只有在映射到外连接时才会出现这种情况。
    参考:[#1339](https:/
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十四)(3)
SqlAlchemy 2.0 中文文档(六十四)
29 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十九)(2)
SqlAlchemy 2.0 中文文档(六十九)
22 0
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十四)(1)
SqlAlchemy 2.0 中文文档(六十四)
35 0
|
3月前
|
SQL JSON 数据库
SqlAlchemy 2.0 中文文档(五十二)(6)
SqlAlchemy 2.0 中文文档(五十二)
17 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十七)(4)
SqlAlchemy 2.0 中文文档(六十七)
13 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十七)(3)
SqlAlchemy 2.0 中文文档(六十七)
20 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十七)(2)
SqlAlchemy 2.0 中文文档(六十七)
14 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十七)(1)
SqlAlchemy 2.0 中文文档(六十七)
32 0
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十二)(2)
SqlAlchemy 2.0 中文文档(六十二)
19 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十二)(3)
SqlAlchemy 2.0 中文文档(六十二)
18 0