0.7 更新日志

0.7.11

无发布日期

orm

  • [orm] [bug]

    修复了列表工具在正确表示 [0:0] 的 setslice 时会失败的错误,特别是当与关联代理一起使用 insert(0, item) 时可能会发生这种情况。由于 Python 集合中的一些怪异之处,这个问题在 Python 3 中比在 Python 2 中更可能发生。

    参考: #2807

  • [orm] [bug]

    修复了当查询形式为:query(SubClass).options(subqueryload(Baseclass.attrname)),其中 SubClassBaseClass 的 joined inh 时,在属性加载时,子查询内部未能应用 JOIN,从而产生笛卡尔积的错误。填充结果仍然倾向于正确,因为会忽略额外的行,因此这个问题可能以性能下降的形式存在于其他工作正常的应用程序中。

    参考: #2699

  • [orm] [bug]

    修复了工作单元中的一个错误,如果两个表之间没有设置外键约束,则连接继承子类可能会在父表之前插入“子”表的行。

    参考: #2689

  • [orm] [bug]

    改进了当检测到“反向引用循环”时发出的错误消息,即当属性事件触发两个其他属性之间没有终点的双向赋值时。这种情况不仅可能在分配了错误类型的对象时发生,也可能在属性配置错误,反向引用到现有的反向引用对时发生。

    参考: #2674

  • [orm] [bug]

    当 MapperProperty 被分配给替换现有属性的 mapper 时,如果所讨论的属性不是普通的基于列的属性,则会发出警告。关系属性的替换很少(甚至从不?)是预期的,通常指的是 mapper 配置错误。如果反向引用在继承关系中配置在现有反向引用的顶部,也会发出警告(这在 0.8 中是一个错误)。

    参考: #2674

engine

  • [engine] [bug]

    make_url() 函数使用的正则表达式现在可以解析 IPv6 地址,例如,用括号括起来的地址。

    参考: #2851

sql

  • [sql] [bug]

    修复了追溯到 0.7.9 的回归错误,即如果 CTE 在多个 FROM 子句中被引用,则 CTE 的名称可能无法正确引用。

    参考: #2801

  • [sql] [bug] [cte]

    修复了公用表表达式系统中的一个错误,如果 CTE 仅用作 alias() 构造,则不会使用 WITH 关键字呈现。

    参考: #2783

  • [sql] [bug]

    修复了 CheckConstraint DDL 中的错误,其中 Column 对象中的 “quote” 标志不会被传播。

    参考: #2784

postgresql

  • [postgresql] [feature]

    增加了对 PostgreSQL 传统 SUBSTRING 函数语法的支持,当使用常规 func.substring() 时,渲染为 “SUBSTRING(x FROM y FOR z)”。感谢 Gunnlaugur Þór Briem。

    参考: #2676

mysql

  • [mysql] [bug]

    更新了 MySQL 5.5、5.6 版本的保留字,感谢 Hanno Schlichting。

    参考: #2791

tests

  • [tests] [bug]

    修复了 test_execute 中 “logging” 的导入,该导入在某些 Linux 平台上无法工作。

    参考: #2669, pull request 41

0.7.10

发布日期: Thu Feb 7 2013

orm

  • [orm] [bug]

    修复了如果创建任意数量的 sessionmaker 对象时可能发生的潜在内存泄漏。sessionmaker 创建的匿名子类在取消引用时,由于事件包中剩余的类级别引用,将不会被垃圾回收。这个问题也适用于任何使用临时子类和事件分发器的自定义系统。

    参考: #2650

  • [orm] [bug]

    Query.merge_result() 现在可以从外连接加载行,其中实体可能为 None 而不会抛出错误。

    参考: #2640

  • [orm] [bug]

    MutableComposite 类型不允许使用 MutableBase.coerce() 方法,即使代码似乎表明了这种意图,所以现在它可以工作了,并添加了一个简短的示例。作为副作用,此事件处理程序的机制已更改,因此新的 MutableComposite 类型不再添加每种类型的全局事件处理程序。0.8.0b2 中也进行了此修复。

    参考: #2624

  • [orm] [bug]

    修复了 Session 记账错误,由此,如果被替换的主键是通过非工作单元建立的 INSERT 语句或另一个实例的主键切换建立的,则用同一主键的另一个对象替换身份映射中的已删除对象将在 rollback() 时引发 “conflicting state” 错误。

    参考: #2583

engine

sql

  • [sql] [bug]

    TypeDecorator__repr__ 调整向后移植到 0.7,允许 PickleType 生成清晰的 repr() 以帮助 Alembic。

    参考: #2584, #2594

  • [sql] [bug]

    修复了如果 Column 既有外键,又有名为 “.key” 的备用列名,则 Table.tometadata() 会失败的错误。

    参考: #2643

  • [sql] [bug]

    修复了在不传递 “for_update=True” 标志的情况下使用 server_onupdate=<FetchedValue|DefaultClause> 会将默认对象应用于 server_default,从而覆盖已有的任何内容的错误。使用此用法时,不应需要显式的 for_update=True 参数(特别是由于文档显示了一个不使用它的示例),因此现在内部安排使用给定默认对象的副本(如果该标志未设置为与该参数对应的值)。

    参考: #2631

  • [sql] [gae] [mysql]

    gaerdbms 方言添加了条件导入,该导入尝试导入 rdbms_apiproxy 与 rdbms_googleapi 以在开发和生产平台上工作。现在也支持 instance 属性。感谢 Sean Lynch。还向后移植了增强功能,以允许用户名/密码,并修复了 0.8 中的错误代码解释。

    参考: #2649

mysql

  • [mysql] [feature]

    向 OurSQL 方言添加了 “raise_on_warnings” 标志。

    参考: #2523

  • [mysql] [feature]

    向 MySQLdb 方言添加了 “read_timeout” 标志。

    参考: #2554

sqlite

  • [sqlite] [bug]

    对此 SQLite 相关问题进行了更多调整,该问题已在 0.7.9 中发布,以在反射外键时拦截旧版 SQLite 引用字符。除了拦截双引号外,现在还拦截其他引用字符,例如方括号、反引号和单引号。

    参考: #2568

mssql

  • [mssql] [bug]

    修复了将 “key” 与 Column 结合使用,并将 “schema” 用于所属 Table 会因 MSSQL 方言的 “schema rendering” 逻辑未能考虑 .key 而无法定位结果行的错误。

  • [mssql] [bug]

    在 mssql 信息模式中添加了 Py3K 条件以绕过不必要的 .decode() 调用,修复了 Py3k 中的反射。

    参考: #2638

oracle

  • [oracle] [bug]

    Oracle LONG 类型虽然是一种无界文本类型,但在返回结果行时似乎未使用 cx_Oracle.LOB 类型,因此已修复方言以排除 LONG 应用 cx_Oracle.LOB 过滤。

    参考: #2620

  • [oracle] [bug]

    修复了 .prepare() 与 cx_Oracle 结合使用时的用法,以便 False 的返回值将导致不调用 connection.commit(),从而避免 “no transaction” 错误。两阶段事务现在已显示可以在 SQLAlchemy 和 cx_oracle 中以简陋的方式工作,但受驱动程序观察到的警告的约束;请查看文档以了解详细信息。

    参考: #2611

  • [oracle] [bug]

    更改了从 setinputsizes() 步骤中排除的 cx_oracle 类型列表,使其仅包含 STRING 和 UNICODE;CLOB 和 NCLOB 已删除。这是为了解决 cx_oracle 行为,该行为对于 executemany() 调用是损坏的。在 0.8 中,应用了相同的更改,但也可以通过 exclude_setinputsizes 参数进行配置。

    参考: #2561

0.7.9

发布日期: Mon Oct 01 2012

orm

  • [orm] [bug]

    修复了主要针对新的 AbstractConcreteBase 助手程序的错误,其中超类中的 “type” 属性不会在子类上被覆盖以产生 “reserved for base” 错误消息,而是在那里放置一个无操作属性。这与使用 ConcreteBase 以及经典具体映射的所有行为不一致,在经典具体映射中,除非显式覆盖,否则多态基类中的 “type” 列将在子类上显式禁用。

  • [orm] [bug]

    当 lazy=’dynamic’ 与 uselist=False 组合使用时,会发出警告。这在 0.8 中会引发异常。

  • [orm] [bug]

    修复了相关对象赋值中的用户错误可能导致递归溢出的错误,如果赋值触发了与不正确类上与双向属性同名的反向引用到同一目标。现在会引发信息丰富的错误。

  • [orm] [bug]

    修复了当 ORM 绑定 “version” 列(当使用 “version” 功能时)时,会传递不正确类型信息的错误。感谢 Daniel Miller 提供测试。

    参考: #2539

  • [orm] [bug]

    在 Session.commit() 中发生的 “flush” 中添加了额外的逻辑,以便在 “commit” 完成之前,在后续的 flush 中也刷新 after_flush() 或 after_flush_postexec() 钩子添加的额外状态。对 flush() 的后续调用将继续,直到 after_flush 钩子停止添加新状态。如果 broken after_flush() 钩子每次都添加新内容,则还会设置 100 的 “溢出” 计数器。

    参考: #2566

engine

  • [engine] [feature]

    事件系统的内存使用量大幅提高;仅当为该事件建立实例级侦听器时,才为特定类型的事件创建实例级集合。

    参考: #2516

  • [engine] [bug]

    修复了当 QueuePool 有线程等待连接时发生的断开连接检测 + 处置,将使这些线程在旧池的超时期间(如果禁用超时,则无限期地)等待的错误。修复程序现在使用特殊的异常情况通知这些等待者,并让他们移动到新池。

    参考: #2522

  • [engine] [bug]

    将 gaerdbms 导入添加到 mysql/__init__.py,缺少该导入会阻止加载新的 GAE 方言。

    参考: #2529

  • [engine] [bug]

    修复了 cextension 错误,由此,如果给定的索引是 Column 对象而不是字符串,则 “ambiguous column error” 将无法正常工作。请注意,此处仍然存在一些列目标问题,这些问题已在 0.8 中修复。

    参考: #2553

  • [engine] [bug]

    修复了 Enum 的 repr(),使其包含 “name” 和 “native_enum” 标志。帮助 Alembic 自动生成。

sql

  • [sql] [bug]

    修复了 DropIndex 构造以支持与远程模式中的 Table 关联的 Index。

    参考: #2571

  • [sql] [bug]

    修复了 over() 构造中的错误,由此,将空列表传递给 partition_by 或 order_by(而不是 None)将无法正确生成。感谢 Gunnlaugur Þór Briem。

    参考: #2574

  • [sql] [bug]

    修复了 CTE 错误,由此,CTE 本身中存在的位置绑定参数会破坏绑定参数的整体排序。这主要影响 SQL Server,因为它是一个支持位置绑定 + CTE 的平台。

    参考: #2521

  • [sql] [bug]

    修复了 CTE 中更多不直观之处,这些不直观之处阻止在自身的 union 中引用 CTE,而无需对其进行别名。CTE 现在根据名称唯一呈现,仅呈现给定名称的最外层 CTE - 所有其他引用都仅呈现为名称。这甚至包括引用同一 CTE 对象不同版本的其他 CTE/SELECT,例如 SELECT 或该 SELECT 的 UNION ALL。在这种情况下,我们有点放宽了对象标识和词法标识之间的常用链接。现在,两个不相关的 CTE 之间的真实名称冲突会引发错误。

  • [sql] [bug]

    根据原始 Column 的引用规则,将引用应用于公用表表达式的 WITH RECURSIVE 子句中的列名。

    参考: #2512

  • [sql] [bug]

    修复了 0.7.6 中引入的回归错误,由此,在某些 “clone+replace” 场景中,SELECT 语句的 FROM 列表可能不正确。

    参考: #2518

  • [sql] [bug]

    修复了在嵌入式子查询内部使用 UNION 或类似内容会干扰结果列定位的错误,在这种情况下,结果列的最终名称与嵌入式 UNION 内部的名称相同。

    参考: #2552

  • [sql] [bug]

    修复了自 0.6 以来关于结果行定位的回归。应该可以使用带有基于字符串的列的 select() 语句,即 select(['id', 'name']).select_from('mytable'),并使该语句可由具有这些名称的 Column 对象定位;这是 query(MyClass).from_statement(some_statement) 工作的方式。在某些时候,使用 select(['id']) 的特定情况(等效于 select([literal_column('id')]))在此处停止工作,因此已重新启用,当然也经过了测试。

    参考: #2558

  • [sql] [bug]

    向 ColumnOperators 基类添加了缺少的运算符 is_()、isnot(),以便这些长期可用的运算符像所有其他运算符一样以方法的形式存在。

    参考: #2544

postgresql

  • [postgresql] [bug]

    现在,反射主键约束中的列按照约束本身定义它们的顺序返回,而不是表对其进行排序的方式返回。感谢 Gunnlaugur Þór Briem。

    参考: #2531

  • [postgresql] [bug]

    在用于检测与 PG 断开连接的消息列表中添加了 “terminating connection”,当服务器重新启动时,某些版本中似乎存在该消息。

    参考: #2570

mysql

  • [mysql] [bug]

    更新了 mysqlconnector 接口以使用更新的 “client flag” 和 “charset” API,感谢 David McNelis。

sqlite

  • [sqlite] [feature]

    增加了对 SQLite 中实现的 localtimestamp() SQL 函数的支持,感谢 Richard Mitchell。

  • [sqlite] [bug]

    调整了一个非常旧的错误修复,该错误修复试图解决 SQLite 问题,该问题本身已在 sqlite 3.6.14 中 “修复”,涉及在使用 “foreign_key_list” pragma 时表名周围的引号。该修复程序已调整为不干扰实际上位于列名或表名 *中* 的引号,并尽可能达到最大程度;如果目标表实际上在其名称周围有引号作为其名称的 *一部分*(即 “””mytable”””),则 sqlite 对于 foreign_key_list() 仍然不会返回正确的结果。

    参考: #2568

  • [sqlite] [bug]

    调整了列默认值反射代码以将非字符串值转换为字符串,以适应不将默认信息作为字符串传递的旧版 SQLite。

    参考文献: #2265

mssql

  • [mssql] [bug]

    修复了编译器错误,该错误指出,如果在 ORDER BY 中使用相关子查询,并且语句也使用了 LIMIT/OFFSET,则由于 ROW_NUMBER() OVER 子句中的错误呈现而无法正确呈现。感谢 sayap 提供的修复方案

    参考文献: #2538

  • [mssql] [bug]

    修复了编译器错误,该错误指出,如果给定的 select() 具有 “offset” 属性,则会被修改,从而导致该构造第二次无法正确编译。

    参考文献: #2545

  • [mssql] [bug]

    修复了主键约束反射的错误,如果相同的约束/表存在于多个模式中,则会导致列重复。

0.7.8

发布日期:2012 年 6 月 16 日星期六

orm

  • [orm] [feature]

    flush() 的 ‘objects’ 参数不再被弃用,因为已经确定了一些有效的用例。

  • [orm] [bug]

    修复了从多态映射到目标的 subqueryload() 会导致为多态结果中遇到的每个不同类调用新查询的错误。

    参考文献: #2480

  • [orm] [bug]

    修复了声明式中连接表、复合列(通常用于 id)中的列的优先级在列名与其属性名不同时会失败的错误。 这会导致针对实体属性进行的 primaryjoin 条件等操作不正确。 与此相关,这应该是其中的一部分。

    参考文献: #1892, #2491

  • [orm] [bug]

    修复了 identity_key() 函数不接受标量参数作为身份的错误。

    参考文献: #2508

  • [orm] [bug]

    修复了 populate_existing 选项不会传播到子查询预加载器的错误。

    参考文献: #2497

engine

  • [engine] [bug]

    修复了结果代理的 C 版本中的内存泄漏问题,其中 DBAPI 不会为结果行传递纯 Python 元组,因此无法正确递减引用计数。 受影响最严重的 DBAPI 是 pyodbc。

    参考文献: #2489

  • [engine] [bug]

    修复了影响 Py3K 的错误,其中传递给 engine/connection execute() 的字符串位置参数无法正确解释,这是由于 Py3K 字符串上存在 __iter__。

    参考文献: #2503

sql

  • [sql] [bug]

    将 BIGINT 添加到 types.__all__,将 BIGINT、BINARY、VARBINARY 添加到 sqlalchemy 模块命名空间,并添加测试以确保此中断不再发生。

    参考文献: #2499

  • [sql] [bug]

    修复了公共表表达式在 SELECT 语句包含 UNION 或其他复合表达式时无法正常呈现的问题,感谢 btbuilder。

    参考文献: #2490

  • [sql] [bug]

    修复了 append_column() 在克隆的 select() 构造上无法正常工作的错误,感谢 Gunnlaugur Þór Briem。

    参考文献: #2482

postgresql

  • [postgresql] [bug]

    删除反射枚举时不需要的表子句。感谢 Gunnlaugur Þór Briem。

    参考文献: #2510

mysql

  • [mysql] [feature]

    为 Google App Engine 添加了新的方言。 感谢 Richie Foreman。

    参考文献: #2484

oracle

  • [oracle] [bug]

    将 ROWID 添加到 oracle.*。

    参考文献: #2483

0.7.7

发布日期:2012 年 5 月 5 日星期六

orm

  • [orm] [feature]

    为 Query 添加了 prefix_with() 方法,调用 select().prefix_with() 以允许在语句中放置 MySQL SELECT 指令。 感谢 Diana Clarke

    参考文献: #2443

  • [orm] [feature]

    为 @validates include_removes 添加了新标志。 当为 True 时,集合删除和属性 del 事件也将发送到验证函数,当使用此标志时,该函数接受一个额外的参数 “is_remove”。

  • [orm] [bug]

    修复了工作单元中的问题,其中将非 None 自引用多对一关系设置为 None 将无法持久化更改,如果以前的值尚未加载。

    参考文献: #2477

  • [orm] [bug]

    修复了 0.7.6 中引入的错误,其中针对映射为连接或其他间接可选对象的列使用的 column_mapped_collection 将无法正常工作。

    参考文献: #2409

  • [orm] [bug]

    修复了 polymorphic_on 列(未在类上映射)会被错误地包含在 merge() 操作中并引发错误的错误。

    参考文献: #2449

  • [orm] [bug]

    修复了表达式注释机制中的错误,该错误可能导致使用别名和连接的 SELECT 语句呈现不正确,尤其是在使用 column_property() 时。

    参考文献: #2453

  • [orm] [bug]

    修复了阻止 OrderingList 被 pickle 化的错误。 感谢 Jeff Dairiki

    参考文献: #2454

  • [orm] [bug]

    修复了关系比较中的错误,其中调用未实现的方法(如 SomeClass.somerelationship.like())会产生递归溢出,而不是 NotImplementedError。

sql

  • [sql] [feature]

    添加了新的连接事件 dbapi_error()。 对于所有 DBAPI 级别的错误调用,在 SQLAlchemy 修改游标状态之前传递原始 DBAPI 异常。

  • [sql] [bug]

    删除了在创建没有列的索引时发出的警告; 虽然这可能不是用户想要的结果,但作为具有特定名称的索引的占位符,这是一个有效的用例。

  • [sql] [bug]

    如果在调用 “with engine.begin()” 时 conn.begin() 失败,则新获取的 Connection 将在正常传播异常之前显式关闭。

  • [sql] [bug]

    将 BINARY、VARBINARY 添加到 types.__all__。

    参考文献: #2474

postgresql

  • [postgresql] [feature]

    为 PostgreSQL 添加了新的 for_update/with_lockmode() 选项:for_update=”read”/ with_lockmode(“read”),for_update=”read_nowait”/ with_lockmode(“read_nowait”)。 这些分别发出 “FOR SHARE” 和 “FOR SHARE NOWAIT”。 感谢 Diana Clarke

    参考文献: #2445

  • [postgresql] [bug]

    删除反射域时不需要的表子句。

    参考文献: #2473

mysql

  • [mysql] [bug]

    修复了 InnoDB 的自增复合列的 “KEY” 子句中的列名会双引号保留字的错误。 感谢 Jeff Dairiki。

    参考文献: #2460

  • [mysql] [bug]

    修复了 “information_schema” 模式的 get_view_names() 无法检索标记为 “SYSTEM VIEW” 的视图的错误。 感谢 Matthew Turland。

  • [mysql] [bug]

    修复了如果 cast() 用于 SQL 表达式,而该表达式的类型不受 cast() 支持,因此方言不呈现 CAST,则如果强制转换的表达式需要分组,则评估顺序可能会更改;分组现在应用于这些表达式。

    参考文献: #2467

sqlite

  • [sqlite] [feature]

    添加了 SQLite 执行选项 “sqlite_raw_colnames=True”,将绕过从 SQLite cursor.description 返回的列名中删除 “.” 的尝试。

    参考文献: #2475

  • [sqlite] [bug]

    当替换 Table 的主键列时(例如通过 extend_existing),insert() 构造使用的 “auto increment” 列将被重置。 以前它会继续引用以前的主键列。

    参考文献: #2525

mssql

  • [mssql] [feature]

    为 PyODBC 方言添加了临时的 create_engine 标志 supports_unicode_binds,以强制方言是否将 Python unicode 文字传递给 PyODBC。

  • [mssql] [bug]

    修复了使用 pyodbc 方言时 use_scope_identity create_engine() 标志。 以前,如果设置为 False,则会忽略此标志。 当设置为 False 时,对于那些 “implicit_returning” 设置为 False 的表,您将在每次 INSERT 后获得 “SELECT @@identity” 以获取最后插入的 ID。

  • [mssql] [bug]

    SQL Server 的 UPDATE..FROM 语法要求在 FROM 子句中存在别名表时,更新的表也必须存在于 FROM 子句中。 现在,当首先存在 FROM 时,更新的表始终存在于 FROM 中。 感谢 sayap。

    参考文献: #2468

0.7.6

发布日期:2012 年 3 月 14 日星期三

orm

  • [orm] [feature]

    为 Session 添加了 “no_autoflush” 上下文管理器,与 with 一起使用:将临时禁用自动刷新。

  • [orm] [feature]

    为 Query 添加了 cte() 方法,从 Core 调用公共表表达式支持(见下文)。

    参考文献: #1859

  • [orm] [feature]

    在使用 query(sometable).filter_by(colname=value) 时,添加了查询 Table 绑定的列名的能力。

    参考文献: #2400

  • [orm] [bug]

    修复了事件注册错误,该错误主要表现为事件未在事件与 Session 类关联后创建的 sessionmaker() 实例中注册。

    参考文献: #2424

  • [orm] [bug]

    修复了 primaryjoin 条件中包含 “literal” 时,在编译时会对某些类型的深度嵌套表达式引发错误,这些表达式还需要多次呈现相同的绑定参数名称的错误。

    参考文献: #2425

  • [orm] [bug]

    删除了在对映射对象执行多删除时检查受影响行数的检查。 如果两个行之间存在 ON DELETE CASCADE,我们无法从 DBAPI 获取准确的行数; 在任何情况下,大多数 DBAPI 都不支持此特定计数,MySQLdb 是值得注意的例外。

    参考文献: #2403

  • [orm] [bug]

    修复了使用 attribute_mapped_collection 或 column_mapped_collection 的对象无法被 pickle 化的错误。

    参考文献: #2409

  • [orm] [bug]

    修复了如果 MappedCollection 仅在使用 @collection.internally_instrumented 的自定义子类中使用,则不会获得适当的集合检测的错误。

    参考文献: #2406

  • [orm] [bug]

    修复了 SQL 适配机制在涉及连接继承、joinedload()、limit() 和 columns 子句中的派生函数的非常嵌套的场景中会失败的错误。

    参考文献: #2419

  • [orm] [bug]

    修复了 CascadeOptions 的 repr() 以包含 refresh-expire。 还重做了 CascadeOptions 以使其成为 <frozenset>。

    参考文献: #2417

  • [orm] [bug]

    改进了 “声明式反射” 示例以支持单表继承、多次调用 prepare()、备用模式中存在的表、仅建立作为反射的类子集。

  • [orm] [bug]

    缩减了 flush() 中应用的测试,以检查一个表中部分 NULL PK 的 UPDATE,仅当确实发生 UPDATE 时才实际发生。

    参考文献: #2390

  • [orm] [bug]

    修复了如果方法名称与列名称冲突,则当映射器尝试检查方法对象上的 __get__() 方法时会引发 TypeError 的错误。

    参考文献: #2352

examples

  • [examples] [bug]

    更改了 Beaker 示例中的 _params_from_query() 函数,以从完全编译的语句中提取 bindparams,作为快速获取所有内容(包括 columns 子句中的子查询等)的方法。

engine

  • [engine] [feature]

    为连接添加了 “no_parameters=True” 执行选项。 如果不存在参数,则将语句作为 cursor.execute(statement) 传递,从而调用 DBAPI 在不存在参数集合时的行为; 对于 psycopg2 和 mysql-python,这意味着不解释字符串中的 % 符号。 这仅在此选项下发生,而不仅仅是在参数列表为空时发生,否则这将产生 SQL 表达式的不一致行为,这些表达式通常转义百分号(并且在编译时,无法提前知道某些情况下是否存在参数)。

    参考文献: #2407

  • [engine] [feature]

    为 create_engine 添加了 pool_reset_on_return 参数,允许控制 “连接返回” 行为。 还为 pool.reset_on_return 添加了新参数 ‘rollback’、‘commit’、None,以允许更多地控制连接返回活动。

    参考文献: #2378

  • [engine] [feature]

    为 Engine、Connection 添加了一些体面的上下文管理器

    with engine.begin() as conn:
        # <work with conn in a transaction>
        ...

    with engine.connect() as conn:
        # <work with conn>
        ...

    两者都在完成后关闭连接,在 engine.begin() 上发生错误时提交或回滚事务。

  • [engine] [bug]

    为 MockConnection(即,与 strategy=”mock” 一起使用的连接)添加了 execution_options() 调用,该调用充当参数的传递。

sql

  • [sql] [feature]

    添加了对 SQL 标准公共表表达式 (CTE) 的支持,允许将 SELECT 对象作为 CTE 源(尚不支持 DML)。 这是通过任何 select() 构造上的 cte() 方法调用的。

    参考文献: #1859

  • [sql] [bug]

    修复了核心中的内存泄漏问题,当 C 扩展与特定类型的结果获取一起使用时会发生,特别是在调用 orm query.count() 时。

    参考文献: #2427

  • [sql] [bug]

    修复了非 C 版本中基于属性的列访问在行上会引发 AttributeError,而 C 版本会引发 NoSuchColumnError 的问题。 现在在两种情况下都引发 AttributeError。

    参考文献: #2398

  • [sql] [bug]

    添加了支持,可以使用 Column 的 .key 作为结果集行中的字符串标识符。 .key 当前被列为列的 “备用” 名称,并被具有该键值作为其常规名称的列的名称取代。 对于 SQLAlchemy 的下一个主要版本,我们可能会反转此优先级,以便 .key 优先,但这尚未决定。

    参考文献: #2392

  • [sql] [bug]

    当 insert() 或 update() 构造的 values() 子句中声明了不存在的列时,会发出警告。 将在 0.8 中移动到异常。

    参考文献: #2413

  • [sql] [bug]

    对标记如何应用于 SELECT 语句中的列进行了重大更改,允许使用 “截断” 标记,即在 Python 中生成的标记名称超过最大标识符长度(请注意,这可以通过 create_engine() 上的 label_length 配置),以便在子查询内部呈现时正确引用,以及使用其原始 Python 名称存在于结果集行中。

    参考文献: #2396

  • [sql] [bug]

    修复了新的 “autoload_replace” 标志中的错误,该错误会导致无法保留反射表的主键约束。

    参考文献: #2402

  • [sql] [bug]

    当传递的参数无法解释为列或表达式时,Index 将引发异常。 当创建完全没有列的 Index 时,将发出警告。

    参考文献: #2380

mysql

  • [mysql] [feature]

    添加了对 MySQL 索引和主键约束类型(即 USING)的支持,通过 Index 和 PrimaryKeyConstraint 的新 mysql_using 参数,感谢 Diana Clarke。

    参考文献: #2386

  • [mysql] [feature]

    为所有 MySQL 方言添加了对 “isolation_level” 参数的支持。 感谢 mu_mind 在此处的补丁。

    参考文献: #2394

sqlite

  • [sqlite] [bug]

    修复了 C 扩展中的错误,其中字符串格式不会应用于作为整数返回的 Numeric 值; 这主要影响 SQLite,后者不维护数字比例设置。

    参考文献: #2432

mssql

  • [mssql] [feature]

    添加了对 MSSQL INSERT、UPDATE 和 DELETE 表提示的支持,使用 UpdateBase 上的新 with_hint() 方法。

    参考文献: #2430

oracle

  • [oracle] [feature]

    添加了一个新的 create_engine() 标志 coerce_to_decimal=False,禁用精度数字处理,这可能会通过将所有数值转换为 Decimal 来增加大量开销。

    参考文献: #2399

  • [oracle] [bug]

    为 LONG 添加了缺失的编译支持

    参考文献: #2401

  • [oracle] [bug]

    将 ‘LEVEL’ 添加到 Oracle 的保留字列表中。

    参考文献: #2435

0.7.5

发布日期:2012 年 1 月 28 日星期六

orm

  • [orm] [feature]

    为 declarative_base() 添加了 “class_registry” 参数。 允许两个或多个声明式基类共享相同的类名称注册表。

  • [orm] [feature]

    query.filter() 接受多个条件,这些条件将通过 AND 连接,即 query.filter(x==y, z>q, …)

  • [orm] [feature]

    为关系加载器选项添加了新功能,以允许 “默认” 加载器策略。 将 ‘*’ 传递给 joinedload()、lazyload()、subqueryload() 或 noload() 中的任何一个,这将成为用于所有关系的加载器策略,除了 Query 中显式声明的那些关系之外。 感谢冉冉升起的贡献者 Kent Bower 提供了详尽且编写良好的测试套件!

    参考文献: #2351

  • [orm] [feature]

    添加了新的声明式反射示例,说明了如何最好地将表反射与声明式混合,以及如何使用一些新功能。

    参考文献: #2356

  • [orm] [bug]

    修复了在手动调用 rollback() 后自动开始的后续事务中,在失败的 flush 后建立的已修改会话状态将被提交的问题。 在 rollback() 中检查会话状态,如果存在新状态,则会发出警告并第二次调用 restore_snapshot(),丢弃这些更改。

    参考文献: #2389

  • [orm] [bug]

    修复了 0.7.4 中的回归,其中使用来自超类的已检测列作为 “polymorphic_on” 无法解析底层 Column。

    参考文献: #2345

  • [orm] [bug]

    如果 xyzload_all() 与两个未连接的关系不当使用,则引发异常。

    参考文献: #2370

  • [orm] [bug]

    修复了 event.listen(SomeClass) 强制完全不必要的映射器编译的错误,使得在模块导入时很难设置事件(没人注意到这个??)

    参考文献: #2367

  • [orm] [bug]

    修复了 hybrid_property 在 any()、has() 中作为 kw arg 不起作用的错误。

  • [orm] [bug]

    确保所有 ORM 异常的可 pickle 化,以实现多处理兼容性。

    参考文献: #2371

  • [orm] [bug]

    当在不定义 fset 或 fdel 的 hybrid 上使用 setattr/delattr 时,实现了标准的 “无法设置属性” / “无法删除属性” AttributeError。

    参考文献: #2353

  • [orm] [bug]

    修复了如果对象需要在 __eq__() 或类似方法中进行 ORM 属性访问,则未 pickle 化的对象没有设置足够的状态以在可变对象扩展建立的 unpickle() 事件中正确工作的错误。

    参考文献: #2362

  • [orm] [bug]

    修复了 “merge” 级联可能会错误地解释未加载的属性的错误(如果 load_on_pending 标志与 relationship() 一起使用)。 感谢 Kent Bower 的测试。

    参考文献: #2374

  • [orm]

    修复了 0.6 中的回归,其中如果使用了 “load_on_pending” relationship() 标志,并且需要在挂起对象上发出非 “get()” 延迟子句,则加载将失败。

examples

  • [examples] [feature]

    简化了版本控制示例,使其使用声明式 mixin 以及事件侦听器,而不是元类 + SessionExtension。

    参考: #2313

  • [示例] [缺陷]

    修复了 large_collection.py,使其在删除表之前关闭会话。

    参考: #2346

引擎

  • [引擎] [缺陷]

    为 StatementError、DBAPIError 和列错误添加了 __reduce__,以便异常可以被 pickle 化,例如在使用多进程时。然而,并非所有 DBAPI 都支持此功能,例如 psycopg2。

    参考文献: #2371

  • [引擎] [缺陷]

    改进了当非字符串或无效字符串传递给 SQLite 使用的任何日期/时间处理器(包括 C 和 Python 版本)时的错误消息。

    参考: #2382

  • [引擎] [缺陷]

    修复了一个错误,即名为“<a>_<b>”的表绑定 Column 对象,如果它与标记为“<tablename>_<colname>”的列匹配,则可能在结果集行中被不恰当地匹配。

    参考: #2377

  • [引擎] [缺陷]

    修复了“mock”策略中的一个错误,即未调用正确的 DDL 访问方法,导致“CREATE/DROP SEQUENCE”语句被重复。

    参考: #2384

sql

  • [sql] [功能]

    新的反射功能“autoload_replace”;当在 Table 上设置为 False 时,Table 可以在不替换现有列的情况下自动加载。允许构建更灵活的 Table 构建/反射链,包括有助于将声明式与表反射相结合。请参阅 wiki 上的新示例。

    参考文献: #2356

  • [sql] [功能]

    向 sqlalchemy.sql 命名空间添加了“false()”和“true()”表达式构造,但尚未成为 __all__ 的一部分。

  • [sql] [功能]

    方言特定的编译器现在为所有类型/语句编译问题引发 CompileError,而不是 InvalidRequestError 或 ArgumentError。CREATE TABLE 的 DDL 将重新引发 CompileError,以包含有问题列的表/列信息。

    参考: #2361

  • [sql] [缺陷]

    改进了 add_column() 的 API,这样如果将同一列添加到其自己的表,则不会引发错误,并且约束不会加倍。还有助于某些反射/声明式模式。

    参考文献: #2356

  • [sql] [缺陷]

    修复了如果语句根本没有给出任何参数,则不会为 required=True 的 bindparam() 引发“required”异常的问题。

    参考: #2381

mysql

  • [mysql] [缺陷]

    修复了正则表达式,该正则表达式过滤掉非反射的“PARTITION”指令的警告,感谢 George Reilly

    参考: #2376

sqlite

  • [sqlite] [缺陷]

    SQLite 中 FK 约束的“name”被反射为“None”,而不是“0”或其他整数值。SQLite 似乎在任何情况下都不支持约束命名。

    参考: #2364

  • [sqlite] [缺陷]

    sql.false() 和 sql.true() 在 sqlite 中分别编译为 0 和 1

    参考: #2368

  • [sqlite] [缺陷]

    在 SQLite 方言中移除了一个错误的“raise”,当获取表名和视图名时,当逻辑到位以回退到较旧版本的 SQLite(没有“sqlite_temp_master”表)时。

mssql

  • [mssql] [缺陷]

    调整了 mssql.TIME 类型中使用的正则表达式,以确保只接收到值“微秒”部分的六位数字,这是 Python 的 datetime.time() 所期望的。请注意,至少在 pyodbc 中,发送微秒的支持似乎尚不可行。

    参考: #2340

  • [mssql] [缺陷]

    根据报告 pymssql 现在做得更好,取消了对 pymssql 的“30 个字符”限制。pymssql 尚未经过充分测试,并且由于 DBAPI 处于不稳定状态,因此仍不清楚此驱动程序的状态以及 SQLAlchemy 的实现应如何适应。

    参考: #2347

oracle

  • [oracle] [缺陷]

    将 ORA-03135 添加到永无止境的 oracle “连接丢失”错误列表中

    参考: #2388

misc

  • [缺陷] [核心]

    更改了映射器用于缓存 INSERT/UPDATE/DELETE 语句的 LRUCache,使用递增计数器而不是时间戳来跟踪条目,以提高相对于使用 time.time() 的可靠性,time.time() 可能会在某些平台上导致测试失败。

    参考: #2379

  • [缺陷] [核心]

    在池连接代理的弱引用回调中调用“finalize”函数之前,添加了布尔检查,这样当应用程序退出并且 gc 在调用弱引用回调之前从模块中删除了该函数时,不会发出此函数为 None 的警告。

    参考: #2383

  • [缺陷] [py3k]

    修复了 util.py3k 标志的不当使用,并将其重命名为 util.py3k_warning,因为此标志旨在仅检测 -3 标志系列的导入限制。

    参考: #2348

0.7.4

发布日期:2011 年 12 月 9 日星期五

orm

  • [orm] [功能]

    polymorphic_on 现在接受许多新的值类型

    • 不是以其他方式映射的独立表达式

    • column_property() 对象

    • 任何 column_property() 的字符串名称或映射 Column 的属性名称

    文档包含一个使用 case() 构造的示例,这很可能是在此处使用的常见构造。以及部分

    polymorphic_on 中的独立表达式传播到单表继承子类,以便它们用于 WHERE/JOIN 子句中,以将行限制为该子类,这是通常的行为。

    参考: #2238, #2345

  • [orm] [功能]

    IdentitySet 支持 - 运算符,与 difference() 相同,在处理 Session.dirty 等时非常方便。

    参考: #2301

  • [orm] [功能]

    为 Column autoincrement 添加了新值“ignore_fk”,可用于强制在仍属于 ForeignKeyConstraint 的列上进行自动递增。关系文档中的新示例说明了其用法。

  • [orm] [缺陷]

    修复了当从陈旧的一对多关系中删除时,“弹出”多对一值时的反向引用行为 - 操作被跳过,因为多对一关系自那时起已更新。

    参考: #2315

  • [orm] [缺陷]

    在多年未这样做之后,为“X 是 Y 的父级”功能添加了更多粒度,该功能用于确定“Y”上的 FK 是否需要“置为空”以及“Y”是否应使用 delete-orphan 级联删除。该测试现在考虑了父级的 Python 标识及其标识键,以查看 Y 的最后一个已知父级是否绝对是 X。如果无法做出决定,则会引发 StaleDataError。引发此错误的条件相当罕见,需要之前的父级被垃圾回收,并且之前很可能不恰当地更新/删除自那时起已移动到新父级的记录,尽管可能有一些“静默成功”的情况以前会发生,但现在会在面对歧义时引发。使“Y”过期会重置“父级”跟踪器,这意味着 X.remove(Y) 可能最终删除 Y,即使 X 已过期,但这与之前的行为相同;建议在这种情况下也使 X 过期。

    参考: #2264

  • [orm] [缺陷]

    修复了在 query.get() 中的布尔上下文中不恰当地评估用户映射对象的问题。也在 0.6.9 中。

    参考: #2310

  • [orm] [缺陷]

    为 PASSIVE_RETURN_NEVER_SET 符号添加了遗漏的逗号

    参考: #2304

  • [orm] [缺陷]

    Cls.column.collate(“some collation”) 现在可以工作了。也在 0.6.9 中

    参考: #1776

  • [orm] [缺陷]

    复合属性的值在插入或更新操作后现在已过期,而不是就地重新生成。这确保了在刷新中过期的列值将首先加载,然后再使用该值重新生成复合属性。

    参考: #2309

  • [orm] [缺陷]

    该修复还在访问时加载复合值时发出“refresh”事件,即使所有列值都已存在,这也是合适的。这修复了依赖于“load”事件以确保 _parents 字典是最新的“mutable”扩展,修复了问题。感谢 Scott Torborg 在此提供的测试用例。

    参考: #2308, #2309

  • [orm] [缺陷]

    修复了一个错误,即在使用具体继承的子类的子类与新的 ConcreteBase 或 AbstractConcreteBase 结合使用时,将无法将子类应用于每个基类的“多态加载器”超过一层深度。

    参考: #2312

  • [orm] [缺陷]

    修复了一个错误,即在使用新的 AbstractConcreteBase 的子类的子类在生成“base”映射器时将无法获取正确的“base_mapper”属性,从而导致稍后出现故障。

    参考: #2312

  • [orm] [缺陷]

    修复了一个错误,即针对 ORM 级别列创建的 column_property() 在生成某些类型的 joined-inh 连接时可能被视为不同的实体。

    参考: #2316

  • [orm] [缺陷]

    修复了当元组被错误地传递给 session.query() 时引发的错误格式。也在 0.6.9 中。

    参考: #2297

  • [orm] [缺陷]

    现在跟踪对单表继承子类的 query.join() 的调用,并用于消除通常与单表继承一起添加的额外 WHERE.. IN 标准,因为 join 应该容纳它。这允许对单表子类进行 OUTER JOIN 以产生正确的结果,并且总体上将在处理单表继承连接时产生更少的 WHERE 标准。

    参考: #2328

  • [orm] [缺陷]

    __table_args__ 现在可以作为空元组以及空字典传递。感谢 Fayaz Yusuf Khan 的补丁。

    参考: #2339

  • [orm] [缺陷]

    更新了当设置 delete-orphan 而不设置 delete 时的警告消息,不再引用 0.6,因为我们从未将此升级为异常。理想情况下,这可能最好作为异常,但无论哪种方式都不是关键。

    参考: #2325

  • [orm] [缺陷]

    修复了当引用没有值的复合属性时 get_history() 中的错误;为 get_history() 添加了关于复合属性的覆盖,否则它只是一个用户级函数。

示例

  • [示例] [缺陷]

    修复了 history_meta.py 示例中的一个错误,其中未从生成列以放到基类上的单表继承子类中删除“unique”标志。

引擎

  • [引擎] [缺陷]

    修复了一个错误,即如果事务是两阶段或保存点事务,则 transaction.rollback() 会在无效连接上引发错误。对于普通事务,如果连接无效,rollback() 是一个空操作,因此虽然不完全清楚它是否应该是空操作,但至少现在接口是一致的。

    参考: #2317

sql

  • [sql] [功能]

    update() 构造现在可以在 WHERE 子句中容纳多个表,这将呈现 PostgreSQL 和 MSSQL 识别的“UPDATE..FROM”构造。在 MySQL 上编译时,将改为生成“UPDATE t1, t2, ..”。如果将 Column 对象用作“values”参数或生成方法中的键,则 MySQL 还可以针对 SET 子句中的多个表进行呈现。

    参考: #1944, #2166

  • [sql] [功能]

    为类型添加了名为“python_type”的访问器,如果已知,则返回特定 TypeEngine 实例的基本 Python 类型对象,否则引发 NotImplementedError。

    参考: #77

  • [sql] [缺陷]

    相关于 ,对关于 select() 上“from”列表的更改进行了一些调整。_froms 集合不再被记忆,因为这简化了各种用例,并消除了如果列在已在表达式中使用后附加到表时的“警告”的需要 - select() 构造现在将始终生成正确的表达式。这里可能没有实际的性能损失;select() 对象几乎总是临时创建的,并且希望优化 select() 重用的系统将使用“compiled_cache”功能。调用 select.bind 时发生的命中已减少,但绝大多数用户无论如何都不应使用“绑定元数据”:)。

    参考: #2261, #2316

  • [sql] [缺陷]

    进一步调整来自 的修复,以便生成方法在克隆后更好地工作(但这几乎不是用例)。特别是,这允许 with_only_columns() 更一致地运行。为 with_only_columns() 添加了额外的文档,以阐明预期行为,该行为由于 而更改。

    参考: #2261, #2319

schema

  • [schema] [功能]

    添加了对远程“模式”的新支持

  • [schema] [功能]

    Table 上的“extend_existing”标志现在允许反射过程对已定义的 Table 对象生效;当 autoload=True 和 extend_existing=True 都设置时,将从 Table 反射完整的列集,然后将覆盖那些已存在的列,而不是不发生任何活动。但是,直接在自动加载运行中存在的列将像往常一样使用。

    参考: #1410

  • [schema] [缺陷]

    修复了当使用“切换”类型的 TypeDecorator(如 CHAR/UUID 类型)时,TypeDecorator 会为 _type_affinity 返回陈旧值的问题。

  • [schema] [缺陷]

    修复了 Inspector.get_table_names 的“order_by=’foreign_key’”选项未正确实现排序的问题,已替换为现有的排序算法

  • [schema] [缺陷]

    列级 CHECK 约束的“name”(如果存在)现在使用“CONSTRAINT <name> CHECK <expression>”在 CREATE TABLE 语句中呈现。

    参考: #2305

  • [schema]

    MetaData() 接受“schema”和“quote_schema”参数,这些参数将应用于 Table 或 Sequence 的同名参数,这些参数将其默认值保留为 None

  • [schema]

    Sequence 接受“quote_schema”参数

  • [schema]

    如果 schema 参数显式为“None”,则 Table 的 tometadata() 将使用传入的 MetaData 的“schema”作为新 Table 的 schema。

  • [schema]

    添加了 CreateSchema 和 DropSchema DDL 构造 - 这些构造仅接受模式的字符串名称和一个“quote”标志。

  • [schema]

    当将默认“schema”与 MetaData 一起使用时,ForeignKey 也将在查找远程表时假定“默认”模式。这允许将 MetaData 上的“schema”参数应用于任何其他没有“schema”的 Table 对象集。

  • [schema]

    已经在方言上实现了“has_schema”方法,但目前仅在 PostgreSQL 上有效。由 Manlio Perillo 提供。

    参考: #1679

postgresql

  • [postgresql] [功能]

    为 pg.ENUM 添加了 create_type 构造函数参数。当为 False 时,将不会执行 CREATE/DROP 或类型检查作为表创建/删除事件的一部分;只有直接调用的 create()/drop)() 方法才会执行此操作。有助于 Alembic “离线”脚本。

  • [postgresql] [缺陷]

    PostgreSQL 方言记忆特定名称的 ENUM 在创建/删除序列期间被处理。这允许创建/删除序列在没有任何“checkfirst”调用的情况下工作,并且还意味着在启用“checkfirst”的情况下,它只需要检查 ENUM 一次。

    参考: #2311

mysql

  • [mysql] [缺陷]

    Unicode 调整允许最新的 pymysql(0.4 之后)在 Python 2 上 100% 通过测试。

mssql

  • [mssql] [功能]

    取消了 SQL Server 上 SAVEPOINT 的限制。所有测试都通过了,但尚不清楚是否存在更深层次的问题。

    参考: #822

  • [mssql] [缺陷]

    修复了 with_hint() 功能,该功能在 MSSQL 上未正确实现 - 通常用于 “WITH (NOLOCK)” 提示(无论如何您都不应该使用它!请改用快照隔离 :) )

    参考: #2336

  • [mssql] [缺陷]

    使用新的 pyodbc 版本检测来获取 _need_decimal_fix 选项。

    参考: #2318

  • [mssql] [缺陷]

    不要在 SQL Server 2000 上将“表名”强制转换为 NVARCHAR。但是,对于使 PyODBC 与 FreeTDS 0.91 完全配合使用所需的咒语,仍然大多处于黑暗之中。

    参考: #2343

  • [mssql] [缺陷]

    在检索索引名称列表以及这些索引中列的名称时,解码传入的值。

    参考: #2269

misc

  • [功能] [ext]

    在混合文档中添加了一个“transformer”示例 - 一种混合体,它返回一个查询转换可调用对象,并结合了自定义比较器。使用 Query 上的一个新方法 with_transformation()。这里的用例相当实验性,但仅向 Query 添加了一行代码。

  • [缺陷] [pyodbc]

    基于 pyodbc 的方言现在可以准确解析 pyodbc,包括观察到的 pyodbc 字符串,包括 “py3-3.0.1-beta4” 等。

    参考: #2318

  • [缺陷] [ext]

    当不存在“default”编译处理程序时,@compiles 装饰器会引发信息丰富的错误消息,而不是 KeyError。

0.7.3

发布日期:2011 年 10 月 16 日星期日

general

  • [general]

    调整了“importlater”机制,该机制在内部用于解决导入循环,这样当完成 sqlalchemy 或 sqlalchemy.orm 的导入时,__import__ 的使用就完成了,从而避免在应用程序启动新线程后使用 __import__,修复了问题。也在 0.6.9 中。

    参考: #2279

orm

  • [orm]

    改进了 query.join(),这样“left”侧可以更灵活地成为非 ORM 可选择对象,例如子查询。放置在 select_from() 中的可选择对象现在将用作左侧,优先于映射实体的隐式使用。如果由于缺少外键而导致 join 仍然失败,则错误消息将包含此详细信息。感谢 IRC 上的 brianrhude 提供的测试用例。

    参考: #2298

  • [orm]

    添加了 after_soft_rollback() Session 事件。无论是否发生了实际的 DBAPI 级别回滚,只要调用 rollback() 就会无条件地触发此事件。此事件专门设计用于在 Session.is_active 为 True 时允许在回滚后继续对 Session 进行操作。

    参考: #2241

  • [orm]

    为 orm.aliased() 构造添加了 “adapt_on_names” 布尔标志。允许 aliased() 构造将 ORM 实体链接到包含聚合或特定属性的其他派生形式的可选择对象,前提是名称与实体映射列的名称相同。

  • [orm]

    为 column_property() 添加了新的标志 expire_on_flush=False,将那些否则将被视为“只读”的属性(即从 SQL 表达式派生的属性)标记为在刷新发生后保留其值,包括父对象本身是否参与了更新。

  • [orm]

    增强了 ORM 中的检测,以支持 Py3K 的新的“required kw arguments”参数样式,即 fn(a, b, *, c, d), fn(a, b, *args, c, d)。映射对象的 __init__ 方法的参数签名将被保留,包括必需的 kw 规则。

    参考: #2237

  • [orm]

    修复了工作单元中的一个错误,即在高度互连的模式中检测类之间的“循环”不会产生确定性结果;因此有时会遗漏一些应被视为循环的节点,并导致后续问题。请注意,此错误也存在于 0.6 中;目前未向后移植。

    参考: #2282

  • [orm]

    修复了 0.6 中的各种 synonym()-相关的回归

    • 现在可以对同义词创建同义词了。

    • 针对 relationship() 创建的同义词可以传递给 query.join(),发送给 query.options() 的选项,按名称传递给 query.with_parent()。

  • [orm]

    修复了一个错误,即 mapper.order_by 属性在子查询急切加载中的“内部”查询中会被忽略。也在 0.6.9 中。

    参考: #2287

  • [orm]

    Identity map .discard() 在内部使用 dict.pop(,None) 而不是 “del” 来避免非确定性 gc 拆卸期间的 KeyError/warning

    参考: #2267

  • [orm]

    修复了新的复合重写中的回归,其中由于缺少导入而导致 deferred=True 选项失败

    参考: #2253

  • [orm]

    恢复了 composite() 的 “comparator_factory” 参数,该参数在 0.7 发布时被删除。

    参考: #2248

  • [orm]

    修复了 query.join() 中的一个错误,该错误会在复杂的多个重叠路径场景中发生,其中同一个表可能会被连接两次。非常感谢 Dave Vitek 在此处提供的出色修复。

    参考: #2247

  • [orm]

    当切片时,Query 会将零的 OFFSET 转换为 None,这样就不会调用不必要的 OFFSET 子句。

  • [orm]

    修复了当新映射器上的关系将在第一个映射器上建立反向引用时,映射器将无法完全更新内部状态的边缘情况。

  • [orm]

    修复了一个错误,即如果重新定义了 __eq__(),则关系多对一延迟加载将命中 __eq__() 并失败。不适用于 0.6.9。

    参考: #2260

  • [orm]

    调用 class_mapper() 并传入一个不是 “type”(即,可能被映射的类)的对象,现在会引发信息更丰富的 ArgumentError,而不是 UnmappedClassError。

    参考文献: #2196

  • [orm]

    新的事件钩子,MapperEvents.after_configured()。在 configure() 步骤完成且映射器实际上受到影响后调用。理论上,此事件每个应用程序调用一次,除非在已使用现有映射后构建新的映射。

  • [orm]

    当打开的 Session 被垃圾回收时,其中剩余的对象在被 add()-ed 到新的 Session 时被再次视为 detached。这是通过额外的检查来完成的,即先前的 “session_key” 实际上并不存在于 Session 池中。

    参考文献: #2281

  • [orm]

    新的声明式功能

    • __declare_last__() 方法,为类方法建立一个事件监听器,该方法将在映射器完成最终的 “configure” 步骤时被调用。

    • __abstract__ 标志。当此类上存在此标志时,该类将根本不会被映射。

    • 新的辅助类 ConcreteBase、AbstractConcreteBase。允许使用声明式进行具体映射,在调用 “configure” 映射器步骤时自动设置 “polymorphic_union”。

    • 映射器本身具有半私有方法,允许在已配置映射器后将 “with_polymorphic” selectable 分配给它。

    参考文献: #2239

  • [orm]

    当子类的基类对常规列使用 @declared_attr 时,声明式将发出警告 - 此属性不会传播到子类。

    参考文献: #2283

  • [orm]

    用于将映射实例与其所属 Session 链接的整数 “id” 现在由序列生成函数而不是 id(Session) 生成,以消除回收 id() 值导致不正确结果的可能性,无需检查对象是否实际在会话中。

    参考文献: #2280

  • [orm]

    行为改进:空 conjunctions 例如 and_() 和 or_() 将在封闭 conjunction 的上下文中被展平,即 and_(x, or_()) 将产生 ‘X’ 而不是 ‘X AND ()’。

    参考文献: #2257

  • [orm]

    修复了关于 select() 元素的 “from” 列表计算的错误。“from” 计算现在被延迟,因此如果构造使用尚未附加到 Table 的 Column 对象,但稍后与 Table 关联,它将生成使用表作为 FROM 的 SQL。此更改相当深入地影响了 FROM 列表以及 “correlates” 集合的计算机制,因为一些 “clause adaption” 方案(这些方案在 ORM 中被大量使用)依赖于 “froms” 集合通常会在适配完成之前被缓存的事实。 重新设计使其允许 “froms” 集合可以随时清除和重新生成。

    参考文献: #2261

  • [orm]

    修复了如果传递了 selectable,Select 的 with_only_columns() 方法将失败的错误。在 0.6.9 中也存在。

    参考文献: #2270

例子

  • [examples]

    调整了 dictlike-polymorphic.py 示例以应用 CAST,使其在 PG 和其他数据库上工作。在 0.6.9 中也存在。

    参考文献: #2266

引擎

  • [engine]

    所有 pool 类中的 recreate() 方法都使用 self.__class__ 来获取要生成的池的类型,以防子类化。请注意,通常不需要子类化池。

    参考文献: #2254

  • [engine]

    改进了多参数语句日志记录,长绑定参数集列表将被压缩,并带有压缩正在进行的提示信息。异常消息使用相同的改进格式。

    参考文献: #2243

  • [engine]

    向 pool.manage(dbapi).connect() 添加了可选的 “sa_pool_key” 参数,以便不必序列化 args。

  • [engine]

    create_engine() 支持的入口点解析现在支持在内置或入口点解析的 dialect 之上解析单个 DBAPI 驱动程序,使用标准 ‘+’ 表示法 - 它在作为入口点解析之前转换为 ‘.’。

    参考文献: #2286

  • [engine]

    在 connect 中为 “return unicode detection” 步骤添加了异常捕获 + 警告,允许在 NVARCHAR 上崩溃的数据库继续初始化,假设未实现 NVARCHAR 类型。

    参考文献: #2299

schema

  • [schema]

    修改了 Column.copy() 以使用 _constructor(),它默认为 self.__class__,以便创建新对象。这允许更容易地支持子类化 Column。

    参考文献: #2284

  • [schema]

    为 SchemaItem 类添加了一个稍微友好的 __repr__()。请注意,这里的 repr 不能完全支持 “repr 是构造函数” 的想法,因为 schema items 可以非常深入地嵌套/循环,并且某些东西的初始化较晚等。

    参考文献: #2223

postgresql

  • [postgresql]

    为 Index() 添加了 “postgresql_using” 参数,生成 USING 子句以指定 PG 的索引实现。感谢 Ryan P. Kelly 的补丁。

    参考文献: #2290

  • [postgresql]

    当使用 postgresql+psycopg2 dialect 时,向 create_engine() 添加了 client_encoding 参数;在连接时使用该值调用 psycopg2 set_client_encoding() 方法。

    参考文献: #1839

  • [postgresql]

    修复了与 PG 9 中相同的修改索引行为影响重命名列上的主键反射相关的错误。在 0.6.9 中也存在。

    参考文献: #2141, #2291

  • [postgresql]

    Table、Sequence 的反射函数不再区分大小写。名称可能仅在大小写上有所不同,并且将被正确区分。

    参考文献: #2256

  • [postgresql]

    使用原子计数器作为服务器端游标名称的 “随机数” 源;在极少数情况下报告了冲突。

  • [postgresql]

    缩小了在当前搜索路径中反射具有 schema 的外键引用表时所做的假设;仅当显式 schema 实际与也具有显式 schema 的引用表的 schema 匹配时,才将显式 schema 应用于引用表。 以前,假定 “current” schema 与完整的 search_path 同义。

    参考文献: #2249

mysql

  • [mysql]

    CREATE TABLE 将把 COLLATE 选项放在 CHARSET 之后,这似乎是 MySQL 关于它是否真的会工作的任意规则的一部分。在 0.6.9 中也存在。

    参考文献: #2225

  • [mysql]

    为 Index 构造添加了 mysql_length 参数,指定索引的 “length”。

    参考文献: #2293

sqlite

  • [sqlite]

    确保对于从数据库解析的非法 date/time/datetime 字符串,无论是否使用 C 扩展,都会引发相同的 ValueError。

mssql

  • [mssql]

    更改以尝试支持带有 Pyodbc 的 FreeTDS 0.91。这包括当检测到 FreeTDS 0.91 时,字符串绑定作为 Python unicode 对象发送,并且当我们检测到表时使用 CAST(? AS NVARCHAR)。 但是,我仍然认为 Pyodbc + FreeTDS 0.91 的行为非常糟糕,仍然有很多查询(例如在反射中使用的查询)会导致 Linux 上的核心转储,并且在 OSX 上根本不可用,MemoryErrors 很多,并且纯粹的 unicode 支持已损坏。

    参考文献: #2273

  • [mssql]

    从 0.8 开始,当将标量 select 与值进行比较时,=/!= 的行为将不再产生 IN/NOT IN;此行为有点过于强硬(如果您想发出 IN,请使用 in_()),现在发出弃用警告。 要立即获得 0.8 行为并消除警告,请访问 https://sqlalchemy.org.cn/docs/07/dialects/mssql.html#scalar-select-comparisons 处的编译器配方,以覆盖 visit_binary() 的行为。

    参考文献: #2277

  • [mssql]

    “0” 被接受为 limit() 的参数,它将产生 “TOP 0”。

    参考文献: #2222

oracle

  • [oracle]

    修复了 zxjdbc dialect 的 ReturningResultProxy。 0.6 的回归。

    参考文献: #2272

  • [oracle]

    String 类型现在在 Oracle 上生成 VARCHAR2,建议将其作为默认的 VARCHAR。 向 Oracle dialect 添加了显式的 VARCHAR2 和 NVARCHAR2。 使用 NVARCHAR 仍然生成 “NVARCHAR2” - Oracle 上没有 “NVARCHAR” - 这仍然是 “大写类型总是完全给出该类型” 策略的轻微破坏。 VARCHAR 仍然生成 “VARCHAR”,与该策略保持一致。 如果 Oracle 将来定义 “VARCHAR” 为他们声称的不同的东西(恕我直言,这永远不会发生),该类型将可用。

    参考文献: #2252

misc

  • [types]

    除了 “precision” 和 “asdecimal” 之外,基本 Float 类型的额外关键字参数将被忽略; 此处添加了弃用警告和附加文档,与以下内容相关

    参考文献: #2258

  • [ext]

    SQLSoup 将不会包含在 SQLAlchemy 0.8 版本中; 虽然有用,但我们希望保持 SQLAlchemy 本身专注于一种 ORM 用法范例。 SQLSoup 有望很快被第三方项目取代。

    参考文献: #2262

  • [ext]

    向 AssociationProxy 添加了 local_attr、remote_attr、attr 访问器,提供对类级别的代理属性的快速访问。

    参考文献: #2236

  • [ext]

    更改了关联代理字典上的 update() 方法以使用鸭子类型方法,即检查 “keys”,以区分 update({}) 和 update((a, b))。 以前,将具有元组作为键的字典传递将被误解为序列。

    参考文献: #2275

0.7.2

发布日期:2011 年 7 月 31 日 星期日

orm

  • [orm]

    功能增强:joined 和 subquery loading 现在将在已存在的关联对象和集合中遍历,以搜索在定义 eager load 的整个范围内未填充的属性,以便通过映射或查询选项指定的 eager loading 无条件地为整个深度发生,填充任何尚未填充的内容。 以前,如果关联对象或集合已经存在,则此遍历将停止,从而导致行为不一致(尽管会为已加载的图节省加载/周期)。 对于 subqueryload,这意味着 subqueryload 发出的额外 SELECT 语句将无条件调用,无论现有图已存在多少(因此存在争议)。 当查询是属性启动的 lazyload 的结果时,“停止” 的先前行为仍然有效,否则当重复遇到相同的关联对象时,“N+1” 样式的集合迭代可能会变得不必要地昂贵。 还有一个尚未公开的生成式 Query 方法 _with_invoke_all_eagers(),它选择旧/新行为

    参考文献: #2213

  • [orm]

    ORM 中 “replacement traversal” 的重新设计,因为它更改了 selectables 以针对事物的别名(即 clause adaption),包括修复了针对 joined table 结构的 multiply-nested any()/has() 构造。

    参考文献: #2195

  • [orm]

    修复了 query.join() + aliased=True 从 joined-inh 结构到自身在 relationship() 上,连接条件在子表上的错误,该错误会不适当地将 lead entity 转换为 joined entity。 在 0.6.9 中也存在。

    参考文献: #2234

  • [orm]

    修复了 0.6 的回归,其中 Session.add() 对包含 None 在集合中的对象执行会引发内部异常。 恢复到 0.6 的行为,即接受 None,但显然没有任何内容被持久化。 理想情况下,集合中存在 None 或在 append() 上至少应发出警告,这正在考虑用于 0.8。

    参考文献: #2205

  • [orm]

    在无法找到行的对象上加载 deferred() 属性会引发 ObjectDeletedError,而不是稍后失败; 改进了 ObjectDeletedError 中的消息,以包含除简单 “删除” 之外的其他条件。

    参考文献: #2191

  • [orm]

    修复了 0.6 的回归,其中在某些 relationship() 基于属性上进行 get history 操作会在 lazyload 发出时失败; 这可能会在某些条件下的 flush() 中触发。 感谢提交出色测试的用户。

    参考文献: #2224

  • [orm]

    修复了仅在 Python 3 中明显的错误,其中在 flush 期间对 persistent + pending 对象进行排序会产生非法比较,如果 persistent 对象主键不是单个整数。 在 0.6.9 中也存在

    参考文献: #2228

  • [orm]

    修复了如果针对将多个实体组合在一起的列表达式,query.join() 使用的源子句将不一致的错误。 在 0.6.9 中也存在

    参考文献: #2197

  • [orm]

    修复了如果映射类将 __hash__() 或 __eq__() 重新定义为非标准内容(SQLA 永远不应咨询这些,这是一个受支持的用例),如果该类是 “composite”(即非单实体)结果集的一部分,则会咨询这些方法的错误。 在 0.6.9 中也存在。

    参考文献: #2215

  • [orm]

    向 Mapper 添加了公共属性 “.validators”,这是一个使用 @validates 装饰器装饰的所有属性的不可变字典视图。 由 Stefano Fontanelli 提供

    参考文献: #2240

  • [orm]

    修复了一个微妙的错误,如果发生以下情况,该错误会导致 SQL 崩溃:column_property() 针对子查询 + joinedload + LIMIT + order by column property()。 在 0.6.9 中也存在

    参考文献: #2188

  • [orm]

    with_parent 以及使用针对父级的 “动态” 关系产生的连接条件将生成唯一的 bindparams,而不是错误地重复相同的 bindparam。 在 0.6.9 中也存在。

    参考文献: #2207

  • [orm]

    将与 relationship.order_by、foreign_keys、remote_side 等接收用户参数时使用的相同 “仅列” 检查添加到 mapper.polymorphic_on。

  • [orm]

    修复了将列表达式与 Query() 进行比较不会在底层 SELECT 语句上调用 as_scalar() 以生成标量子查询的错误,就像您在 Query().subquery() 上调用它时发生的那样。

    参考文献: #2190

  • [orm]

    修复了声明式错误,其中从同名超类继承的类会由于在 _decl_class_registry 中不必要的名称查找而失败。

    参考文献: #2194

  • [orm]

    修复了 Query 中的 “no statement condition” 断言,如果在调用 from_statement() 后调用了生成方法,则会尝试引发该断言。 在 0.6.9 中也存在。

    参考文献: #2199

例子

  • [examples]

    修复了 examples/versioning 测试运行器,使其不再依赖 SQLAlchemy 测试库,nosetests 必须从 examples/versioning 中运行才能绕过 setup.cfg 破坏它。

  • [examples]

    调整了 examples/versioning 以在多级继承情况下选择正确的外键。

  • [examples]

    修复了 attribute shard 示例,以在 0.7 样式中正确检查 bind param callable。

引擎

  • [engine]

    Connection.begin() 提供的上下文管理器将在 commit() 失败时(而不仅仅是在发生异常时)发出 rollback()。

  • [engine]

    在 Python 2.6 及更高版本中使用 urllib.parse_qsl(),没有关于 cgi.parse_qsl() 的弃用警告

    参考文献: #1682

  • [engine]

    添加了 mixin 类 sqlalchemy.ext.DontWrapMixin。 此类型的用户定义异常在语句执行上下文中发生时永远不会包装在 StatementException 中。

  • [engine]

    StatementException 包装将在消息中显示原始异常类。

  • [engine]

    connect 上的 dbapi.Error 失败会将错误转发到 dialect.is_disconnect(),如果 dialect 知道这是一个可能 “可重试” 的条件,则设置 “connection_invalidated” 标志。 目前仅为 Oracle ORA-01033 实施。

    参考文献: #2201

sql

  • [sql]

    修复了 selectable 中涉及列对应关系的两个微妙错误,一个错误是重复相同的 labeled subquery,另一个错误是 label 已被 “分组” 并丢失了自身。 影响。

    参考文献: #2188

schema

  • [schema]

    新功能:所有类型上的 with_variant() 方法。 生成 Variant() 的实例,Variant() 是一种特殊的 TypeDecorator,它将根据正在使用的 dialect 选择不同类型的用法。

    参考文献: #2187

  • [schema]

    当 ForeignKeyConstraint 引用父级中未找到的列名时,添加了信息性错误消息。 在 0.6.9 中也存在。

  • [schema]

    修复了旧的 append_ddl_listener() 函数的适配将意外的 **kw 传递给 Table 事件的错误。 Table 没有 kws,0.6 中的 MetaData 事件将获得 “tables=somecollection”,此行为被保留。

    参考文献: #2206

  • [schema]

    修复了如果类型没有 “affinity” 值,Table 上的 “autoincrement” 检测将失败的错误,特别是当在站点上使用将 TypeEngine 用作 “impl” 的 UUID 示例时,会发生这种情况。

  • [schema]

    为 TypeEngine 对象添加了改进的 repr(),它将仅显示位置参数或偏离默认值的 kwargs 构造函数参数。

    参考文献: #2209

postgresql

  • [postgresql]

    为 Index 添加了新的 “postgresql_ops” 参数,允许为索引列指定 PostgreSQL 运算符类。 由 Filip Zyzniewski 提供。

    参考文献: #2198

mysql

  • [mysql]

    修复了 OurSQL dialect 以使用 ansi-neutral 引号符号 “'” 代替 ‘”’ 用于 XA 命令。 在 0.6.9 中也存在。

    参考文献: #2186

sqlite

  • [sqlite]

    SQLite dialect 不再剥离反射默认值的引号,从而允许 round trip CREATE TABLE 工作。 这与其他也保持默认值的确切形式的 dialects 一致。

    参考文献: #2189

mssql

  • [mssql]

    调整了 pyodbc dialect,以便在检测到 “Easysoft” unix 驱动程序时,绑定值作为字节而不是 unicode 传递。 这与 FreeTDS 发生的行为相同。 如果在某些情况下传递 Python unicodes,Easysoft 似乎会发生段错误。

oracle

  • [oracle]

    将 ORA-00028 添加到断开连接代码,使用 cx_oracle _Error.code 获取代码,。 在 0.6.9 中也存在。

    参考文献: #2200

  • [oracle]

    将 ORA-01033 添加到断开连接代码,可以在连接事件期间捕获该代码。

    参考文献: #2201

  • [oracle]

    修复了 oracle.RAW 类型,该类型未生成正确的 DDL。 在 0.6.9 中也存在。

    参考文献: #2220

  • [oracle]

    将 CURRENT 添加到保留字列表。 在 0.6.9 中也存在。

    参考文献: #2212

  • [oracle]

    修复了 mutable extension 中的错误,其中如果在一次映射中使用了两次相同的类型,则第一个属性之后的属性将不会被检测。

  • [oracle]

    修复了 mutable extension 中的错误,其中如果设置了 None 或非对应的类型,则会引发错误。 现在接受 None,它将 None 分配给所有属性,非法值引发 ValueError。

0.7.1

发布日期:2011 年 6 月 5 日 星期日

general

  • [常规]

    为 Python 漏洞 7511 添加了一个解决方法,该漏洞指出在 Windows 64 位 + VC express 上,C 扩展构建失败时不会引发适当的异常

    参考: #2184

orm

  • [orm]

    现在允许在自引用关系上使用 “delete-orphan” 级联 - 这是因为 SQLA 0.7 不再在 ORM 级别强制执行 “父级无子级”;此检查留给外键可空性。相关于

    参考: #1912

  • [orm]

    修复了新的 “mutable” 扩展以正确地将事件传播到子类;也不要为子类创建多个事件监听器。

    参考: #2180

  • [orm]

    修改了当在 flush 上未检测到 “identity” 键时出现的消息文本,以包含 Column 未设置为正确检测自动递增的常见原因;也在 0.6.8 中。

    参考: #2170

  • [orm]

    修复了事务级 “deleted” 集合不会清除已驱逐状态的错误,如果它们后来变为瞬态,则会引发错误。也在 0.6.8 中。

    参考: #2182

engine

  • [engine]

    弃用 Connection/Engine 上面向 schema/SQL 的方法,这些方法从未广为人知且是多余的:reflecttable()、create()、drop()、text()、engine.func

  • [engine]

    调整了 RowProxy 结果行的 __contains__() 方法,使其内部不会生成异常抛出;NoSuchColumnError() 也将生成其消息,而不管列构造是否可以被强制转换为字符串。也在 0.6.8 中。

    参考: #2178

sql

  • [sql]

    修复了 metadata.reflect(bind) 会关闭作为 bind 参数传递的 Connection 的错误。0.6 版本的回归。

  • [sql]

    简化了 Select 确定其 ‘.c’ 集合中内容的过程。行为相同,只是传递给 select([]) 的原始 ClauseList() (无论如何这不是一个有文档记录的情况)现在将被扩展为它的各个列元素,而不是被忽略。

postgresql

  • [postgresql]

    一些关于数字数组、MATCH 运算符的单元测试修复。修复了一个潜在的浮点不准确问题,并且 MATCH 运算符的某些测试目前仅在面向 EN 的区域设置中执行。也在 0.6.8 中。

    参考: #2175

mysql

  • [mysql]

    单元测试在 Windows 上安装的 MySQL 上 100% 通过。

  • [mysql]

    移除了 “调整大小写” 步骤,该步骤在 Windows 上使用混合大小写名称反射表时会失败。在对 Windows MySQL 服务器进行了一些实验之后,已确定此步骤实际上并没有在很大程度上帮助解决问题;MySQL 在非 Windows 平台上也不会返回具有正确大小写的外键名称,并且移除该步骤至少允许反射的行为更像在其他操作系统上的行为。这里已经考虑过警告,但很难确定在什么条件下可以引发这样的警告,因此暂时搁置 - 而是添加了一些文档。

    参考: #2181

  • [mysql]

    如果使用 MySQLdb 并且 DBAPI 不提供 constants.CLIENT 模块,则 supports_sane_rowcount 将设置为 False。

sqlite

  • [sqlite]

    当调用 “PRAGMA read_uncommitted” 以确定连接时的当前隔离模式并默认为 SERIALIZABLE 时,接受来自 cursor.fetchone() 的 None;这是为了支持 3.3.0 之前的 SQLite 版本,这些版本没有此功能。

    参考: #2173

0.7.0

发布日期:2011 年 5 月 20 日星期五

orm

  • [orm]

    修复了 0.7b4 (!) 中引入的回归,即 query.options(someoption(“nonexistent name”)) 将无法引发错误。还为选项尝试基于基于列的元素构建的情况添加了额外的错误捕获,进一步修复了一些定制的错误消息

    参考: #2069

  • [orm]

    query.count() 发出 “count(*)” 而不是 “count(1)”。

    参考: #2162

  • [orm]

    微调了来自 self()、union() 或其他 “select from myself” 操作时的 Query 子句调整,以便添加到 filter()、order_by() 等的纯 SQL 表达式元素,这些元素存在于嵌套的 “from myself” 查询中, 以与 ORM 表达式元素相同的方式进行调整,因为这些元素否则不易访问。

    参考: #2155

  • [orm]

    修复了当 joined-inh 子类与自身相关,或者 joined-inh 子类与该子类的子类相关,且连接条件中子子类中没有列时,“自引用” 关系的确定会失败的错误,且没有解决方法。也在 0.6.8 中。

    参考: #2149

  • [orm]

    mapper() 在确定父类和子类之间的继承条件时,将忽略与无关表的未配置外键,但对于关于继承表的未解析列和表名,将像往常一样引发异常。这是先前已应用于声明性的行为的增强泛化。0.6.8 具有更保守的版本,该版本从根本上不会改变连接条件的确定方式。

    参考: #2153

  • [orm]

    当给定实体不是单个完整类实体或 mapper (即列)时调用 query.get() 是错误的。这是 0.6.8 中的弃用警告。

    参考: #2144

  • [orm]

    修复了在某些情况下可能与身份映射一起发生的潜在 KeyError,属于

    参考: #2148

  • [orm]

    添加了 Query.with_session() 方法,将 Query 切换为使用不同的会话。

  • [orm]

    水平分片查询应按照 per 连接使用执行选项,如

    参考: #2131

  • [orm]

    non_primary mapper 将继承 primary mapper 的 _identity_class。这样,针对通常在继承映射中的类建立的 non_primary 将生成与 primary mapper 的身份映射兼容的结果(也在 0.6.8 中)

    参考: #2151

  • [orm]

    修复了为 “无法为目标列 ‘q’ 执行 syncrule;mapper ‘X’ 未映射此列” 发出的错误消息,以引用正确的 mapper。也在 0.6.8 中。

    参考: #2163

  • [orm]

    polymorphic_union() 获取 “cast_nulls” 选项,禁用在渲染标记的 NULL 列时使用 CAST。

    参考: #1502

  • [orm]

    polymorphic_union() 按照它们在多态联合列表中出现的第一个表/selectable 中的原始表顺序渲染列。(这本身是一个无序映射,除非您传递 OrderedDict)。

  • [orm]

    修复了如果使用日志记录,映射到匿名别名的 mapper 会因别名名称中未转义的 % 符号而失败的错误。也在 0.6.8 中。

    参考: #2171

examples

  • [examples]

    移除了旧的 “polymorphic association” 示例,并替换为一组更新的示例,这些示例使用声明性 mixin,“generic_associations”。每个示例都展示了一种替代的表布局。

sql

  • [sql]

    修复了将 select() 的 label 与另一个 label 嵌套会导致导出列不正确的错误。除此之外,这会破坏针对另一个 column_property() 的 ORM column_property() 映射。也在 0.6.8 中

    参考: #2167

  • [sql]

    更改了连接条件确定中的处理方式,以便仅在给定的两个表之间考虑外键错误。也就是说,t1.join(t2) 将报告涉及 ‘t1’ 或 ‘t2’ 的外键错误,但涉及 ‘t3’ 的任何内容都将被跳过。这会影响 join(),以及 ORM 关系和继承条件逻辑。

  • [sql]

    对 execute 过程内部的错误处理进行了一些改进,以确保在发生非常不寻常的 DBAPI 错误时,自动关闭连接确实已关闭。

  • [sql]

    metadata.reflect() 和 reflection.Inspector() 有一些依赖 GC 来关闭内部获取的连接,已修复此问题。

  • [sql]

    添加了对 Column .name 被分配为空字符串时的显式检查

    参考: #2140

  • [sql]

    修复了如果 FetchedValue 传递给列 server_onupdate,则不会分配其父 “column” 的错误,为所有列默认分配模式添加了测试覆盖率。也在 0.6.8 中

    参考: #2147

postgresql

  • [postgresql]

    修复了 psycopg2 方言中的 psycopg2_version 解析。

  • [postgresql]

    修复了影响 PG 9 的错误,其中如果索引反射针对名称已更改的列,则会失败。也在 0.6.8 中。

    参考: #2141

mssql

  • [mssql]

    修复了 MSSQL 方言中的错误,其中应用于 schema 限定表的别名会泄漏到封闭的 select 语句中。也在 0.6.8 中。

    参考: #2169

misc

  • [no_tags]

    本节记录了从 0.7b4 到 0.7.0 的这些更改。有关 SQLAlchemy 0.7 中新增功能的概述,请参阅 https://docs.sqlalchemy.org.cn/en/latest/changelog/migration_07.html

  • [documentation]

    从 ext.mutable 文档中移除了 “collections.MutableMapping” abc 的用法,因为它被错误地使用,并且在任何情况下都使示例更难以理解。

    参考: #2152

  • [ext]

    修复了 sqlalchemy.ext.mutable 扩展中的错误,其中 None 未被适当处理,替换事件未被适当处理。

    参考: #2143

0.7.0b4

发布日期:2011 年 4 月 17 日星期日

general

  • [常规]

    更改了此文件 CHANGES 的格式。格式更改已应用于 0.7 版本。

  • [常规]

    “-declarative” 更改现在将直接在 “-orm” 部分下列出,因为这些更改密切相关。

  • [常规]

    0.5 系列更改已移动到文件 CHANGES_PRE_06,该文件替换了 CHANGES_PRE_05。

  • [常规]

    0.6.7 及 0.6 系列后续版本的更改日志现在仅在 0.6 分支中的 CHANGES 文件中列出。在 0.7 CHANGES 文件(即此文件)中,所有 0.6 更改都内联列在它们也应用的 0.7 部分中(因为所有 0.6 更改也在 0.7 中)。此处适用于 0.6 版本的更改以及实现/行为中是否存在任何差异都会被注明。

orm

  • [orm]

    对调用 query.update()、query.delete() 时的 “evaluate” 和 “fetch” 评估进行了一些修复。记录的检索在所有情况下都在 autoflush 之后完成,并在发出 update/delete 之前完成,防止未刷新的数据存在以及过期对象在评估期间失败。

    参考: #2122

  • [orm]

    重新措辞了在尝试 flush 不针对超类型进行多态处理的子类时引发的异常。

    参考: #2063

  • [orm]

    当查询选项找不到目标实体时,仍然进行更多措辞调整。解释路径必须来自根实体之一。

  • [orm]

    对关于 backref 的状态处理进行了一些修复,通常在 autoflush=False 时,其中 back-referenced 集合无法正确处理没有净更改的添加/移除。感谢 Richard Murri 提供的测试用例 + 补丁。(也在 0.6.7 中)。

    参考: #2123

  • [orm]

    在 UOW 内部添加了检查,以检测到在主键值中包含 NULL 的情况下被要求 UPDATE 或 DELETE 的异常情况。

    参考: #2127

  • [orm]

    对属性历史记录进行了一些改进。0.8 中可能会有更多更改待定,但目前已修改历史记录,以便标量历史记录不会产生为不存在的值填充 None 的 “副作用”。这允许稍微更好地区分 None 设置和没有实际更改,也会影响到。

    参考: #2127

  • [orm]

    如果使用了 from_self(),则 “having” 子句将从内部复制到外部查询;特别是这会破坏 0.7 样式的 count() 查询。(也在 0.6.7 中)

    参考: #2130

  • [orm]

    Query.execution_options() 方法现在将这些选项传递给 Connection 而不是 SELECT 语句,以便可以使用包括隔离级别和编译缓存的所有可用选项。

    参考: #2131

engine

  • [engine]

    现在默认在 CPython 2.x 上启用 C 扩展,如果编译失败,则回退到纯 Python。

    参考: #2129

sql

  • [sql]

    “compiled_cache” 执行选项现在在传递给 SELECT 语句而不是 Connection 时会引发错误。以前它被完全忽略了。我们可能会在某个时候研究让此选项在每个语句级别上工作。

    参考: #2131

  • [sql]

    恢复了基本 TypeEngine 类上的 “catchall” 构造函数,并带有弃用警告。这样,执行类似 Integer(11) 的代码仍然可以成功。

  • [sql]

    修复了从 unpickling 返回的 MetaData() 没有跟踪它现在跟踪的新事物(即 Sequence 对象集合、schema 名称列表)的回归。

    参考: #2104

  • [sql]

    select() 的 limit/offset 关键字以及传递给 select.limit()/offset() 的值将被强制转换为整数。(也在 0.6.7 中)

    参考: #2116

  • [sql]

    修复了从 over() 子句收集 “from” 子句将是 itertools.chain() 而不是列表的错误,导致与其他子句组合时出现 “只能连接列表” TypeError。

  • [sql]

    修复了 over() 子句中 “,” 的不正确用法,该用法放置在 “partition” 和 “order by” 子句之间。

    参考: #2134

  • [sql]

    PrimaryKeyConstraint 的 before/after attach 事件现在起作用,为所有约束类型的 before/after 事件添加了测试。

    参考: #2105

  • [sql]

    向表达式库添加了显式的 true()/false() 构造 - 强制规则会将 “False”/”True” 拦截到这些构造中。在 0.6 中,这些构造通常直接转换为字符串,这在 0.7 中不再被接受。

    参考: #2117

schema

  • [schema]

    Table 上的 ‘useexisting’ 标志已被一对新标志 ‘keep_existing’ 和 ‘extend_existing’ 取代。‘extend_existing’ 等同于 ‘useexisting’ - 返回现有 Table,并添加额外的构造函数元素。使用 ‘keep_existing’,返回现有 Table,但不添加额外的构造函数元素 - 这些元素仅在 Table 新创建时应用。

    参考: #2109

postgresql

  • [postgresql]

    现在支持 Python 3 的 Psycopg2。

  • [postgresql]

    修复了使用 pg8000 时对 precision numerics 的支持。

    参考: #2132

sqlite

  • [sqlite]

    修复了将外键创建为 “REFERENCES <tablename>” 而没有列名时反射会失败的错误。(也在 0.6.7 中)

    参考: #2115

oracle

  • [oracle]

    对于列本身或名称生成的绑定参数需要引号的列名,例如带有特殊字符、下划线、非 ASCII 字符的名称,现在在与 cx_oracle 通信时可以正确转换绑定参数键。(也在 0.6.7 中)

    参考: #2100

  • [oracle]

    Oracle 方言添加了 use_binds_for_limits=False create_engine() 标志,将内联渲染 LIMIT/OFFSET 值而不是作为绑定,据报告可以修改 Oracle 使用的执行计划。(也在 0.6.7 中)

    参考: #2116

misc

  • [types]

    REAL 已添加到核心类型中。PostgreSQL、SQL Server、MySQL、SQLite 支持。请注意,SQL Server 和 MySQL 版本(添加了额外的参数)仍然可以从这些方言中使用。

    参考: #2081

  • [types]

    添加了 @event.listens_for() 装饰器,给定目标 + 事件名称,将修饰函数应用为监听器。

    参考: #2106

  • [pool]

    AssertionPool 现在存储了指示当前检出的连接是在何处获取的回溯;此回溯在第二次并发检出时引发的断言中报告;由 Gunnlaugur Briem 提供

    参考: #2103

  • [pool]

    “pool.manage” 功能不再使用 pickle 来哈希每个池的参数。

  • [documentation]

    记录了 SQLite DATE/TIME/DATETIME 类型。(也在 0.6.7 中)

    参考: #2029

  • [documentation]

    修复了 mutable 扩展文档以显示正确的类型关联方法。

    参考: #2118

0.7.0b3

发布日期:2011 年 3 月 20 日星期日

general

  • [常规]

    在 PyPy 下运行时对单元测试进行了大量修复(由 Alex Gaynor 提供)。

orm

  • [orm]

    更改了 query.count() 的底层方法。query.count() 现在在所有情况下都完全是

    query.

    from_self(func.count(literal_column(‘1’))).scalar()

    也就是说,“select count(1) from (<full query>)”。这在所有情况下都会生成子查询,但大大简化了 count() 之前尝试做的所有猜测,这在许多情况下仍然会失败,尤其是在涉及连接表继承和其他连接时。如果为原本非常简单的 count 生成的子查询确实是一个问题,请使用 query(func.count()) 作为优化。

    参考: #2093

  • [orm]

    关于迭代期间罕见的 weakref 回调的身份映射的一些更改。互斥锁已被移除,因为它显然可能会导致重入(即在一个线程中)死锁,可能是在 gc 在迭代点收集对象以获得更多内存时。希望 “迭代期间字典已更改” 将非常罕见,因为迭代方法在内部通过单个 values() 调用获取完整对象列表。请注意,0.6.7 在此处进行了更保守的修复,该修复仍然保留了互斥锁。

    参考: #2087

  • [orm]

    对工作单元的调整使其即使在给定对象在内存中没有任何属性间引用时,也沿 relationship() 依赖关系对 flush 进行排序,这在 0.5 和更早版本中的行为是这样,因此仅设置外键/主键的 Parent/Child 的 flush 将会成功。同时仍然保持 0.6 及更高版本不会在 flush 中生成大量无用的内部依赖结构,而这些结构与当前 flush 中的实际状态不对应。

    参考: #2082

  • [orm]

    改进了在查询仅列实体时,结合(通常是不正确地)使用加载器选项时发出的错误消息,其中父实体未完全存在。

    参考: #2069

  • [orm]

    修复了 query.options() 中的错误,其中应用于使用字符串键的 lazyload 的路径可能会与错误实体上同名的属性重叠。请注意,0.6.7 对此进行了更保守的修复。

    参考: #2098

examples

  • [examples]

    更新了 association、association proxy 示例以使用声明性,添加了一个新的示例 dict_of_sets_with_default.py,这是一个 “突破界限” 的 association proxy 示例。

  • [examples]

    Beaker 缓存示例允许 query_callable() 函数使用 “query_cls” 参数。(也在 0.6.7 中)

    参考: #2090

engine

  • [engine]

    修复了 AssertionPool 回归错误。

    参考: #2097

  • [engine]

    当指定无效的方言时,将引发的异常更改为 ArgumentError。

    参考: #2060

sql

  • [sql]

    为 Column 被子类化并且 _make_proxy() 由于构造函数上的 TypeError 而无法复制的情况添加了完全描述性的错误消息。在这种情况下,应实现方法 _constructor。

  • [sql]

    为 Table 对象添加了新的事件 “column_reflect”。在反射中生成对象之前,接收关于 Column 的信息字典,并允许修改字典以控制结果 Column 的大多数方面,包括键、名称、类型、信息字典。

    参考: #2095

  • [sql]

    为了帮助将 “column_reflect” 事件与特定的 Table 对象而不是 Table 的所有实例一起使用,可以将侦听器添加到 Table 对象,方法是在其构造函数中内联使用新的参数 “listeners”,参数形式为 (<eventname>, <fn>) 的元组列表,这些元组在反射过程开始之前应用于 Table。

  • [sql]

    添加了新的通用函数 “next_value()”,接受 Sequence 对象作为其参数,并在目标平台上渲染适当的 “next value” 生成字符串(如果支持)。还在 Sequence 本身提供了 “.next_value()” 方法。

    参考: #2085

  • [sql]

    func.next_value() 或其他 SQL 表达式可以直接嵌入到 insert() 构造中,并且如果隐式或显式 “returning” 与主键列结合使用,则新生成的值将出现在 result.inserted_primary_key 中。

    参考文献: #2084

  • [sql]

    为 ResultProxy 添加了访问器 “returns_rows”, “is_insert” (也在 0.6.7 中)

    参考文献: #2089

postgresql

  • [postgresql]

    为 postgresql 方言添加了 RESERVED_WORDS。(也在 0.6.7 中)

    参考文献: #2092

  • [postgresql]

    修复了 BIT 类型以允许 “length” 参数和 “varying” 参数。同时修复了反射。(也在 0.6.7 中)

    参考文献: #2073

mssql

  • [mssql]

    重写了用于获取视图定义的查询,通常在使用 Inspector 接口时,使用 sys.sql_modules 而不是 information_schema,从而允许完整返回超过 4000 个字符的视图定义。(也在 0.6.7 中)

    参考文献: #2071

misc

  • [declarative]

    在 __mapper_args__ 中,不可 “哈希” 的参数不会被误认为是始终可哈希的、可能为列的参数。(也在 0.6.7 中)

    参考文献: #2091

  • [firebird]

    如果 create_engine() 上的 “implicit_returning” 标志设置为 False,则会遵守该标志。(也在 0.6.7 中)

    参考文献: #2083

  • [informix]

    添加了 RESERVED_WORDS informix 方言。(也在 0.6.7 中)

    参考文献: #2092

  • [ext]

    horizontal_shard ShardedSession 类接受常见的 Session 参数 “query_cls” 作为构造函数参数,以进一步子类化 ShardedQuery。(也在 0.6.7 中)

    参考: #2090

0.7.0b2

发布日期:2011 年 2 月 19 日星期六

orm

  • [orm]

    修复了 Session.merge() 会使用过少的参数调用 load() 事件的错误。

    参考文献: #2053

  • [orm]

    添加了逻辑,防止从 MapperExtension 或 SessionExtension 生成事件时,为所有未被覆盖的方法生成无操作事件。

    参考文献: #2052

examples

  • [examples]

    Beaker 示例现在考虑了 ‘limit’ 和 ‘offset’,当生成缓存键时,会考虑嵌入式 FROM 子句(例如当您使用 union() 或 from_self() 时)中的绑定参数。

sql

  • [sql]

    将 EngineEvents 事件类重命名为 ConnectionEvents。由于最终用户代码永远不会直接访问这些类,因此这严格来说是最终用户的文档更改。还简化了事件如何在内部链接到引擎和连接。

    参考文献: #2059

  • [sql]

    Sequence() 构造函数,当通过其 ‘metadata’ 参数传递 MetaData() 对象时,将包含在 metadata.create_all() 和 metadata.drop_all() 中的 CREATE/DROP 语句中,包括 “checkfirst” 逻辑。

    参考文献: #2055

  • [sql]

    Column.references() 方法现在返回 True,如果它具有完全引用给定列的外键,而不仅仅是其父表。

    参考文献: #2064

postgresql

  • [postgresql]

    修复了 0.6 版本的一个回归错误,其中 SMALLINT 和 BIGINT 类型都会在整数 PK 列上生成 SERIAL,而不是 SMALLINT 和 BIGSERIAL

    参考文献: #2065

misc

  • [declarative]

    修复了回归错误,其中内联放置 Column 对象的 composite() 将无法初始化。Column 对象现在可以与 composite() 内联,也可以是外部的,并通过名称或对象引用引入。

    参考文献: #2058

  • [declarative]

    修复了引用旧 @classproperty 名称的错误消息,以引用 @declared_attr (也在 0.6.7 中)

    参考文献: #2061

  • [declarative]

    __table_args__ 元组末尾的字典现在是可选的。

    参考文献: #1468

  • [ext]

    当将多对一标量属性代理到一对多集合时(即 ‘典型’ 关联代理用例的反向),关联代理现在对于 any()、has() 和 contains() 具有正确的行为

    参考文献: #2054

0.7.0b1

发布日期:2011 年 2 月 12 日星期六

general

  • [general]

    新的事件系统,取代了所有扩展、监听器等。

    参考文献: #1902

  • [general]

    日志增强功能

    参考文献: #1926

  • [general]

    安装程序不再安装 Nose 插件

    参考文献: #1949

  • [general]

    sys.modules 中的 “sqlalchemy.exceptions” 别名已被删除。基本 SQLA 异常可通过 “from sqlalchemy import exc” 获得。“exceptions” 作为 “exc” 的别名仍然保留在 “sqlalchemy” 中,只是没有修补到 sys.modules 中。

orm

  • [orm]

    query.join(target, onclause) 的更简洁形式

    参考文献: #1923

  • [orm]

    混合属性,实现/取代 synonym()

    参考文献: #1903

  • [orm]

    复合属性的重写

    参考文献: #2008

  • [orm]

    突变事件扩展,取代 “mutable=True”

  • [orm]

    默认情况下禁用 PickleType 和 ARRAY 的可变性

    参考文献: #1980

  • [orm]

    简化的 polymorphic_on 分配

    参考文献: #1895

  • [orm]

    允许刷新没有父对象的孤立对象

    参考: #1912

  • [orm]

    调整了 flush 记账步骤,使其在 autocommit=True 的情况下在提交之前发生。这允许 autocommit=True 与 expire_on_commit=True 适当地协同工作,并且还允许后刷新会话钩子在与 autocommit=False 相同的事务上下文中运行。

    参考文献: #2041

  • [orm]

    当集合成员、标量引用不属于刷新时,会生成警告

    参考文献: #1973

  • [orm]

    可以映射非 Table-派生的构造

    参考文献: #1876

  • [orm]

    改进了 Query 中的元组标签名称

    参考文献: #1942

  • [orm]

    映射的列属性首先引用最具体的列

    参考文献: #1892

  • [orm]

    映射到具有两个或多个同名列的连接需要显式声明

    参考文献: #1896

  • [orm]

    Mapper 要求 polymorphic_on 列存在于映射的可选择项中

    参考文献: #1875

  • [orm]

    compile_mappers() 重命名为 configure_mappers(),简化了配置内部结构

    参考文献: #1966

  • [orm]

    aliased() 函数,如果传递一个 SQL FromClause 元素(即,不是映射的类),将返回 element.alias(),而不是在 AliasedClass 上引发错误。

    参考文献: #2018

  • [orm]

    Session.merge() 将检查传入状态的版本 ID 是否与数据库中的版本 ID 匹配,假设映射使用版本 ID 并且传入状态已分配 version_id,如果它们不匹配,则引发 StaleDataError。

    参考文献: #2027

  • [orm]

    Session.connection(), Session.execute() 接受 ‘bind’,以允许 execute/connection 操作显式参与引擎的打开事务。

    参考文献: #1996

  • [orm]

    Query.join(),Query.outerjoin(),eagerload(),eagerload_all() 等不再允许属性列表作为参数(即 option([x, y, z]) 形式,自 0.5 起已弃用)

  • [orm]

    ScopedSession.mapper 已删除(自 0.5 起已弃用)。

  • [orm]

    水平分片查询将 ‘shard_id’ 放置在 context.attributes 中,load() 事件可以在其中访问它。

    参考文献: #2031

  • [orm]

    跨多个实体的单个 contains_eager() 调用将指示应加载该路径上的所有集合,而不是要求每个端点都有不同的 contains_eager() 调用(这从未正确记录在文档中)。

    参考文献: #2032

  • [orm]

    orm.aliased() 中使用的 “name” 字段现在在生成的 SQL 语句中呈现。

  • [orm]

    Session weak_instance_dict=False 已弃用。

    参考文献: #1473

  • [orm]

    在集合上发生 append 或类似事件,且父对象已被取消引用(这会阻止父对象在会话中标记为 “dirty”)的异常情况下,会引发异常。在 0.6.6 中是一个警告。

    参考文献: #2046

  • [orm]

    Query.distinct() 现在接受列表达式作为 *args,PostgreSQL 方言将其解释为 DISTINCT ON (<expr>)。

    参考文献: #1069

  • [orm]

    在 flush() 期间对 “多对一” 关系加载进行了额外的调整。版本 0.6.6 ([ticket:2002]) 中的更改要求在 flush 期间可能发生更多 “不必要” 的 m2o 加载。已添加额外的加载模式,以便在这种特定用例中修剪发出的 SQL,同时仍然检索 flush 需要的信息,以避免遗漏任何内容。

    参考文献: #2049

  • [orm]

    传递给 attributes.get_history() 的 “passive” 值应为 attributes 包中定义的常量之一。发送 True 或 False 已弃用。

  • [orm]

    Query.subquery() 添加了 name 参数,以允许为别名对象分配固定名称。(也在 0.6.7 中)

    参考文献: #2030

  • [orm]

    当连接表继承的映射器在其本地映射表上没有主键时(但在超类表上有主键),会发出警告。(也在 0.6.7 中)

    参考文献: #2019

  • [orm]

    修复了多态层次结构中的 “中间” 类,如果它也没有指定 ‘polymorphic_identity’,则没有 ‘polymorphic_on’ 列的错误,导致刷新时出现奇怪的错误,从该目标查询时加载了错误的类。在使用单表继承时,也会发出正确的 WHERE 条件。(也在 0.6.7 中)

    参考文献: #2038

  • [orm]

    修复了从使用 include_properties 或 exclude_properties 的映射中排除的具有 SQL 或服务器端默认值的列会导致 UnmappedColumnError 的错误。(也在 0.6.7 中)

    参考文献: #1995

  • [orm]

    在集合上发生 append 或类似事件,且父对象已被取消引用的异常情况下,会发出警告,这会阻止父对象在会话中标记为 “dirty”。这将在 0.7 中成为异常。(也在 0.6.7 中)

    参考文献: #2046

sql

  • [sql]

    添加了 over() 函数,FunctionElement 类的 方法,生成 _Over() 构造,该构造反过来生成 “窗口函数”,即 “<窗口函数> OVER (PARTITION BY <partition by>, ORDER BY <order by>)”。

    参考文献: #1844

  • [sql]

    LIMIT/OFFSET 子句现在使用绑定参数

    参考文献: #805

  • [sql]

    select.distinct() 现在接受列表达式作为 *args,PostgreSQL 方言将其解释为 DISTINCT ON (<expr>)。请注意,这已经可以通过将列表传递给 select() 的 distinct 关键字参数来使用。

    参考文献: #1069

  • [sql]

    select.prefix_with() 接受多个表达式(即 *expr),select() 的 ‘prefix’ 关键字参数接受列表或元组。

  • [sql]

    为了发出特殊的 MySQL 关键字(DISTINCTROW 等),将字符串传递给 select()distinct 关键字参数已被弃用 - 请使用 prefix_with() 来代替。

  • [sql]

    TypeDecorator 适用于主键列

    参考文献: #2005, #2006

  • [sql]

    DDL() 构造函数现在转义百分号

    参考文献: #1897

  • [sql]

    Table.c / MetaData.tables 稍微改进了一下,不允许直接变异

    参考文献: #1893, #1917

  • [sql]

    传递给 bindparam() 的可调用对象不会被求值

    参考文献: #1950

  • [sql]

    types.type_map 现在是私有的,types._type_map

    参考文献: #1870

  • [sql]

    非公共 Pool 方法以下划线开头

    参考文献: #1982

  • [sql]

    添加了 NULLS FIRST 和 NULLS LAST 支持。它作为 asc() 和 desc() 运算符的扩展实现,称为 nullsfirst() 和 nullslast()。

    参考文献: #723

  • [sql]

    Index() 构造函数可以与 Table 定义内联创建,使用字符串作为列名,作为在 Table 外部创建索引的替代方法。

  • [sql]

    Connection 上的 execution_options() 接受 “isolation_level” 参数,仅为该连接设置事务隔离级别,直到返回连接池,对于那些支持它的后端(SQLite,PostgreSQL)

    参考文献: #2001

  • [sql]

    Integer 的 TypeDecorator 可以与主键列一起使用,并且各种方言的 “autoincrement” 功能以及 “sqlite_autoincrement” 标志将尊重底层数据库类型为基于 Integer 的类型。

    参考文献: #2005

  • [sql]

    当 Integer PK 列上存在 server_default 时,建立了一致性。SQLA 不会预先获取这些,它们也不会在 cursor.lastrowid (DBAPI) 中返回。确保所有后端在这种情况下始终在 result.inserted_primary_key 中返回 None。关于这种情况的反射,具有 server_default 的 int PK 列的反射将 “autoincrement” 标志设置为 False,除非在 PG SERIAL 列的情况下,我们检测到序列默认值。

    参考文献: #2020, #2021

  • [sql]

    结果行处理器应用于预执行的 SQL 默认值以及 cursor.lastrowid,以确定 result.inserted_primary_key 的内容。

    参考文献: #2006

  • [sql]

    select 的 “columns clause” 中存在的绑定参数现在像其他 “匿名” 子句一样自动标记,这在其他方面允许它们的 “type” 在获取行时变得有意义,例如在结果行处理器中。

  • [sql]

    TypeDecorator 存在于 “sqlalchemy” 导入空间中。

  • [sql]

    execute() 调用范围内发生的非 DBAPI 错误现在被包装在 sqlalchemy.exc.StatementError 中,并且包含 SQL 语句的文本和 params 的 repr()。这使得更容易识别在 DBAPI 参与之前失败的语句执行。

    参考文献: #2015

  • [sql]

    直接将 “.bind” 与 ClauseElement 关联的概念已明确移至 Executable,即描述表示引擎可执行构造的 ClauseElement 的混入。此更改是对内部组织的改进,不太可能影响任何实际使用。

    参考文献: #2048

  • [sql]

    Column.copy(),在 table.tometadata() 中使用时,会复制 ‘doc’ 属性。(也在 0.6.7 中)

    参考文献: #2028

  • [sql]

    向 resultproxy.c 扩展添加了一些 defs,以便该扩展可以在 Python 2.4 上编译和运行。(也在 0.6.7 中)

    参考文献: #2023

  • [sql]

    编译器扩展现在支持覆盖 expression._BindParamClause 的默认编译,包括 insert()/update() 语句的 VALUES/SET 子句中的自动生成绑定也将使用新的编译规则。(也在 0.6.7 中)

    参考文献: #2042

  • [sql]

    SQLite 方言现在对基于文件的数据库使用 NullPool

    参考文献: #1921

  • [sql]

    作为 sqlite 数据库位置给出的路径现在通过 os.path.abspath() 进行规范化,以便进程中的目录更改不会影响相对文件路径的最终位置。

    参考文献: #2036

postgresql

  • [postgresql]

    当显式序列执行派生 SERIAL 列的自动生成序列的名称时,目前仅当 implicit_returning=False 时才会发生这种情况,现在如果表 + 列名超过 63 个字符,则使用与 PostgreSQL 相同的逻辑。(也在 0.6.7 中)

    参考文献: #1083

  • [postgresql]

    向 “断开连接” 异常列表添加了一条额外的 libpq 消息,“could not receive data from server”(无法从服务器接收数据)(也在 0.6.7 中)

    参考文献: #2044

mysql

  • [mysql]

    为 pymysql 提供新的 DBAPI 支持,pymysql 是 MySQL-python 的纯 Python 端口。

    参考文献: #1991

  • [mysql]

    oursql 方言在 create_engine() 中接受与 MySQLdb 相同的 “ssl” 参数。(也在 0.6.7 中)

    参考文献: #2047

mssql

  • [mssql]

    String/Unicode 类型及其对应项 VARCHAR/NVARCHAR 在未指定长度时发出 “max” 作为长度,以便默认长度(通常根据 SQL Server 文档为 ‘1’)改为 ‘unbounded’(无界)。VARBINARY 类型也发生这种情况。

    此行为使这些类型与 PostgreSQL 的 VARCHAR 类型更加兼容,后者在未指定长度时也类似地是无界的。

    参考文献: #1833

misc

  • [no_tags]

    以下每个更改的详细描述请见:https://docs.sqlalchemy.org.cn/en/latest/changelog/migration_07.html

  • [declarative]

    为在声明性类上将名称 ‘metadata’ 用于列属性的情况添加了显式检查。(也在 0.6.7 中)

    参考文献: #2050

  • [firebird]

    进行了一些调整,以便也支持 Interbase。FB/Interbase 版本标识符被解析为诸如 (8, 1, 1, ‘interbase’) 或 (2, 1, 588, ‘firebird’) 之类的结构,以便可以区分它们。

    参考文献: #1885