0.6 变更日志

0.6.9

发布日期: Sat May 05 2012

常规

  • [常规]

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

    参考链接: #2279

ORM

  • [ORM] [bug]

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

    参考链接: #2310

  • [ORM] [bug]

    修复了当元组被意外传递给 session.query() 时引发的错误格式。

    参考链接: #2297

  • [ORM]

    修复了当针对将多个实体组合在一起的列表达式使用 query.join() 时,源子句会不一致的 bug。

    参考链接: #2197

  • [ORM]

    修复了仅在 Python 3 中出现的 bug,如果持久对象的 primary key 不是单个整数,则在 flush 期间对持久 + 待处理对象进行排序会产生非法比较。

    参考链接: #2228

  • [ORM]

    修复了以下 bug:从连接继承结构到其自身的 relationship() 上使用 query.join() + aliased=True,并且连接条件在子表上,则会将主实体不恰当地转换为连接实体。

    参考链接: #2234

  • [ORM]

    修复了 mapper.order_by 属性在子查询预先加载中的 “内部” 查询中被忽略的 bug。

    参考链接: #2287

  • [ORM]

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

    参考链接: #2215

  • [ORM]

    修复了当以下情况发生时导致 SQL 崩溃的细微 bug:column_property() 针对子查询 + joinedload + LIMIT + 按 column_property() 排序。

    参考链接: #2188

  • [ORM]

    with_parent 生成的连接条件以及对父级使用 “dynamic” relationship 时,将生成唯一的 bindparam,而不是错误地重复相同的 bindparam。

    参考链接: #2207

  • [ORM]

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

    参考链接: #2199

  • [ORM]

    Cls.column.collate(“some collation”) 现在可以正常工作。

    参考链接: #1776

示例

  • [示例]

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

    参考链接: #2266

引擎

  • [引擎]

    向后移植了 0.7.4 中引入的修复程序,该程序确保连接处于有效状态,然后才尝试在保存点和两阶段事务上调用 rollback()/prepare()/release()。

    参考链接: #2317

SQL

  • [SQL]

    修复了可选对象中列对应关系的两个细微 bug,一个 bug 是重复相同的标记子查询,另一个 bug 是标记已 “分组” 并丢失自身。影响。

    参考链接: #2188

  • [SQL]

    修复了当 String 类型与某些方言一起使用时,“unicode 警告” 标志会被设置的 bug。此 bug 不在 0.7 中。

  • [SQL]

    修复了如果传递了可选对象,则 Select 的 with_only_columns() 方法将失败的 bug。但是,FROM 行为在此处仍然不正确,因此在任何情况下,您都需要 0.7 才能使此用例可用。

    参考链接: #2270

模式

  • [模式]

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

PostgreSQL

  • [PostgreSQL]

    修复了与 PG 9 中相同的修改索引行为影响重命名的列上的 primary key 反射相关的 bug。

    参考链接: #2141, #2291

MySQL

  • [MySQL]

    修复了 OurSQL 方言以使用 ansi 中性引号符号 “’” 代替 ‘”’ 用于 XA 命令。

    参考链接: #2186

  • [MySQL]

    CREATE TABLE 将 COLLATE 选项放在 CHARSET 之后,这似乎是 MySQL 关于它是否实际工作的任意规则的一部分。

    参考链接: #2225

MSSQL

  • [MSSQL] [bug]

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

    参考链接: #2269

Oracle

  • [Oracle]

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

    参考链接: #2200

  • [Oracle]

    修复了 oracle.RAW 类型,该类型未生成正确的 DDL。

    参考链接: #2220

  • [Oracle]

    将 CURRENT 添加到保留字列表。

    参考链接: #2212

0.6.8

发布日期: Sun Jun 05 2011

ORM

  • [ORM]

    针对基于列的实体调用 query.get() 是无效的,此条件现在会引发弃用警告。

    参考链接: #2144

  • [ORM]

    非 primary 的 mapper 将继承 primary mapper 的 _identity_class。这样,针对通常在继承映射中的类建立的非 primary mapper 将产生与 primary mapper 的标识映射兼容的结果

    参考链接: #2151

  • [ORM]

    向后移植了 0.7 的标识映射实现,该实现不使用互斥锁进行删除。这是因为某些用户尽管在 0.6.7 中进行了调整,但仍然遇到死锁; 0.7 不使用互斥锁的方法似乎不会产生 “字典大小已更改” 问题,这是互斥锁的最初理由。

    参考链接: #2148

  • [ORM]

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

    参考链接: #2163

  • [ORM]

    修复了以下 bug:对于连接继承子类与自身相关,或连接继承子类与该子类的子类相关,且连接条件中子子类中没有列的情况,“自引用” relationship 的确定将失败,且没有解决方法。

    参考链接: #2149

  • [ORM]

    在确定父类和子类之间的继承条件时,mapper() 将忽略未配置的与不相关表的 foreign key。这等效于已应用于声明式行为的行为。请注意,0.7 对此有更全面的解决方案,更改了 join() 本身确定 FK 错误的方式。

    参考链接: #2153

  • [ORM]

    修复了以下 bug:如果使用了日志记录,则映射到匿名别名的 mapper 将失败,原因是别名名称中存在未转义的 % 符号。

    参考链接: #2171

  • [ORM]

    修改了在 flush 时未检测到 “identity” 键时发生的消息文本,以包含 Column 未设置为正确检测自动递增的常见原因。

    参考链接: #2170

  • [ORM]

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

    参考链接: #2182

引擎

  • [引擎]

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

    参考链接: #2178

SQL

  • [SQL]

    修复了以下 bug:如果将 FetchedValue 传递给列 server_onupdate,则不会为其分配父级 “column”,为所有列默认分配模式添加了测试覆盖。

    参考链接: #2147

  • [SQL]

    修复了以下 bug:将 select() 的 label 与另一个 label 嵌套会导致导出的列不正确。除此之外,这将破坏针对另一个 column_property() 的 ORM column_property() 映射。

    参考链接: #2167

PostgreSQL

  • [PostgreSQL]

    修复了影响 PG 9 的 bug,如果针对名称已更改的列,索引反射将失败。

    参考链接: #2141

  • [PostgreSQL]

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

    参考链接: #2175

MSSQL

  • [MSSQL]

    修复了 MSSQL 方言中的 bug,其中应用于模式限定表的别名会泄漏到封闭的 select 语句中。

    参考链接: #2169

  • [MSSQL]

    修复了 DATETIME2 类型在结果集或绑定参数中使用时会在 “adapt” 步骤中失败的 bug。此问题不在 0.7 中。

    参考链接: #2159

0.6.7

发布日期: Wed Apr 13 2011

ORM

  • [ORM]

    收紧了围绕标识映射迭代的迭代与删除互斥锁,试图减少(极其罕见的)重入 gc 操作导致死锁的可能性。可能会在 0.7 中删除互斥锁。

    参考链接: #2087

  • [ORM]

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

    参考链接: #2030

  • [ORM]

    当连接表继承 mapper 在本地映射表上没有 primary key(但在超类表上有 pk)时,会发出警告。

    参考链接: #2019

  • [ORM]

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

    参考链接: #2038

  • [ORM]

    修复了以下 bug:从使用 include_properties 或 exclude_properties 的映射中排除的具有 SQL 或服务器端默认值的列将导致 UnmappedColumnError。

    参考链接: #1995

  • [ORM]

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

    参考链接: #2046

  • [ORM]

    修复了 query.options() 中的 bug,其中应用于使用字符串键的 lazyload 的路径可能会与错误实体上同名的属性重叠。请注意,0.7 具有此修复程序的更新版本。

    参考链接: #2098

  • [ORM]

    重新措辞了当尝试 flush 不符合超类型的多态子类时引发的异常。

    参考链接: #2063

  • [ORM]

    一些关于 backref 的状态处理的修复,通常在 autoflush=False 时,其中 backref 集合无法正确处理没有净更改的添加/删除。感谢 Richard Murri 提供的测试用例 + 补丁。

    参考链接: #2123

  • [ORM]

    如果使用了 from_self(),则 “having” 子句将从内部复制到外部查询。

    参考链接: #2130

示例

  • [示例]

    Beaker 缓存示例允许向 query_callable() 函数传递 “query_cls” 参数。

    参考链接: #2090

引擎

  • [引擎]

    修复了 QueuePool、SingletonThreadPool 中的 bug,其中通过溢出或定期 cleanup() 丢弃的连接未显式关闭,而是将垃圾回收留给任务。这通常仅影响非引用计数后端,如 Jython 和 PyPy。感谢 Jaimy Azle 发现了这一点。

    参考链接: #2102

SQL

  • [SQL]

    Column.copy(),如 table.tometadata() 中使用的那样,复制 ‘doc’ 属性。

    参考链接: #2028

  • [SQL]

    为 resultproxy.c 扩展添加了一些 def,以便该扩展可以在 Python 2.4 上编译和运行。

    参考链接: #2023

  • [SQL]

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

    参考链接: #2042

  • [SQL]

    为 ResultProxy 添加了访问器 “returns_rows”、“is_insert”

    参考链接: #2089

  • [SQL]

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

    参考链接: #2116

PostgreSQL

  • [PostgreSQL]

    当显式序列执行派生 SERIAL 列的自动生成序列的名称时(目前仅在 implicit_returning=False 时发生),如果表 + 列名大于 63 个字符,现在可以使用与 PostgreSQL 相同的逻辑进行调整。

    参考链接: #1083

  • [PostgreSQL]

    向 “断开连接” 异常列表添加了一条额外的 libpq 消息 “could not receive data from server”

    参考链接: #2044

  • [PostgreSQL]

    为 postgresql 方言添加了 RESERVED_WORDS。

    参考链接: #2092

  • [PostgreSQL]

    修复了 BIT 类型以允许 “length” 参数、“varying” 参数。反射也已修复。

    参考链接: #2073

MySQL

  • [MySQL]

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

    参考链接: #2047

SQLite

  • [SQLite]

    修复了以下 bug:反射以外键创建为 “REFERENCES <tablename>” 而没有列名的情况将失败。

    参考链接: #2115

MSSQL

  • [MSSQL]

    重写了用于获取视图定义的查询,通常在使用 Inspector 接口时,使用 sys.sql_modules 而不是信息模式,从而允许完全返回长度超过 4000 个字符的视图定义。

    参考链接: #2071

Oracle

  • [Oracle]

    使用需要引号的列名,无论是列本身还是名称生成的绑定参数,例如包含特殊字符、下划线、非 ascii 字符的名称,现在在与 cx_oracle 通信时可以正确转换绑定参数键。

    参考链接: #2100

  • [Oracle]

    Oracle 方言添加了 use_binds_for_limits=False create_engine() 标志,将内联呈现 LIMIT/OFFSET 值而不是作为绑定,据报告会修改 Oracle 使用的执行计划。

    参考链接: #2116

杂项

  • [Informix]

    添加了 RESERVED_WORDS informix 方言。

    参考链接: #2092

  • [Firebird]

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

    参考链接: #2083

  • [Ext]

    horizontal_shard ShardedSession 类接受通用的 Session 参数 “query_cls” 作为构造函数参数,以进一步实现 ShardedQuery 的子类化。

    参考链接: #2090

  • [Declarative]

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

    参考链接: #2050

  • [Declarative]

    修复了引用旧 @classproperty 名称的错误消息以引用 @declared_attr

    参考链接: #2061

  • [Declarative]

    __mapper_args__ 中不可 “哈希” 的参数不会被误认为是始终可哈希的、可能为列的参数。

    参考链接: #2091

  • [Documentation]

    记录了 SQLite DATE/TIME/DATETIME 类型。

    参考链接: #2029

0.6.6

发布日期: Sat Jan 08 2011

ORM

  • [ORM]

    修复了以下 bug:在除了先前的可变属性更改之外都是干净的对象上发生的非 “mutable” 属性修改事件将无法在标识映射中强引用自身。这将导致对象被垃圾回收,从而丢失对先前未保存在 “mutable changes” 字典中的任何更改的跟踪。

  • [ORM]

    修复了以下 bug:“passive_deletes=’all’” 未将正确的符号传递给 flush 期间的延迟加载器,从而导致不必要的加载。

    参考链接: #2013

  • [ORM]

    修复了阻止在映射的 select 语句上使用 composite 映射属性的 bug。请注意,composite 的工作方式计划在 0.7 中发生重大变化。

    参考链接: #1997

  • [ORM]

    active_history 标志也添加到 composite()。该标志在 0.6 中不起作用,但它是一个用于向前兼容性的占位符标志,因为它适用于 0.7 中的 composite。

    参考链接: #1976

  • [ORM]

    修复了 uow bug,其中传递给 Session.delete() 的过期对象在删除对象时不会考虑卸载的引用或集合,即使 passive_deletes 保持其默认值 False。

    参考链接: #2002

  • [ORM]

    当在继承 mapper 上指定 version_id_col,而继承的 mapper 已经有一个时,如果这些列表达式不相同,则会发出警告。

    参考链接: #1987

  • [ORM]

    如果该链中的先前连接是外连接,“innerjoin” 标志不会沿着 joinedload() 连接链生效,从而允许在结果中正确返回没有引用子行的主行。

    参考链接: #1954

  • [ORM]

    修复了关于 “subqueryload” 策略的 bug,其中如果实体是 aliased() 构造,则策略将失败。

    参考链接: #1964

  • [ORM]

    修复了关于 “subqueryload” 策略的 bug,其中如果使用从 A->joined-subclass->C 形式的多级加载,则连接将失败

    参考链接: #2014

  • [ORM]

    修复了 Query 对象按 -1 索引的问题。它被错误地转换为导致 IndexError 的空切片 -1:0。

    参考链接: #1968

  • [ORM]

    mapper 参数 “primary_key” 可以作为单个列以及列表或元组传递。已将文档示例(将其说明为标量值)更改为列表。

    参考链接: #1971

  • [ORM]

    为 relationship() 和 column_property() 添加了 active_history 标志,强制属性事件始终加载“旧”值,以便该值可用于 attributes.get_history()。

    参考:#1961

  • [orm]

    如果复合键中的参数数量过多或过少,Query.get() 将引发异常。

    参考:#1977

  • [orm]

    从 0.7 反向移植了“优化的 get”修复,改进了连接继承“加载过期行”行为的生成。

    参考:#1992

  • [orm]

    在 “primaryjoin” 错误信息中添加了更多措辞,针对一种不常见的情况,即连接条件对于 viewonly “有效”,但对于 non-viewonly 无效,并且未使用 foreign_keys - 向建议中添加了 “foreign_keys”。对于通用的 “direction” 错误,也向建议中添加了 “foreign_keys”。

示例

  • [examples]

    版本控制示例现在支持检测关联 relationship() 中的更改。

引擎

  • [engine]

    现在仅当显式使用 Unicode 类型时,才会针对非 Unicode 绑定数据引发“unicode warning”警告;而不是在引擎或 String 类型上使用 convert_unicode=True 时。

  • [engine]

    修复了 Decimal 结果处理器的 C 版本中的内存泄漏。

    参考:#1978

  • [engine]

    为 RowProxy 的 C 版本实现了序列检查功能,以及为 RowProxy 实现了 2.7 风格的 “collections.Sequence” 注册。

    参考:#1871

  • [engine]

    如果未进行事务,Threadlocal 引擎方法 rollback()、commit()、prepare() 将不会引发异常;这是 0.6 中引入的回归。

    参考:#1998

  • [engine]

    Threadlocal 引擎在 begin()、begin_nested() 时返回自身;然后引擎实现 contextmanager 方法以允许使用 “with” 语句。

    参考:#2004

sql

  • [sql]

    修复了单个非结合运算符的多个链的运算符优先级规则。例如,“x - (y - z)” 将编译为 “x - (y - z)”,而不是 “x - y - z”。也适用于标签,例如 “x - (y - z).label(‘foo’)”。

    参考:#1984

  • [sql]

    Column 的 ‘info’ 属性在 Column.copy() 期间被复制,例如在使用声明性 mixin 中的列时。

    参考:#1967

  • [sql]

    为布尔值添加了一个绑定处理器,该处理器强制转换为 int,用于像 pymssql 这样天真地在值上调用 str() 的 DBAPI。

  • [sql]

    CheckConstraint 将在其 copy()/tometadata() 中复制其 ‘initially’、‘deferrable’ 和 ‘_create_rule’ 属性。

    参考:#2000

postgresql

  • [postgresql]

    IN 子句内的单元素元组表达式可以正确地添加括号,也来自

    参考:#1984

  • [postgresql]

    确保 psycopg2 和 pg8000 的 “numeric” 基类型识别每个 numeric、float、int 代码、标量 + 数组。

    参考:#1955

  • [postgresql]

    为 UUID 类型添加了 as_uuid=True 标志,将接收和返回 Python UUID() 对象而不是字符串值。目前,UUID 类型仅已知与 psycopg2 配合使用。

    参考:#1956

  • [postgresql]

    修复了在池 dispose+recreate 发生后,非 ENUM 支持的 PG 版本中会发生 KeyError 的错误。

    参考:#1989

mysql

  • [mysql]

    修复了 Jython + zxjdbc 的错误处理,使 has_table() 属性再次正常工作。来自 0.6.3 的回归(我们没有 Jython buildbot,抱歉)

    参考:#1960

sqlite

  • [sqlite]

    CREATE TABLE 中的 REFERENCES 子句,如果包含对具有相同模式名称的另一个表的远程模式,现在会呈现不带模式子句的远程名称,这是 SQLite 所要求的。

    参考:#1851

  • [sqlite]

    在同一主题下,CREATE TABLE 中的 REFERENCES 子句,如果包含对与父表模式不同的模式的远程模式,则根本不会呈现,因为跨模式引用似乎不受支持。

mssql

  • [mssql]

    索引反射的重写不幸地没有经过正确的测试,并返回了不正确的结果。此回归现已修复。

    参考:#1770

oracle

  • [oracle]

    cx_oracle “十进制检测”逻辑(针对具有不明确数字特征的结果集列进行)现在使用由区域设置/NLS_LANG 设置确定的十进制分隔符,并在首次连接时检测此分隔符。当使用非句点十进制分隔符的 NLS_LANG 设置时,还需要 cx_oracle 5.0.3 或更高版本。

    参考:#1953

misc

  • [firebird]

    Firebird numeric 类型现在显式检查 Decimal,让 float() 直接通过,从而允许特殊值(例如 float(‘inf’))。

    参考:#2012

  • [declarative]

    如果 __table_args__ 不是元组或字典格式,并且不是 None,则会引发错误。

    参考:#1972

  • [sqlsoup]

    为 SqlSoup 添加了 “map_to()” 方法,这是一个 “master” 方法,它接受可选参数,用于可选和映射的每个方面,包括每个映射的基类。

    参考:#1975

  • [sqlsoup]

    与 map()、with_labels()、join() 方法一起使用的映射可选对象不再将给定的参数放入内部 “cache” 字典中。特别是由于 join() 和 select() 对象是在方法本身中创建的,因此这几乎是一种纯粹的内存泄漏行为。

0.6.5

发布日期:2010 年 10 月 24 日星期日

orm

  • [orm]

    添加了一个新的 “lazyload” 选项 “immediateload”。在对象填充时自动发出通常的 “lazy” 加载操作。这里的用例是在加载要放置在离线缓存中,或在会话不可用后使用的对象时,并且需要直接 ‘select’ 加载,而不是 ‘joined’ 或 ‘subquery’。

    参考:#1914

  • [orm]

    新的 Query 方法:query.label(name), query.as_scalar(),将查询的语句作为标量子查询返回,带/不带标签;query.with_entities(*ent),用新实体替换查询的 SELECT 列表。大致相当于 query.values() 的生成形式,它接受映射实体以及列表达式。

    参考:#1920

  • [orm]

    修复了当将对象从一个引用移动到另一个引用时可能发生的递归错误,其中涉及反向引用,并且发起父级是先前父级的子类(具有自己的映射器)。

  • [orm]

    修复了 0.6.4 中的回归,如果您将空列表传递给 mapper() 上的 “include_properties”,则会发生此回归。

    参考:#1918

  • [orm]

    修复了 Query 中的标签错误,如果任何列表达式未标记,则 NamedTuple 会错误地应用标签。

  • [orm]

    修补了一个案例,其中 query.join() 会不适当地将右侧适配到左侧连接的右侧

    参考:#1925

  • [orm]

    Query.select_from() 已得到增强,以帮助确保后续对 query.join() 的调用将使用 select_from() 实体(假设它是一个映射实体而不是一个普通的可选对象)作为默认的 “left” 侧,而不是 Query 对象实体列表中的第一个实体。

  • [orm]

    当会话在子事务回滚后使用时(当在 autocommit=False 模式下刷新失败时会发生这种情况),Session 引发的异常现在已被重新措辞(这是 “由于子事务中的回滚而处于非活动状态” 消息)。特别是,如果回滚是由于 flush() 期间的异常引起的,则消息会说明这种情况,并重申 flush() 期间发生的原始异常的字符串形式。如果会话由于显式使用子事务而关闭(不太常见),则消息仅说明这种情况。

  • [orm]

    在初始化已失败后,重复请求其初始化时,Mapper 引发的异常不再假定 “hasattr” 情况,因为还有其他情况会发出此消息,并且该消息也不会多次复合自身 - 您每次尝试使用都会收到相同的消息。“compiles” 的误称被替换为 “initialize”。

  • [orm]

    修复了 query.update() 中的错误,其中如果列表达式键是具有与实际列名不同的键名的类属性,则 ‘evaluate’ 或 ‘fetch’ 过期将失败。

    参考:#1935

  • [orm]

    在刷新期间添加了一个断言,以确保在 “新持久化” 对象上没有生成持有 NULL 值的标识键。当用户定义的代码无意中触发对未完全加载的对象进行刷新时,可能会发生这种情况。

  • [orm]

    关系属性的延迟加载现在使用外键和主键属性的当前状态,而不是 “已提交” 状态(如果在刷新过程中)。以前,仅使用数据库提交的状态。特别是,这将导致多对一 get()-on-lazyload 操作失败,因为当确定属性时不会触发自动刷新,并且 “已提交” 状态可能不可用。

    参考:#1910

  • [orm]

    relationship() 上的一个新标志 load_on_pending 允许延迟加载器在挂起对象上触发,而无需进行刷新,以及手动 “附加” 到会话的瞬态对象。请注意,当加载对象时,此标志会阻止属性事件发生,因此在刷新后才能使用反向引用。该标志仅适用于非常特定的用例。

  • [orm]

    relationship() 上的另一个新标志 cascade_backrefs,在事件在双向关系的 “反向” 侧启动时禁用 “save-update” 级联。这是一个更清晰的行为,因此可以在瞬态对象上设置多对一关系,而不会将其吸入子对象的会话中,同时仍然允许正向集合级联。我们可能会在 0.7 中将此默认设置为 False。

  • [orm]

    当仅放置在关系的多对一侧时,“passive_updates=False” 的行为略有改进;文档已澄清 passive_updates=False 实际上应该在one-to-many侧。

  • [orm]

    在多对一关系上放置 passive_deletes=True 会发出警告,因为您可能打算将其放在一对多关系侧。

  • [orm]

    修复了阻止 “subqueryload” 与来自子类的关系的单表继承正确工作的错误 - “where type in (x, y, z)” 仅放置在内部,而不是重复放置。

  • [orm]

    当将 from_self() 与单表继承一起使用时,“where type in (x, y, z)” 仅放置在查询的外部,而不是重复放置。可能会对此进行更多调整。

  • [orm]

    如果 Session 已经存在,scoped_session 在调用 configure() 时发出警告(仅检查当前线程)

    参考:#1924

  • [orm]

    重构了 mapper.cascade_iterator() 的内部结构,以在某些情况下将方法调用减少约 9%。

    参考:#1932

引擎

  • [engine]

    修复了 0.6.4 中的回归,其中允许一致地引发游标错误的更改破坏了 result.lastrowid 访问器。已为 result.lastrowid 添加了测试覆盖率。请注意,lastrowid 仅受 Pysqlite 和某些 MySQL 驱动程序支持,因此在一般情况下不是非常有用。

  • [engine]

    引擎在首次使用连接时发出的日志消息现在是 “BEGIN (implicit)”,以强调 DBAPI 没有显式的 begin()。

  • [engine]

    为 metadata.reflect() 添加了 “views=True” 选项,会将可用视图的列表添加到正在反射的视图中。

    参考:#1936

  • [engine]

    engine_from_config() 现在接受 ‘debug’ 作为 ‘echo’,‘echo_pool’,‘force’ 作为 ‘convert_unicode’,布尔值作为 ‘use_native_unicode’。

    参考:#1899

sql

  • [sql]

    修复了 TypeDecorator 中的错误,其中特定于方言的类型被拉入以生成给定类型的 DDL,但这并不总是返回正确的结果。

  • [sql]

    TypeDecorator 现在可以有一个完全构造的类型指定为其 “impl”,除了类型类之外。

  • [sql]

    TypeDecorator 现在将自身放置为二进制表达式的结果类型,其中类型强制规则通常会返回其 impl 类型 - 以前,会返回 impl 类型的副本,该副本会将 TypeDecorator 嵌入到其中作为 “dialect” impl,这可能是实现预期效果的非故意方式。

  • [sql]

    TypeDecorator.load_dialect_impl() 默认返回 “self.impl”,即不是 “self.impl” 的方言实现类型。这是为了正确支持编译。行为可以像以前完全一样以相同的方式由用户覆盖,以达到相同的效果。

  • [sql]

    添加了 type_coerce(expr, type_) 表达式元素。在评估表达式和处理结果行时,将给定的表达式视为给定类型,但不会影响 SQL 的生成,除非是匿名标签。

  • [sql]

    Table.tometadata() 现在也复制与 Table 关联的 Index 对象。

  • [sql]

    如果给定的 Table 已经存在于目标 MetaData 中,Table.tometadata() 会发出警告 - 返回现有的 Table 对象。

  • [sql]

    如果尚未分配名称的 Column(即在声明性中)在导出到封闭 select() 构造的 columns 集合的上下文中使用,或者在分配其名称之前编译任何涉及该列的构造,则会引发信息性错误消息。

  • [sql]

    as_scalar()、label() 可以在包含尚未命名的 Column 的 selectable 上调用。

    参考:#1862

  • [sql]

    修复了当使用两个类型为 “NullType” 但不是单例 NULLTYPE 实例的表达式进行操作时可能发生的递归溢出。

    参考:#1907

postgresql

  • [postgresql]

    为 ARRAY 类型添加了 “as_tuple” 标志,返回元组而不是列表的结果以允许哈希。

  • [postgresql]

    修复了阻止从自定义类型(例如 “enum”)构建的 “domain” 被反射的错误。

    参考:#1933

mysql

  • [mysql]

    修复了涉及使用 ON UPDATE 子句反射 CURRENT_TIMESTAMP 默认值的错误,感谢 Taavi Burns

    参考:#1940

mssql

  • [mssql]

    修复了未正确处理未知类型反射的反射错误。

    参考:#1946

  • [mssql]

    修复了使用 “schema” 对表进行别名化将无法正确编译的错误。

    参考:#1943

  • [mssql]

    重写了索引的反射以使用 sys. catalogs,以便可以反射任何配置(空格,嵌入的逗号等)的列名。请注意,索引的反射需要 SQL Server 2005 或更高版本。

    参考:#1770

  • [mssql]

    mssql+pymssql 方言现在遵循 URL 的 “port” 部分,而不是丢弃它。

    参考:#1952

oracle

  • [oracle]

    create_engine() 的 implicit_returning 参数现在无论检测到的 Oracle 版本如何都被遵循。以前,如果服务器版本信息 < 10,则该标志将被强制设置为 False。

    参考:#1878

tests

  • [tests]

    NoseSQLAlchemyPlugin 已移至新的软件包 “sqlalchemy_nose”,该软件包与 “sqlalchemy” 一起安装。这样 “nosetests” 脚本可以像往常一样工作,但也允许 –with-coverage 选项在导入 SQLAlchemy 模块之前打开覆盖率,从而使覆盖率可以正确工作。

misc

  • [declarative]

    @classproperty(很快/现在 @declared_attr)对于非 mixin 的基类以及 mixin 上的 __mapper_args__、__table_args__、__tablename__ 生效。

    参考:#1922

  • [declarative]

    @classproperty ‘s 用于声明性的官方名称/位置是 sqlalchemy.ext.declarative.declared_attr。同样的事情,但是移动到那里是因为它更像是声明性特定的 “标记”,而不仅仅是一种属性技术。

    参考:#1915

  • [declarative]

    修复了 mixin 上的列无法正确传播到单表或连接表继承方案的错误,其中属性名称与列的名称不同。

    参考:#1930, #1931

  • [declarative]

    mixin 现在可以指定一个列,该列覆盖与超类关联的同名列。感谢 Oystein Haaland。

  • [informix]

    为 0.6 版的 Informix 方言进行了重大清理/现代化,由 Florian Apolloner 提供。

    参考:#1906

  • [misc]

    CircularDependencyError 现在具有 .cycles 和 .edges 成员,它们是涉及一个或多个循环的元素集,以及作为 2 元组的边集。

    参考:#1890

0.6.4

发布日期:2010 年 9 月 7 日星期二

orm

  • [orm]

    名称 ConcurrentModificationError 已更改为 StaleDataError,并且描述性错误消息已修订,以准确反映问题所在。对于可能在 “except:” 子句中指定 ConcurrentModificationError 的方案,这两个名称在可预见的将来仍然可用。

  • [orm]

    向标识映射添加了互斥锁,该互斥锁针对迭代方法互斥删除操作,迭代方法现在在返回可迭代对象之前进行预缓冲。这是因为异步 gc 可以随时通过 gc 线程删除项目。

    参考:#1891

  • [orm]

    Session 类现在存在于 sqlalchemy.orm.* 中。对于需要一步式 Session 构造函数的情况,我们正在逐步放弃使用具有非标准默认值的 create_session()。但是,大多数用户应坚持使用 sessionmaker() 进行常规使用。

  • [orm]

    query.with_parent() 现在接受瞬态对象,并将使用其 pk/fk 属性的非持久值来制定条件。文档也已澄清 with_parent() 的用途。

  • [orm]

    mapper() 的 include_properties 和 exclude_properties 参数现在除了字符串外,还接受 Column 对象作为成员。这样可以消除同名 Column 对象的歧义,例如 join() 中的对象。

  • [orm]

    如果针对 join 或其他单个 selectable 创建了映射器,其中包含 .c. 集合中具有相同名称的多个列,并且这些列未显式命名为相同或单独属性的一部分(或排除),则现在会发出警告。在 0.7 中,此警告将是一个异常。请注意,当组合作为继承的结果发生时,不会发出此警告,以便属性仍然允许自然地被覆盖。在 0.7 中,这将得到进一步改进。

    参考:#1896

  • [orm]

    mapper() 的 primary_key 参数现在可以指定一系列列,这些列只是映射 selectable 的计算 “主键” 列的子集,而不会引发错误。这有助于 selectable 的有效主键比 selectable 中实际标记为 “primary_key” 的列数更简单的情况,例如针对两个表的主键列进行 join。

    参考:#1896

  • [orm]

    已删除的对象现在获得一个标志 ‘deleted’,该标志禁止将对象重新 add() 到会话,因为以前对象将静默地存在于标识映射中,直到访问其属性为止。make_transient() 函数现在会重置此标志以及 “key” 标志。

  • [orm]

    可以安全地在已瞬态实例上调用 make_transient()。

  • [orm]

    在 mapper() 中,如果 polymorphic_on 列在映射的可选对象或 with_polymorphic 可选对象中既不是直接形式也不是派生形式存在,则会发出警告,而不是静默地忽略它。请注意这将在 0.7 版本中变为异常。

  • [orm]

    再次审视当 relationship() 使用模糊参数配置时发出的一系列错误消息。“foreign_keys”设置不再被提及,因为它几乎从不需要,并且建议用户设置正确的 ForeignKey 元数据,这现在是推荐的做法。如果使用了 ‘foreign_keys’ 并且不正确,则消息会建议该属性可能是非必要的。该属性的文档已得到加强。这是因为 ML 上所有感到困惑的 relationship() 用户似乎都在尝试使用 foreign_keys,而这只会让他们更加困惑,因为 Table 元数据要清晰得多。

  • [orm]

    如果 “secondary” 表格没有 ForeignKey 元数据,并且没有设置 foreign_keys,即使使用者传递了错误的信息,也会假定 primary/secondaryjoin 表达式应仅考虑 “secondary” 表格中的所有列作为外键。在 “secondary” 表格中,外键不可能在其他任何地方。现在发出警告而不是错误,并且映射成功。

    参考链接: #1877

  • [orm]

    将 o2m 对象从一个集合移动到另一个集合,或者反之亦然,通过 m2o 更改被引用的对象,如果外键也是主键的成员,则在 flush 期间会更仔细地检查这种情况:如果 “many” 侧的外键值的更改是由于 “one” 侧的主键的更改造成的,或者如果 “one” 只是一个不同的对象。在一种情况下,具有级联功能的数据库会已经级联了该值,我们需要查看 “new” 的 PK 值来执行 UPDATE;在另一种情况下,我们需要继续查看 “old” 的值。现在我们查看 “old” 的值,假设 passive_updates=True,除非我们知道是 PK 切换触发了更改。

    参考链接: #1856

  • [orm]

    version_id_col 的值可以手动更改,这将导致行的 UPDATE 操作。版本化的 UPDATE 和 DELETE 操作现在在 WHERE 子句中使用 version_id_col 的 “已提交” 值,而不是待处理的更改值。如果属性上存在手动更改,则版本生成器也会被绕过。

    参考链接: #1857

  • [orm]

    修复了在具体继承的映射器中使用 merge() 时的用法。此类映射器通常具有所谓的 “concrete” 属性,这些属性是 “禁用” 从父类传播的子类属性 - 这些属性需要允许 merge() 操作无效果地通过。

  • [orm]

    为 column_mapped_collection 指定非基于列的参数,包括字符串、text() 等,将引发错误消息,该消息明确要求提供列元素,不再被关于 text() 或 literal() 的不正确信息误导。

    参考链接: #1863

  • [orm]

    同样,对于 relationship(),foreign_keys,remote_side,order_by - 所有基于列的表达式都被强制执行 - 字符串列表被明确禁止,因为这是一个非常常见的错误。

  • [orm]

    动态属性不支持集合填充 - 为 set_committed_value() 被调用时以及 joinedload() 或 subqueryload() 选项应用于动态属性时添加了断言,而不是失败/静默失败。

    参考链接: #1864

  • [orm]

    修复了这样一个错误:从一个派生 Query 生成另一个 Query,该 Query 具有以不同标签名称重复的相同列,通常在某些 UNION 的情况下,会导致内部列无法完全传播到外部 Query。

    参考链接: #1852

  • [orm]

    当提供未映射的实例时,object_session() 会引发正确的 UnmappedInstanceError。

    参考链接: #1881

  • [orm]

    对计算的 Mapper 属性应用了进一步的 memoization,在高度多态的映射配置中,mapper.py 运行时调用计数显著减少 (~90%)。

  • [orm]

    版本控制示例使用的 mapper _get_col_to_prop 私有方法已被弃用;现在使用 mapper.get_property_by_column(),它将仍然是此操作的公共方法。

  • [orm]

    如果对先前为 NULL 的列进行版本控制,则版本控制示例现在可以正确工作。

示例

  • [examples]

    beaker_caching 示例已重新组织,使得 Session、缓存管理器、declarative_base 成为环境的一部分,自定义缓存代码是可移植的,现在位于 “caching_query.py” 中。这使得该示例更容易 “融入” 到现有项目中。

  • [examples]

    history_meta 版本控制配方在复制列时设置 “unique=False”,以便版本控制表处理具有重复值的多行。

    参考链接: #1887

引擎

  • [engine]

    在已耗尽、已关闭或不是返回结果的结果上调用 fetchone() 或类似方法,现在在所有情况下都会引发 ResourceClosedError,它是 InvalidRequestError 的子类,而与后端无关。以前,某些 DBAPI 会引发 ProgrammingError (例如 pysqlite),其他 DBAPI 会返回 None 导致下游崩溃 (例如 MySQL-python)。

  • [engine]

    修复了 Connection 中的一个错误,即如果在第一个连接池连接的 “initialize” 阶段发生 “disconnect” 事件,当 Connection 尝试使 DBAPI 连接无效时,会引发 AttributeError。

    参考链接: #1894

  • [engine]

    Connection、ResultProxy 以及 Session 对所有 “此连接/事务/结果已关闭” 类型的错误都使用 ResourceClosedError。

  • [engine]

    Connection.invalidate() 可以多次调用,后续调用不会执行任何操作。

sql

  • [sql]

    在 alias() 构造上调用 execute() 将在 0.7 版本中被弃用,因为它本身不是 “可执行” 构造。它目前 “代理” 其内部元素,并且有条件地 “可执行”,但这并不是我们现在喜欢的模糊性。

  • [sql]

    ClauseElement 的 execute() 和 scalar() 方法现在已适当地移动到 Executable 子类。ClauseElement.execute()/ scalar() 仍然存在,并且计划在 0.7 版本中弃用,但请注意,如果您不是 Executable (除非您是 alias(),请参阅前面的注释),这些方法总是会引发错误。

  • [sql]

    为 Numeric->Integer 添加了基本的数学表达式强制转换,以便结果类型始终为 Numeric,而与表达式的方向无关。

  • [sql]

    更改了当在 Column 上使用 “index=True” 标志时用于生成截断的 “auto” 索引名称的方案。截断仅在自动生成的名称上进行,而不是在用户定义的名称上进行 (否则会引发错误),并且截断方案本身现在基于标识符名称的 md5 哈希片段,以便在具有相似名称的列上的多个索引仍然具有唯一的名称。

    参考链接: #1855

  • [sql]

    生成的索引名称也基于与 “最大标识符长度” 分开的 “最大索引名称长度” 属性 - 这是为了安抚 MySQL,MySQL 对索引名称的最大长度为 64,与其整体最大长度 255 分开。

    参考链接: #1412

  • [sql]

    text() 构造,如果放置在面向列的情况下,至少会为其类型返回 NULLTYPE 而不是 None,使其比以前更自由地用于临时的列表达式。但是,literal_column() 仍然是更好的选择。

  • [sql]

    在 ForeignKey 无法解析目标时引发的错误消息中添加了对父表/列、目标表/列的完整描述。

  • [sql]

    修复了这样一个错误:在反射的表格中替换复合外键列会导致第二次尝试从表格中删除反射的约束,从而引发 KeyError。

    参考链接: #1865

  • [sql]

    _Label 构造,即当您说 somecol.label() 时产生的构造,现在将其自身计入其 “proxy_set” 中,并与包含的列的 proxy set 合并,而不是直接返回包含的列的 proxy set。这允许依赖于 _Label 本身标识的列对应操作返回正确的结果。

  • [sql]

    修复了 ORM 错误。

    参考链接: #1852

postgresql

  • [postgresql]

    修复了 psycopg2 方言以使用其 set_isolation_level() 方法,而不是依赖于基本的 “SET SESSION ISOLATION” 命令,因为 psycopg2 会在每个新事务中重置隔离级别。

mssql

  • [mssql]

    修复了 “default schema” 查询以使其与 pymssql 后端一起工作。

oracle

  • [oracle]

    为 Oracle 方言添加了 ROWID 类型,以用于可能需要显式 CAST 的情况。

    参考链接: #1879

  • [oracle]

    Oracle 索引的反射已调整,以便可以反射包含部分或全部主键列的索引,但与主键列的集合不完全相同的索引。与主键列的集合完全相同的索引在反射中会被跳过,因为在这种情况下,该索引被假定为自动生成的主键索引。以前,任何包含主键列的索引都会被跳过。感谢 Kent Bower 的补丁。

    参考链接: #1867

  • [oracle]

    Oracle 现在可以反射主键约束的名称 - 同样感谢 Kent Bower。

    参考链接: #1868

misc

  • [declarative]

    如果 @classproperty 与常规的类绑定映射器属性一起使用,则在初始化期间将调用它以获取实际的属性值。目前,在声明性类的列或 relationship 属性上使用 @classproperty 并没有优势,该声明性类不是 mixin - 求值时间与不使用 @classproperty 时相同。但在这里我们至少允许它按预期运行。

  • [declarative]

    修复了 “无法添加额外的列” 消息会显示错误名称的错误。

  • [firebird]

    修复了如果 “default” 关键字为小写,则列默认值将无法反射的错误。

  • [informix]

    应用补丁以重新启动基本的 Informix 功能。我们依赖最终用户测试来确保 Informix 在某种程度上可以工作。

    参考链接: #1904

  • [documentation]

    文档已重新组织,使得 “API 参考” 部分已消失 - 来自那里的所有公共 API 的文档字符串都已移动到讨论它的主要文档部分的上下文中。主要文档分为 “SQLAlchemy Core” 和 “SQLAlchemy ORM” 部分,mapper/relationship 文档已分解出来。许多部分已重写和/或重新组织。

0.6.3

发布日期:2010 年 7 月 15 日星期四

orm

  • [orm]

    移除了 unitofwork 中错误的多对多加载,该加载在过期/未加载的集合上不必要地触发。此加载现在仅在 passive_updates 为 False 且父主键已更改,或者 passive_deletes 为 False 且父项已删除时发生。

    参考链接: #1845

  • [orm]

    当 Query 从自身 + 可选对象 (例如 from_self()、union() 等) 派生时,列实体 (即 query(Foo.id)) 更充分地复制其状态,以便 join() 等具有正确的状态来工作。

    参考链接: #1853

  • [orm]

    修复了 Query.join() 在查询非 ORM 列然后在 FROM 子句已存在时在没有 on 子句的情况下进行 join() 会失败的错误,现在以与子句不存在时相同的方式引发检查异常。

    参考链接: #1853

  • [orm]

    改进了对 “未映射的类” 的检查,包括超类已映射但子类未映射的情况。现在,任何访问 cls._sa_class_manager.mapper 的尝试都会引发 UnmappedClassError()。

    参考链接: #1142

  • [orm]

    向 Query 添加了 “column_descriptions” 访问器,返回包含有关 Query 将返回的实体的命名/类型信息的字典列表。这对于在 ORM 查询之上构建 GUI 很有帮助。

mysql

  • [mysql]

    _extract_error_code() 方法现在可以与每个 MySQL 方言 (MySQL-python、OurSQL、MySQL-Connector-Python、PyODBC) 正确工作。以前,重新连接逻辑对于 OperationalError 条件会失败,但是由于 MySQLdb 和 OurSQL 都有自己的重新连接功能,因此除非有人查看日志,否则这些驱动程序在此处没有任何症状。

    参考链接: #1848

oracle

  • [oracle]

    对 cx_oracle Decimal 处理进行了更多调整。没有小数位的 “模糊” 数字在连接处理程序级别被强制转换为 int。这里的优点是 int 作为 int 返回,无需涉及 SQLA 类型对象,也无需首先不必要地转换为 Decimal。

    不幸的是,一些奇异的子查询情况甚至可以在单个结果行之间看到不同的类型,因此 Numeric 处理程序在指示返回 Decimal 时,无法充分利用 “原生 decimal” 模式,并且必须对每个值运行 isinstance() 以检查它是否已经是 Decimal。重新开放

    参考链接: #1840

0.6.2

发布日期:2010 年 7 月 6 日星期二

orm

  • [orm]

    Query.join() 将检查 query.join(target, clause_expression) 形式的调用,即缺少元组,并引发信息丰富的错误消息,指出这是错误的调用形式。

  • [orm]

    修复了关于自引用双向多对多关系的 flush 错误,其中在一个 flush 中相互引用的两个对象将无法为两侧插入行。0.5 版本的回归。

    参考链接: #1824

  • [orm]

    relationship() 的 post_update 功能已在架构上进行了重新设计,以更紧密地与新的 0.6 工作单元集成。更改的动机是,以便将多个 “post update” 调用 (每个调用都影响同一行的不同外键列) 在单个 UPDATE 语句中执行,而不是每个列每行一个 UPDATE 语句。多个行更新也尽可能分批处理到 executemany() 中,同时保持一致的行顺序。

  • [orm]

    Query.statement、Query.subquery() 等现在将绑定参数的值 (即 query.params() 指定的参数) 传输到生成的 SQL 表达式中。以前,这些值不会被传输,并且绑定参数将显示为 None。

  • [orm]

    子查询急切加载现在可以与包含 params() 以及 get() Query 对象的 Query 对象一起使用。

  • [orm]

    现在可以在通过多对一被父对象引用的实例上调用 make_transient(),而不会使父对象的外键值暂时设置为 None - 这是 “检测主键切换” flush 处理程序的功能。现在,它会忽略不再处于 “持久” 状态的对象,并且父对象的外键标识符不受影响。

  • [orm]

    query.order_by() 现在接受 False,这将取消 Query 上任何现有的 order_by() 状态,从而允许调用后续的生成方法,这些方法不支持 ORDER BY。这与已有的传递 None 的功能不同,None 会抑制任何现有的 order_by() 设置,包括在映射器上配置的设置。False 会使其如同从未调用过 order_by(),而 None 是一个活动设置。

  • [orm]

    移动到 “transient” 状态、具有不完整或缺失的主键属性集并包含过期属性的实例,如果访问过期属性,将引发 InvalidRequestError,而不是出现递归溢出。

  • [orm]

    make_transient() 函数现在位于生成的文档中。

  • [orm]

    make_transient() 从正在变为 transient 状态的状态中删除所有 “loader” 可调用对象,从而删除任何 “过期” 状态 - 所有未加载的属性在访问时重置回未定义、None/空。

sql

  • [sql]

    Unicode 和 String 类型在 convert_unicode=True 时发出的警告不再嵌入实际传递的值。这样做的目的是为了 Python 警告注册表不会继续增长大小,警告会根据警告过滤器设置发出一次,并且大型字符串值不会污染输出。

    参考链接: #1822

  • [sql]

    修复了阻止重写的子句编译在 “annotated” 表达式元素 (通常由 ORM 生成) 上工作的错误。

  • [sql]

    LIKE 运算符或类似运算符的 “ESCAPE” 参数通过 render_literal_value() 传递,后者可能会实现反斜杠的转义。

    参考链接: #1400

  • [sql]

    修复了 Enum 类型中的一个错误,该错误在使用 TypeDecorators 或其他适配方案时会破坏 native_enum 标志。

  • [sql]

    Inspector 在调用 bind.connect() 时被命中,以确保 initialize 已被调用。内部名称 “.conn” 已更改为 “.bind”,因为这就是它的用途。

  • [sql]

    修改了 “列注解” 的内部结构,以便自定义 Column 子类可以安全地重写 _constructor 以返回 Column,目的是创建不涉及代理等的 “配置性” 列类。

  • [sql]

    Column.copy() 携带 “unique” 属性以及其他属性,修复了关于声明性 mixin 的问题

    参考链接: #1829

postgresql

  • [postgresql]

    render_literal_value() 被重写,它转义反斜杠,目前适用于 LIKE 和类似表达式的 ESCAPE 子句。最终,这将必须检测 “standard_conforming_strings” 的值才能实现完整的行为。

    参考链接: #1400

  • [postgresql]

    如果在使用 types.Enum 的 PG 版本早于 8.3 时,将不会生成 “CREATE TYPE” / “DROP TYPE” - supports_native_enum 标志将被完全遵守。

    参考链接: #1836

mysql

  • [mysql]

    MySQL 方言不会为检测到的 MySQL 版本 < 4.0.2 发出 CAST()。这允许在连接时进行 unicode 检查。

    参考链接: #1826

  • [mysql]

    MySQL 方言现在除了 ANSI_QUOTES 之外,还可以检测 NO_BACKSLASH_ESCAPES sql 模式。

  • [mysql]

    render_literal_value() 被重写,它转义反斜杠,目前适用于 LIKE 和类似表达式的 ESCAPE 子句。此行为源自检测 NO_BACKSLASH_ESCAPES 的值。

    参考链接: #1400

mssql

  • [mssql]

    如果 server_version_info 超出 (8, )、(9, )、(10, ) 的通常范围,则会发出警告,建议检查 FreeTDS 版本配置是否使用 7.0 或 8.0,而不是 4.2。

    参考链接: #1825

oracle

  • [oracle]

    修复了 ora-8 兼容性标志,使其不会缓存来自第一次数据库连接实际发生之前的陈旧值。

    参考链接: #1819

  • [oracle]

    当列嵌入子查询以及当使用子查询查询 ROWNUM 时 (我们对 limit/offset 执行此操作),Oracle 的 “原生 decimal” 元数据开始返回关于数字的模糊类型信息。我们已将这些模糊条件添加到 cx_oracle “转换为 Decimal()” 处理程序中,以便我们在更多情况下将数字接收为 Decimal 而不是浮点数。然后,如果需要,这些数字将转换为 Integer 或 Float,否则将保留为无损的 Decimal。

    参考链接: #1840

misc

  • [firebird]

    修复了 do_execute() 中不正确的签名,0.6.1 中引入的错误。

    参考链接: #1823

  • [firebird]

    Firebird 方言添加了接受 “charset” 标志的 CHAR、VARCHAR 类型,以支持 Firebird “CHARACTER SET” 子句。

    参考链接: #1813

  • [declarative]

    添加了对 @classproperty 的支持,以从声明性 mixin 提供任何类型的架构/映射构造,包括带有外键的列、关系、column_property、deferred。这解决了声明性 mixin 上的所有此类问题。如果在 mixin 上指定任何 MapperProperty 子类而不使用 @classproperty,则会引发错误。

    参考链接: #1751, #1796, #1805

  • [declarative]

    mixin 类现在可以定义一个与子类上定义的 __table__ 中存在的列匹配的列。但是,它不能定义一个在 __table__ 中不存在的列,并且此处的错误消息现在可以正常工作。

    参考链接: #1821

  • [compiler] [extension]

    当覆盖内置子句构造的编译时,会自动复制 “default” 编译器,因此如果用户定义的编译器特定于某些后端,并且调用了针对不同后端的编译,则不会引发 KeyError。

    参考链接: #1838

  • [documentation]

    添加了 Inspector 的文档。

    参考链接: #1820

  • [documentation]

    修复了 @memoized_property 和 @memoized_instancemethod 装饰器,以便 Sphinx 文档可以拾取这些属性和方法,例如 ResultProxy.inserted_primary_key。

    参考链接: #1830

0.6.1

发布日期:2010 年 5 月 31 日星期一

orm

  • [orm]

    修复了 0.6.0 中引入的关于可变属性的不正确历史记录的回归。

    参考链接: #1782

  • [orm]

    修复了 0.6.0 工作单元重构中引入的回归,该回归破坏了带有 post_update=True 的双向 relationship() 的更新。

    参考链接: #1807

  • [orm]

    如果 session.merge() 返回的实例是 “pending” 状态,则不会使该实例上的属性过期。

    参考链接: #1789

  • [orm]

    修复了 CollectionAdapter 的 __setstate__ 方法在反序列化期间父 InstanceState 尚未反序列化时会失败的错误。

    参考链接: #1802

  • [orm]

    如果碰巧没有完整 PK 的实例已过期,然后被要求刷新,则添加了内部警告。

    参考链接: #1797

  • [orm]

    为映射器对 UPDATE、INSERT 和 DELETE 表达式的使用添加了更积极的缓存。假设语句没有附加每个对象的 SQL 表达式,则表达式对象在首次创建后由映射器缓存,并且其编译形式持久存储在缓存字典中,持续时间为相关的 Engine。缓存是一个 LRUCache,用于映射器接收到极大量的不同列模式作为 UPDATE 的罕见情况。

sql

  • [sql]

    expr.in_() 现在接受 text() 构造作为参数。分组括号会自动添加,即用法类似于 col.in_(text(“select id from table”))

    参考链接: #1793

  • [sql]

    _Binary 类型的列 (即 LargeBinary、BLOB 等) 会将右侧的 “basestring” 强制转换为 _Binary,以便执行所需的 DBAPI 处理。

  • [sql]

    添加了 table.add_is_dependent_on(othertable),允许手动在两个 Table 对象之间放置依赖规则,以用于 create_all()、drop_all()、sorted_tables 中。

    参考链接: #1801

  • [sql]

    修复了当复合主键包含零时,隐式 RETURNING 无法正常工作的错误。

    参考链接: #1778

  • [sql]

    修复了为命名的 UNIQUE 约束生成 ADD CONSTRAINT 时出现的多余空格字符。

  • [sql]

    修复了 ForeignKeyConstraint 构造函数上的 “table” 参数

    参考链接: #1571

  • [sql]

    修复了连接池游标包装器中的一个错误,该错误导致当游标在 close() 时抛出异常时,消息的日志记录会失败。

    参考链接: #1786

  • [sql]

    ColumnClause 和 Column 的 _make_proxy() 方法现在使用 self.__class__ 来确定要返回的对象的类,而不是硬编码为 ColumnClause/Column,这使得生成这些类的特定子类在别名/子查询情况下更容易。

  • [sql]

    func.XXX() 不会意外地解析为非 Function 类(例如,修复了 func.text())。

    参考链接: #1798

mysql

  • [mysql]

    func.sysdate() 在 MySQL 上发出 “SYSDATE()”,即带有结尾的括号。

    参考链接: #1794

sqlite

  • [sqlite]

    修复了当 “PRIMARY KEY” 约束由于 SQLite AUTOINCREMENT 关键字被渲染而移动到列级别时,约束的连接问题。

    参考链接: #1812

oracle

  • [oracle]

    添加了对低于版本 5 的 cx_oracle 版本的检查,在这种情况下,将不会使用不兼容的 “输出类型处理程序”。这将影响十进制精度和一些 Unicode 处理问题。

    参考链接: #1775

  • [oracle]

    修复了 use_ansi=False 模式,该模式在几乎所有情况下都会生成损坏的 WHERE 子句。

    参考链接: #1790

  • [oracle]

    重新建立了对 Oracle 8 和 cx_oracle 的支持,包括 use_ansi 自动设置为 False,NVARCHAR2 和 NCLOB 不为 Unicode 渲染,“native unicode” 检查不会失败,cx_oracle “native unicode” 模式被禁用,VARCHAR() 发出的字节计数而不是字符计数。

    参考链接: #1808

  • [oracle]

    oracle_xe 5 在正常的 Python 2.x 模式下不接受 Python Unicode 对象在其连接字符串中 - 因此我们直接强制转换为 str()。此处连接字符串不支持非 ASCII 字符,因为我们不知道可以使用哪种编码。

    参考链接: #1670

  • [oracle]

    当使用 limit/offset 时,FOR UPDATE 在语法上正确的位置发出,即 ROWNUM 子查询。但是,Oracle 实际上无法处理带有 ORDER BY 或子查询的 FOR UPDATE,因此它仍然不是非常可用,但至少 SQLA 使 SQL 通过了 Oracle 解析器。

    参考链接: #1815

misc

  • [engines]

    修复了在 Python 2.4 上构建 C 扩展。

    参考链接: #1781

  • [engines]

    Pool 类将在 dispose() 发生后重用相同的 “pool_logging_name” 设置。

  • [engines]

    Engine 获得 “execution_options” 参数和 update_execution_options() 方法,这将应用于由此引擎生成的所有连接。

  • [firebird]

    在 has_table() 和 has_sequence() 中使用的查询中添加了标签,以与不为结果列提供标签的旧版本 Firebird 兼容。

    参考链接: #1521

  • [firebird]

    在通过查询字符串传递时,将整数强制转换为 “type_conv” 属性,以便 Kinterbasdb 正确解释它。

    参考链接: #1779

  • [firebird]

    将 “connection shutdown” 添加到指示连接断开的异常字符串列表中。

    参考链接: #1646

  • [sqlsoup]

    SqlSoup 构造函数接受一个 base 参数,该参数指定用于映射类的基类,默认值为 object

    参考链接: #1783

0.6.0

发布日期:2010 年 4 月 18 日星期日

orm

  • [orm]

    工作单元内部结构已重写。具有大量对象相互依赖关系的工作单元现在可以被刷新,而不会出现递归溢出,因为不再依赖递归调用。内部结构的数目现在对于特定的会话状态保持恒定,而与映射上存在多少关系无关。事件的流程现在对应于步骤的线性列表,由映射器和关系基于要完成的实际工作生成,并通过单个拓扑排序进行过滤以获得正确的顺序。刷新操作使用更少的步骤和更少的内存进行组装。

    参考链接: #1081, #1742

  • [orm]

    与 UOW 重写一起,这也消除了 0.6beta3 中引入的关于具有长依赖循环的工作单元的拓扑循环检测问题。我们现在使用 Guido 编写的算法(感谢 Guido!)。

  • [orm]

    一对多关系现在在刷新期间维护正向父子关联的列表,防止先前标记为已删除的父项级联删除或在其子对象上设置 NULL 外键,即使最终用户没有从旧关联中删除子项。

    参考链接: #1764

  • [orm]

    集合延迟加载将关闭反向多对一侧的默认迫切加载,因为该加载按定义是不必要的。

    参考链接: #1495

  • [orm]

    Session.refresh() 现在首先对给定实例执行等效的 expire(),以便传播 “refresh-expire” 级联。以前,refresh() 不受 “refresh-expire” 级联的任何影响。这是与 0.6beta2 行为的更改,在 0.6beta2 中,传递给 refresh() 的 “lockmode” 标志将导致版本检查发生。由于实例首先过期,因此 refresh() 始终将对象升级到最新版本。

  • [orm]

    “refresh-expire” 级联,当到达 pending 对象时,如果级联还包括 “delete-orphan”,则将 expunge 对象,否则将简单地 detach 它。

    参考链接: #1754

  • [orm]

    id(obj) 不再在 topological.py 内部使用,因为排序函数现在仅需要可哈希对象。

    参考链接: #1756

  • [orm]

    ORM 将默认情况下将所有生成的描述符的文档字符串设置为 None。可以使用 ‘doc’ 覆盖此设置(如果使用 Sphinx,属性文档字符串也适用)。

  • [orm]

    为所有映射器属性可调用对象以及 Column() 添加了 kw 参数 ‘doc’。将字符串 ‘doc’ 组装为描述符上的 ‘__doc__’ 属性。

  • [orm]

    当发出 delete 时,在支持 cursor.rowcount 用于 execute() 但不支持 executemany() 的后端上使用 version_id_col 现在可以工作了(对于保存操作已经可以工作,因为这些操作不使用 executemany())。对于完全不支持 cursor.rowcount 的后端,会发出与保存操作相同的警告。

    参考链接: #1761

  • [orm]

    ORM 现在在刷新同一类的所有对象的列表时,短期缓存 insert() 和 update() 构造的 “compiled” 形式,从而避免在单个 flush() 调用中对每个单独的 INSERT/UPDATE 进行冗余编译。

  • [orm]

    ColumnProperty、CompositeProperty、RelationshipProperty 上的内部 getattr()、setattr()、getcommitted() 方法已加下划线(即,是私有的),签名已更改。

examples

  • [examples]

    更新了 attribute_shard.py 示例,以使用更健壮的方法来搜索 Query 中将列与字面值进行比较的二元表达式。

sql

  • [sql]

    恢复了 0.5 中的一些绑定标签逻辑,该逻辑确保如果 column._label 在 UPDATE 期间用作绑定名称,则列名与另一种 “<tablename>_<columnname>” 形式的列名重叠的表不会产生错误。已添加 0.5 中不存在的测试覆盖率。

    参考链接: #1755

  • [sql]

    somejoin.select(fold_equivalents=True) 不再被弃用,最终将 rolled into for 功能的更全面的版本。

    参考链接: #1729

  • [sql]

    当 Numeric 类型预期从返回浮点数的 DBAPI 将浮点数转换为 Decimal 时,会引发巨大的警告。这包括 SQLite、Sybase、MS-SQL。

    参考链接: #1759

  • [sql]

    修复了表达式类型中的错误,该错误导致具有两个 NULL 类型的表达式的无限循环。

  • [sql]

    修复了 execution_options() 功能中的一个错误,该错误导致父连接中的现有 Transaction 和其他状态信息不会传播到子连接。

  • [sql]

    添加了新的 ‘compiled_cache’ 执行选项。这是一个字典,当 Connection 将子句表达式编译为特定于方言和参数的 Compiled 对象时,Compiled 对象将被缓存。用户有责任管理此字典的大小,该字典的键将对应于方言、子句元素、INSERT 或 UPDATE 的 VALUES 或 SET 子句中的列名,以及 INSERT 或 UPDATE 语句的 “batch” 模式。

  • [sql]

    为 reflection.Inspector 添加了 get_pk_constraint(),类似于 get_primary_keys(),但返回一个包含约束名称的字典,用于支持的后端(目前为止为 PG)。

    参考链接: #1769

  • [sql]

    Table.create() 和 Table.drop() 不再应用元数据级别的 create/drop 事件。

    参考链接: #1771

postgresql

  • [postgresql]

    PostgreSQL 现在可以正确反映与 SERIAL 列关联的序列名称,在序列名称更改之后。感谢 Kumar McMillan 的补丁。

    参考链接: #1071

  • [postgresql]

    修复了 psycopg2._PGNumeric 类型中当接收到未知 numeric 时缺少导入的问题。

  • [postgresql]

    psycopg2/pg8000 方言现在知道 REAL[]、FLOAT[]、DOUBLE_PRECISION[]、NUMERIC[] 返回类型,而不会引发异常。

  • [postgresql]

    PostgreSQL 反映主键约束的名称(如果存在)。

    参考链接: #1769

oracle

  • [oracle]

    现在使用 cx_oracle 输出转换器,以便 DBAPI 本机返回我们首选的值类型

  • [oracle]

    具有正精度 + 比例的 NUMBER 值转换为 cx_oracle.STRING,然后再转换为 Decimal。这允许在使用 cx_oracle 时,Numeric 类型获得完美的精度。

    参考链接: #1759

  • [oracle]

    STRING/FIXED_CHAR 现在本机转换为 unicode。 SQLAlchemy 的 String 类型然后不需要应用任何类型的转换。

misc

  • [engines]

    C 扩展现在也适用于使用自定义序列作为行(而不仅仅是元组)的 DBAPI。

    参考链接: #1757

  • [ext]

    编译器扩展现在允许在扩展到子类的基类上使用 @compiles 装饰器,在子类上使用 @compiles 装饰器,而不会被基类上的 @compiles 装饰器破坏。

  • [ext]

    如果基于字符串的 relationship() 参数中引用了未映射的类属性,Declarative 将引发信息丰富的错误消息。

  • [ext]

    进一步修改了 declarative 中的 “mixin” 逻辑,以另外允许 __mapper_args__ 作为 mixin 上的 @classproperty,例如动态分配 polymorphic_identity。

  • [firebird]

    可以通过在 create_engine() 上设置 ‘enable_rowcount=False’,在每个引擎的基础上禁用 result.rowcount 的功能。通常,在任何 UPDATE 或 DELETE 语句之后都会无条件调用 cursor.rowcount,因为游标随后被关闭,并且 Firebird 需要打开游标才能获得 rowcount。但是,此调用稍微昂贵,因此可以禁用它。要在每次执行的基础上重新启用,可以使用 ‘enable_rowcount=True’ 执行选项。

0.6beta3

发布日期:2010 年 3 月 28 日星期日

orm

  • [orm]

    主要功能:为 relationship() 添加了新的 “子查询” 加载功能。这是一种迫切加载选项,它为查询中表示的每个集合生成第二个 SELECT,跨所有父项一次完成。该查询重新发出包装在子查询中的原始最终用户查询,应用到目标集合的连接,并在一个结果中完全加载所有这些集合,类似于 “joined” 迫切加载,但使用所有内部连接,而不是重复重新获取完整的父行(因为大多数 DBAPI 似乎都这样做,即使跳过了列)。子查询加载在映射器配置级别使用 “lazy=’subquery’” 可用,在查询选项级别使用 “subqueryload(props..)”、“subqueryload_all(props…)”。

    参考链接: #1675

  • [orm]

    为了适应现在有两种可用的迫切加载类型,eagerload() 和 eagerload_all() 的新名称是 joinedload() 和 joinedload_all()。旧名称将在可预见的未来保持为同义词。

  • [orm]

    relationship() 函数上的 “lazy” 标志现在接受字符串参数,用于所有类型的加载:“select”、“joined”、“subquery”、“noload” 和 “dynamic”,其中默认值现在为 “select”。 True/False/None 的旧值仍然保留其常用含义,并且将在可预见的未来保持为同义词。

  • [orm]

    为 Query() 构造添加了 with_hint() 方法。这直接调用 select().with_hint(),并且还接受实体以及表和别名。请参阅下面 SQL 部分中的 with_hint()。

    参考链接: #921

  • [orm]

    修复了 Query 中的一个错误,该错误导致调用 q.join(prop).from_self(…).join(prop) 将无法在子查询外部渲染第二个连接,当连接条件与内部条件相同时。

  • [orm]

    修复了 Query 中的一个错误,该错误导致如果 q.from_self() 或 q.select_from() 生成的子查询内部引用了底层表(但不是实际的别名),则 aliased() 构造的使用将失败。

  • [orm]

    修复了一个影响所有 eagerload() 和类似选项的错误,使得 “远程” 迫切加载,例如 query(A).options(eagerload(A.b, B.c)) 不会迫切加载任何内容,但使用 eagerload(“b.c”) 会正常工作。

  • [orm]

    Query 获得了 add_columns(*columns) 方法,它是 add_column(col) 的多版本。 add_column(col) 在未来将被弃用。

  • [orm]

    Query.join() 将检测最终结果是否为 “FROM A JOIN A”,如果是,则会引发错误。

  • [orm]

    Query.join(Cls.propname, from_joinpoint=True) 将更仔细地检查 “Cls” 是否与当前的连接点兼容,并且在这方面与 Query.join(“propname”, from_joinpoint=True) 的行为方式相同。

sql

  • [sql]

    为 select() 构造添加了 with_hint() 方法。指定表/别名、提示文本和可选的方言名称,“hints” 将在语句中的适当位置呈现。适用于 Oracle、Sybase、MySQL。

    参考链接: #921

  • [sql]

    修复了 0.6beta2 中引入的一个错误,该错误导致列标签会在已经分配标签的列表达式内部呈现。

    参考链接: #1747

postgresql

  • [postgresql]

    psycopg2 方言将通过 “sqlalchemy.dialects.postgresql” 日志记录器名称记录 NOTICE 消息。

    参考链接: #877

  • [postgresql]

    TIME 和 TIMESTAMP 类型现在可以直接从 postgresql 方言获得,这两种类型都为 PG 特定的参数 ‘precision’。 ‘precision’ 和 ‘timezone’ 对于 TIME 和 TIMEZONE 类型都正确地反映。

    参考链接: #997

mysql

  • [mysql]

    不再猜测 TINYINT(1) 在反射时应该是 BOOLEAN - 返回 TINYINT(1)。在表定义中使用 Boolean/BOOLEAN 以获得布尔转换行为。

    参考链接: #1752

oracle

  • [oracle]

    Oracle 方言将使用字符计数发出 VARCHAR 类型定义,即 VARCHAR2(50 CHAR),以便列的大小以字符而不是字节为单位。字符类型的列反射也将使用 ALL_TAB_COLUMNS.CHAR_LENGTH 而不是 ALL_TAB_COLUMNS.DATA_LENGTH。当服务器版本为 9 或更高版本时,所有这些行为都生效 - 对于版本 8,使用旧的行为。

    参考链接: #1744

misc

  • [declarative]

    如果 mixin 实现了不可预测的 __getattribute__(),例如 Zope 接口,则使用 mixin 不会中断。

    参考链接: #1746

  • [declarative]

    如果在 mixin 上使用 @classdecorator 和类似方法来定义 __tablename__、__table_args__ 等,并且该方法引用了最终子类上的属性,则现在可以工作。

    参考链接: #1749

  • [declarative]

    声明性 mixin 不允许关系和带有外键的列,抱歉。

    参考链接: #1751

  • [ext]

    sqlalchemy.orm.shard 模块现在成为扩展,sqlalchemy.ext.horizontal_shard。旧的导入可以使用弃用警告。

0.6beta2

发布日期:2010 年 3 月 20 日星期六

orm

  • [orm]

    relation() 函数的官方名称现在是 relationship(),以消除对关系代数术语的混淆。但是,relation() 在可预见的未来仍将以相同的能力可用。

    参考链接: #1740

  • [orm]

    为 Mapper 添加了 “version_id_generator” 参数,这是一个可调用对象,给定 “version_id_col” 的当前值,返回下一个版本号。可用于备用版本控制方案,例如 uuid、时间戳。

    参考链接: #1692

  • [orm]

    为 Session.refresh() 添加了 “lockmode” kw 参数,将字符串值传递给 Query,与 with_lockmode() 中的相同,还将为启用 version_id_col 的映射执行版本检查。

  • [orm]

    修复了在连接继承场景中调用 query(A).join(A.bs).add_entity(B) 会将 B 重复添加为目标并生成无效查询的错误。

    参考链接: #1188

  • [orm]

    修复了 session.rollback() 中的一个错误,该错误涉及在重新集成 “deleted” 对象之前,未从会话中删除以前的 “pending” 对象,这通常发生在自然主键的情况下。如果它们之间存在主键冲突,则删除的 attach 将在内部失败。以前的 “pending” 对象现在首先被 expunge。

    参考链接: #1674

  • [orm]

    删除了很多没有人真正关心的日志记录,保留的日志记录将响应日志级别的实时更改。没有增加明显的开销。

    参考链接: #1719

  • [orm]

    修复了 session.merge() 中的一个错误,该错误阻止了类字典集合的合并。

  • [orm]

    session.merge() 方法适用于那些在级联选项中明确不包含 “merge” 的关联关系 - 目标将被完全忽略。

  • [orm]

    即使传入的 merged 对象没有该属性的值,如果目标对象已经存在该标量属性的值,session.merge() 方法也不会使现有目标对象上的该标量属性过期。这可以防止不必要地加载现有项。但是,如果目标对象没有该属性,则仍然会将该属性标记为过期,从而满足延迟列的一些约定。

    参考链接: #1681

  • [orm]

    “allow_null_pks” 标志现在被命名为 “allow_partial_pks”,默认为 True,其行为与 0.5 版本中相同。不同的是,它也在 merge() 方法中实现,这样,如果该标志为 False,则不会为具有部分 NULL 主键的传入实例发出 SELECT 查询。

    参考链接: #1680

  • [orm]

    修复了 0.6 版本中重新设计的 “多对一” 优化中的错误,即针对远程表上的非主键列(例如,针对 UNIQUE 列的外键)的多对一关系将在更改期间从数据库中拉取 “旧” 值,因为如果它在会话中,我们将需要它来进行正确的历史/反向引用核算,并且我们无法从非主键列上的本地身份映射中拉取。

    参考链接: #1737

  • [orm]

    修复了在单表继承关系 relation() 上调用 has() 或类似的复杂表达式时会发生的内部错误。

    参考链接: #1731

  • [orm]

    query.one() 不再对查询应用 LIMIT,这是为了确保它完全计数结果中存在的所有对象身份,即使在连接可能隐藏两个或多个行的多个身份的情况下也是如此。 另外,one() 现在也可以使用从 from_statement() 发出的查询来调用,因为它不再修改查询。

    参考链接: #1688

  • [orm]

    query.get() 现在在查询身份映射中存在但类与请求的类不同的标识符时(即,当使用多态加载时)返回 None。

    参考链接: #1727

  • [orm]

    query.join() 中的一个重大修复,当 “on” 子句是 aliased() 构造的属性时,但已经存在与兼容目标的现有连接时,query 会正确连接到正确的 aliased() 构造,而不是粘附到现有连接的右侧。

    参考链接: #1706

  • [orm]

    对修复进行了轻微改进,以避免在所谓的 “行切换” 操作期间不必要地更新主键列,即添加 + 删除具有相同 PK 的两个对象。

    参考链接: #1362

  • [orm]

    现在,当由于对象从任何 Session 分离而导致属性加载或刷新操作失败时,使用 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]

    修复了在 r6711 中引入的当多对一 relation() 属性设置为 None 时的级联错误(在 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)失败的错误。

    参考链接: #1692

示例

  • [examples]

    稍微更改了 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 运算符。 特别是,为 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(),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() 方法现在复制未初始化的 “在表附加时” 事件。 有助于新的声明性 “mixin” 功能。

mysql

  • [mysql]

    修复了当存在 COLLATE 时,nullable 标志和服务器默认值不会被反映的反射错误。

    参考链接: #1655

  • [mysql]

    修复了使用 UNSIGNED 等整数标志定义的 TINYINT(1) “布尔” 列的反射。

  • [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 类型存储完整的日期+时间对象,这就是您将获得的。 但是,通用 types.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 类型。

misc

  • [py3k]

    改进了关于 Python 3 的安装/测试设置,现在 Distribute 在 Py3k 上运行。 现在包含 distribute_setup.py。 有关 Python 3 安装/测试说明,请参阅 README.py3k。

  • [engines]

    添加了一个可选的 C 扩展,通过重新实现 RowProxy 和最常见的结果处理器来加速 sql 层。 实际的加速将严重依赖于您的 DBAPI 和表中使用的数据类型组合,并且可能从 30% 的改进到超过 200%。 它还为大型查询的 ORM 速度提供了适度(约 15-20%)的间接改进。 请注意,默认情况下构建/安装它。 有关安装说明,请参阅 README。

  • [engines]

    执行序列在 “自动提交” 场景中在 DBAPI 连接上调用 commit() 之前,从游标中拉取所有 rowcount/上次插入的 ID 信息。 这有助于 mxodbc 处理行计数,并且总体而言可能是一个好主意。

  • [engines]

    稍微开放了日志记录,以便更频繁地调用 isEnabledFor(),以便引擎/池的日志级别的更改将在下次连接时反映出来。 这增加了一小部分方法调用开销。 它可以忽略不计,并且对于在调用 create_engine() 之后恰好配置日志记录的所有情况,这将使生活变得轻松得多。

    参考链接: #1719

  • [engines]

    assert_unicode 标志已弃用。 在所有要求它编码非 unicode Python 字符串以及显式传递字节串的 Unicode 或 UnicodeType 类型的情况下,SQLAlchemy 都会引发警告。 String 类型对于已经接受 Python unicode 对象的 DBAPI 不会执行任何操作。

  • [engines]

    绑定参数作为元组而不是列表发送。 某些后端驱动程序将不接受作为列表的绑定参数。

  • [engines]

    threadlocal 引擎在 close() 时没有正确关闭连接 - 已修复。

  • [engines]

    如果事务对象不是 “active”,则它不会回滚或提交,从而允许更准确地嵌套 begin/rollback/commit。

  • [engines]

    作为绑定的 Python unicode 对象会导致 Unicode 类型,而不是字符串,从而消除了在不支持 unicode 绑定的驱动程序上的一定类别的 unicode 错误。

  • [engines]

    为 create_engine()、Pool() 构造函数添加了 “logging_name” 参数,以及为 create_engine() 添加了 “pool_logging_name” 参数,后者过滤到 Pool 的日志记录名称。 在日志消息的 “name” 字段中发出给定的字符串名称,而不是默认的十六进制标识符字符串。

    参考链接: #1555

  • [engines]

    删除了 Dialect 的 visit_pool() 方法,并替换为 on_connect()。 此方法返回一个可调用对象,该对象在每次创建后接收原始 DBAPI 连接。 如果非 None,则可调用对象由连接策略组装到 first_connect/connect 池侦听器中。 为方言提供了更简单的接口。

  • [engines]

    StaticPool 现在在不打开新连接的情况下初始化、处置和重新创建 - 仅在首次请求时才打开连接。 dispose() 现在也适用于 AssertionPool。

    参考链接: #1728

  • [metadata] [ticket: 1673]

    通过传递 “schema=None” 作为参数,添加了在使用 “tometadata” 时剥离模式信息的功能。 如果未指定模式,则保留表的模式。

  • [declarative]

    DeclarativeMeta 专门使用 cls.__dict__(而不是 dict_)作为类信息的来源; _as_declarative 专门使用传递给它的 dict_ 作为类信息的来源(当使用 DeclarativeMeta 时,它是 cls.__dict__)。 从理论上讲,这应该使自定义元类更容易修改传递到 _as_declarative 中的状态。

  • [declarative]

    declarative 现在直接接受 mixin 类,作为在所有子类上提供通用功能和基于列的元素的一种手段,以及将一组固定的 __table_args__ 或 __mapper_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() 的 ‘synchronize’ 策略在失败时引发错误。 没有隐式回退到 “fetch”。 评估失败基于标准的结构,因此成功/失败是基于代码结构确定的。

  • [orm]

    多对一关系的增强功能
    • 多对一关系现在在更少的情况下触发延迟加载,包括在大多数情况下,当替换新值时不会获取 “旧” 值。

    • 连接表子类的多对一关系现在使用 get() 进行简单加载(称为 “use_get” 条件),即 Related->Sub(Base),而无需根据基表重新定义 primaryjoin 条件。

    • 使用声明性列指定外键,即 ForeignKey(MyRelatedClass.id) 不会破坏 “use_get” 条件的发生

    • relation(), eagerload() 和 eagerload_all() 现在提供了一个名为 “innerjoin” 的选项。指定 TrueFalse 来控制预先加载连接是构造为 INNER 连接还是 OUTER 连接。默认值仍然是 False。映射器选项将覆盖在 relation() 上指定的任何设置。通常应为多对一、不可为空的外键关系设置此选项,以提高连接性能。

    • 当存在 LIMIT/OFFSET 时,预先加载的行为会将主查询包装在子查询中,但现在对于所有预先加载都是多对一连接的情况,则会进行例外处理。在这些情况下,预先加载连接将直接针对父表进行,并带有 limit/offset,而不会产生子查询的额外开销,因为多对一连接不会向结果中添加行。

    参考链接: #1186, #1492, #1544

  • [orm]

    Session.merge() 的增强 / 变更

  • [orm]

    Session.merge() 上的 “dont_load=True” 标志已被弃用,现在为 “load=False”。

  • [orm]

    Session.merge() 的性能得到了优化,与 0.5 版本相比,“load=False” 模式的调用次数减少了一半,并且对于 “load=True” 模式下的集合,SQL 查询的数量也显著减少。

  • [orm]

    如果给定的实例与已存在的实例相同,merge() 将不会对属性执行不必要的合并。

  • [orm]

    merge() 现在还会合并与给定状态关联的 “options”,即那些通过 query.options() 传递的选项,这些选项会随实例一起传递,例如用于预先或延迟加载各种属性的选项。这对于构建高度集成的缓存方案至关重要。这是一个与 0.5 版本相比细微的行为变化。

  • [orm]

    修复了一个关于实例状态上 “加载器路径” 序列化的错误,这在使用 merge() 与序列化状态以及应保留的相关选项结合使用时也是必要的。

  • [orm]

    全新的 merge() 在一个新的综合示例中展示了如何将 Beaker 与 SQLAlchemy 集成。请参阅下面 “示例” 注释中的说明。

  • [orm]

    主键值现在可以在连接表继承对象上更改,并且在 flush 发生时将考虑 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]

    当 eager 或 lazy load 为该行找到多个有效值时,uselist=False 的 relation() 将发出警告。这可能是由于 primaryjoin/secondaryjoin 条件不适用于 eager LEFT OUTER JOIN 或其他条件。

    参考链接: #1643

  • [orm]

    当 synonym() 与 map_column=True 一起使用时,并且当 ColumnProperty(延迟或其他)与发送给 mapper 的属性字典中存在具有相同键名的单独属性时,会发生显式检查。不会静默地替换现有属性(以及该属性上可能的选项),而是会引发错误。

    参考链接: #1633

  • [orm]

    “dynamic” 加载器在其构造时设置其查询条件,以便从 “statement” 等非克隆访问器返回实际查询。

  • [orm]

    迭代 Query() 时返回的 “命名元组” 对象现在是可 pickle 化的。

  • [orm]

    映射到 select() 构造现在要求您明确地从中创建一个 alias()。这是为了消除对此类问题的困惑,例如

    参考链接: #1542

  • [orm]

    query.join() 已被重新设计,以提供更一致的行为和更大的灵活性(包括includes)

    参考链接: #1537

  • [orm]

    query.select_from() 接受多个子句,以在 FROM 子句中生成多个逗号分隔的条目。当从多宿主 join() 子句中选择时非常有用。

  • [orm]

    query.select_from() 也接受映射类、aliased() 构造和映射器作为参数。特别是,当从多个连接表类查询时,这有助于确保渲染完整的连接。

  • [orm]

    query.get() 可以与映射到外连接的映射一起使用,其中一个或多个主键值为 None。

    参考链接: #1135

  • [orm]

    query.from_self()、query.union() 以及其他执行 “SELECT * from (SELECT…)” 类型嵌套的操作,将更好地转换子查询中的列表达式到外部查询的 columns 子句。这可能与 0.5 版本向后不兼容,因为它可能会破坏带有未应用标签的文字表达式(即 literal(‘foo’) 等)的查询。

    参考链接: #1568

  • [orm]

    relation 的 primaryjoin 和 secondaryjoin 现在检查它们是否是列表达式,而不仅仅是子句元素。这禁止将 FROM 表达式直接放置在那里。

    参考链接: #1622

  • [orm]

    expression.null() 与在 query.filter()、filter_by() 等中比较对象/集合引用属性时,对 None 的理解方式完全相同。

    参考链接: #1415

  • [orm]

    添加了 “make_transient()” 辅助函数,该函数将持久/分离的实例转换为瞬态实例(即删除 instance_key 并从任何会话中移除)。

    参考链接: #1052

  • [orm]

    mapper() 上的 allow_null_pks 标志已被弃用,并且该功能默认设置为 “on”。这意味着对于其任何主键列具有非空值的行,将被视为一个标识。这种情况的需要通常只发生在映射到外连接时。

    参考链接: #1339

  • [orm]

    “backref” 的机制已完全合并到更精细的 “back_populates” 系统中,并在 RelationProperty 的 _generate_backref() 方法中完全进行。这简化了 RelationProperty 的初始化过程,并允许更容易地将设置(例如来自 RelationProperty 的子类)传播到反向引用。内部 BackRef() 已被移除,backref() 返回一个 RelationProperty 可以理解的普通元组。

  • [orm]

    当 version_id_col 功能与不支持充分 “rowcount” 的方言一起使用时,mapper() 上的 version_id_col 功能将引发警告。

    参考链接: #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=(“*”, <some selectable>)’。

    • synonym() 上的 ‘proxy’ 参数已移除。此标志在整个 0.5 版本中没有任何作用,因为 “代理生成” 行为现在是自动的。

    • 将元素的单个列表而不是多个位置 *args 传递给 eagerload()、eagerload_all()、contains_eager()、lazyload()、defer() 和 undefer() 已被弃用。

    • 将元素的单个列表而不是多个位置 *args 传递给 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 仍然已弃用。请参阅 https://sqlalchemy.org.cn/trac/wiki/UsageRecipes/SessionAwareMapper 上的用法示例。

    • 将 InstanceState(内部 SQLAlchemy 状态对象)传递给 attributes.init_collection() 或 attributes.get_history() 已被弃用。这些函数是公共 API,通常期望一个常规的映射对象实例。

    • declarative_base() 的 ‘engine’ 参数已移除。使用 ‘bind’ 关键字参数。

sql

  • [sql]

    select() 和 text() 以及 select().autocommit() 上的 “autocommit” 标志已弃用 - 现在在这些构造上调用 .execution_options(autocommit=True),也可以直接在 Connection 和 orm.Query 上使用。

  • [sql]

    列上的 autoincrement 标志现在指示应链接到 cursor.lastrowid 的列(如果使用该方法)。有关详细信息,请参阅 API 文档。

  • [sql]

    executemany() 现在要求所有绑定参数集都必须存在在第一个绑定参数集中存在的所有键。insert/update 语句的结构和行为很大程度上取决于第一个参数集,包括将触发哪些默认值,并且对所有其余参数执行最少的猜测,以便不影响性能。因此,默认值原本会为缺失的参数静默 “失败”,因此现在对此进行了保护。

    参考链接: #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 样式的语句执行,此字典都以相同的方式可用。

  • [sql]

    多部分模式名称,即带有点的模式名称,例如 “dbo.master”,现在在 select() 标签中用下划线代替点进行渲染,例如 “dbo_master_table_column”。这是一个 “友好” 标签,在结果集中表现更好。

    参考链接: #1428

  • [sql]

    移除了 select() 标签名称与表中列名称匹配时的不必要的 “计数器” 行为,即为 “id” 生成 “tablename_id”,而不是 “tablename_id_1”,试图避免命名冲突,当表实际有一个名为 “tablename_id” 的列时 - 这是因为标签逻辑始终应用于所有列,因此永远不会发生命名冲突。

  • [sql]

    调用 expr.in_([]),即使用空列表,在发出通常的 “expr != expr” 子句之前发出警告。“expr != expr” 可能会非常昂贵,最好是用户在列表为空时不发出 in_(),而是简单地不查询,或根据更复杂的情况修改条件。

    参考链接: #1628

  • [sql]

    为 select()/text() 添加了 “execution_options()”,它设置 Connection 的默认选项。请参阅 “引擎” 中的注释。

  • [sql]

    已弃用或移除
    • select() 上的 “scalar” 标志已移除,请使用 select.as_scalar()。

    • bindparam() 上的 “shortname” 属性已移除。

    • insert()、update()、delete() 上的 postgres_returning、firebird_returning 标志已弃用,请使用新的 returning() 方法。

    • join 上的 fold_equivalents 标志已弃用(将保留直到实现)。

    参考链接: #1131

schema

  • [schema]

    MetaData__contains__() 方法现在接受字符串或 Table 对象作为参数。如果给定 Table,则参数首先转换为 table.key,即 “[schemaname.]<tablename>”。

    参考链接: #1541

  • [schema]

    已弃用的 MetaData.connect() 和 ThreadLocalMetaData.connect() 已被移除 - 将 “bind” 属性发送到 bind 元数据。

  • [schema]

    已弃用的 metadata.table_iterator() 方法已移除(使用 sorted_tables)。

  • [schema]

    已弃用的 PassiveDefault - 使用 DefaultClause。

  • [schema]

    “metadata” 参数已从 DefaultGenerator 及其子类中移除,但仍本地存在于 Sequence 上,Sequence 是 DDL 中的独立构造。

  • [schema]

    移除了 Index 和 Constraint 对象的公共可变性

    • ForeignKeyConstraint.append_element()

    • Index.append_column()

    • UniqueConstraint.append_column()

    • PrimaryKeyConstraint.add()

    • PrimaryKeyConstraint.remove()

    这些应以声明方式构造(即在一个构造中)。

  • [schema]

    Sequence 上的 “start” 和 “increment” 属性现在默认在 Oracle 和 PostgreSQL 上生成 “START WITH” 和 “INCREMENT BY”。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 对象现在正确地 copy() 其所有公共关键字参数。

    参考链接: #1605

postgresql

  • [postgresql]

    新方言:pg8000、zxjdbc 和 py3k 上的 pypostgresql。

  • [postgresql]

    “postgres” 方言现在被命名为 “postgresql”!连接字符串如下所示

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

    “postgres” 名称在以下方面保持向后兼容性

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

    • 可以从旧的 “databases” 模块导入 “postgres” 名称,即 “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 扩展”,这允许所有 String/Text/etc. 类型跳过将字节串后处理为 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 插入主键 + 外键列将允许引发 “not null constraint” 错误,而不是尝试执行不存在的 “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,因为 VARCHAR 在 MySQL CAST 中无论如何都不允许,在这种情况下,方言会渲染 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 类型,并且如果给定的 labelnames 是 unicode 对象,则也隐式处理 unicode 值。

  • [mysql]

    如果未将 “nullable=False” 传递给 Column() 并且不存在默认值,则 TIMESTAMP 类型的列现在默认为 NULL。这现在与其他所有类型一致,并且在 TIMESTAMP 的情况下,由于 MySQL 的 TIMESTAMP 列的默认可空性的 “切换”,显式渲染 “NULL”。

    参考链接: #1539

sqlite

  • [sqlite]

    DATE、TIME 和 DATETIME 类型现在可以接受可选的 storage_format 和 regexp 参数。storage_format 可用于使用自定义字符串格式存储这些类型。regexp 允许使用自定义正则表达式来匹配数据库中的字符串值。

  • [sqlite]

    Time 和 DateTime 类型现在默认使用更严格的正则表达式来匹配数据库中的字符串。如果您使用的是以旧格式存储的数据,请使用 regexp 参数。

  • [sqlite]

    不再支持 SQLite Time 和 DateTime 类型上的 __legacy_microseconds__。您应该改用 storage_format 参数。

  • [sqlite]

    Date、Time 和 DateTime 类型现在对它们接受的绑定参数更加严格:Date 类型仅接受 date 对象(以及 datetime 对象,因为它们继承自 date),Time 仅接受 time 对象,而 DateTime 仅接受 date 和 datetime 对象。

  • [sqlite]

    Table() 支持关键字参数 “sqlite_autoincrement”,它将 SQLite 关键字 “AUTOINCREMENT” 应用于生成 DDL 时的单个整数主键列。将阻止生成单独的 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 时 100% 通过!

  • [oracle]

    支持 cx_Oracle 的 “native unicode” 模式,该模式不需要设置 NLS_LANG。请使用最新 5.0.2 或更高版本的 cx_oracle。

  • [oracle]

    NCLOB 类型已添加到基本类型中。

  • [oracle]

    use_ansi=False 不会泄漏到从也使用 JOIN/OUTERJOIN 的子查询中选择的语句的 FROM/WHERE 子句中。

  • [oracle]

    向方言添加了原生 INTERVAL 类型。由于 cx_oracle 缺乏对 YEAR TO MONTH 的支持,因此目前仅支持 DAY TO SECOND interval 类型。

    参考:#1467

  • [oracle]

    CHAR 类型的使用会导致 cx_oracle 的 FIXED_CHAR dbapi 类型绑定到语句。

  • [oracle]

    Oracle 方言现在具有 NUMBER 类型,旨在像 Oracle 的 NUMBER 类型一样工作。它是表反射返回的主要数字类型,并尝试根据精度/比例参数返回 Decimal()/float/int。

    参考:#885

  • [oracle]

    func.char_length 是 LENGTH 的通用函数

  • [oracle]

    包含 onupdate=<value> 的 ForeignKey() 将发出警告,而不是发出 oracle 不支持的 ON UPDATE CASCADE

  • [oracle]

    RowProxy() 的 keys() 方法现在返回标准化为 SQLAlchemy 大小写不敏感名称的结果列名称。这意味着对于大小写不敏感的名称,它们将是小写,而 DBAPI 通常会将它们作为大写名称返回。这允许行 keys() 与进一步的 SQLAlchemy 操作兼容。

  • [oracle]

    使用新的 dialect.initialize() 功能来设置依赖于版本的行为。

  • [oracle]

    将 types.BigInteger 与 Oracle 一起使用将生成 NUMBER(19)

    参考:#1125

  • [oracle]

    “大小写敏感性” 功能将在反射期间检测到全小写的大小写敏感列名称,并将 “quote=True” 添加到生成的 Column,以便保持正确的引用。

misc

  • [major] [release]

    有关完整的功能描述,请参阅 https://docs.sqlalchemy.org.cn/en/latest/changelog/migration_06.html 。本文档正在编写中。

  • [major] [release]

    来自最新 0.5 版本及以下的所有错误修复和功能增强也包含在 0.6 中。

  • [major] [release]

    现在面向的平台包括 Python 2.4/2.5/2.6、Python 3.1、Jython2.5。

  • [engines]

    事务隔离级别可以使用 create_engine(… isolation_level=”…”); 指定;在 postgresql 和 sqlite 上可用。

    参考:#443

  • [engines]

    Connection 具有 execution_options(),生成方法,它接受影响语句相对于 DBAPI 执行方式的关键字。目前支持 “stream_results”,使 psycopg2 为该语句使用服务器端游标,以及 “autocommit”,它是来自 select() 和 text() 的 “autocommit” 选项的新位置。select() 和 text() 也具有 .execution_options() 以及 ORM Query()。

  • [engines]

    修复了入口点驱动的方言的导入,不再依赖于愚蠢的 tb_info 技巧来确定导入错误状态。

    参考:#1630

  • [engines]

    向 ResultProxy 添加了 first() 方法,返回第一行并立即关闭结果集。

  • [engines]

    RowProxy 对象现在是可 pickle 的,即 result.fetchone()、result.fetchall() 等返回的对象。

  • [engines]

    RowProxy 不再具有 close() 方法,因为行不再维护对父对象的引用。请在父 ResultProxy 上调用 close(),或使用 autoclose。

  • [engines]

    ResultProxy 内部结构已彻底改进,以大大减少获取列时的方法调用计数。在获取大型结果集时,可以提供很大的速度提升(高达 100% 以上)。当获取没有应用类型级别处理的列以及将结果用作元组(而不是字典)时,改进更大。非常感谢 Elixir 的 Gaëtan de Menten 带来的这一显著改进!

    参考:#1586

  • [engines]

    依赖于 “last inserted id” 的 postfetch 来获取生成的序列值的数据库(即 MySQL、MS-SQL)现在在存在复合主键且 “autoincrement” 列不是表中的第一个主键列时也能正确工作。

  • [engines]

    last_inserted_ids() 方法已重命名为描述符 “inserted_primary_key”。

  • [engines]

    在 create_engine() 上设置 echo=False 现在将日志级别设置为 WARN 而不是 NOTSET。这样,即使为 “sqlalchemy.engine” 启用了日志记录,也可以为特定引擎禁用日志记录。请注意,“echo” 的默认设置为 None

    参考:#1554

  • [engines]

    ConnectionProxy 现在具有所有事务生命周期事件的包装器方法,包括 begin()、rollback()、commit() begin_nested()、begin_prepared()、prepare()、release_savepoint() 等。

  • [engines]

    连接池日志记录现在同时使用 INFO 和 DEBUG 日志级别进行日志记录。INFO 用于主要事件,例如无效连接,DEBUG 用于所有获取/返回日志记录。echo_pool 可以是 False、None、True 或 “debug”,与 echo 的工作方式相同。

  • [engines]

    所有 pyodbc 方言现在都支持额外的 pyodbc 特定关键字参数 ‘ansi’、‘unicode_results’、‘autocommit’。

    参考:#1621

  • [engines]

    “threadlocal” 引擎已重写和简化,现在支持 SAVEPOINT 操作。

  • [engines]

    已弃用或移除
    • 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,这些参数传递给给定的可调用对象,以及操作连接。

  • [reflection/inspection]

    表反射已扩展并概括为名为 “sqlalchemy.engine.reflection.Inspector” 的新 API。Inspector 对象提供关于各种模式信息的细粒度信息,并具有扩展空间,包括表名、列名、视图定义、序列、索引等。

  • [reflection/inspection]

    视图现在可以作为普通的 Table 对象进行反射。使用相同的 Table 构造函数,但需要注意的是,“有效” 的主键和外键约束不是反射结果的一部分;如果需要,必须显式指定这些约束。

  • [reflection/inspection]

    现有的 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 对象本身

    event

    字符串事件名称。

    target

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

    connection

    用于操作的 Connection 对象。

    **kw

    关键字参数。在 MetaData before/after create/drop 的情况下,要为其发出 CREATE/DROP DDL 的 Table 对象列表将作为关键字参数 “tables” 传递。这对于依赖于特定表存在的元数据级别 DDL 是必要的。

    DDL 的 “schema_item” 属性已重命名为

    “target”。

  • [dialect] [refactor]

    方言模块现在分为数据库方言和 DBAPI 实现。连接 URL 现在首选使用 dialect+driver://… 指定,例如 “mysql+mysqldb://scott:tiger@localhost/test”。有关示例,请参阅 0.6 文档。

  • [dialect] [refactor]

    外部方言的 setuptools 入口点现在称为 “sqlalchemy.dialects”。

  • [dialect] [refactor]

    “owner” 关键字参数已从 Table 中移除。使用 “schema” 表示要添加到表名称的任何命名空间。

  • [dialect] [refactor]

    server_version_info 变为静态属性。

  • [dialect] [refactor]

    方言在初始连接时接收 initialize() 事件以确定连接属性。

  • [dialect] [refactor]

    方言接收 visit_pool 事件,有机会建立池监听器。

  • [dialect] [refactor]

    缓存的 TypeEngine 类是按方言类而不是按方言缓存的。

  • [dialect] [refactor]

    新的 UserDefinedType 应用作新类型的基础类,它保留了 0.5 版本的 get_col_spec() 行为。

  • [dialect] [refactor]

    所有类型类的 result_processor() 方法现在接受第二个参数 “coltype”,它是来自 cursor.description 的 DBAPI 类型参数。此参数可以帮助某些类型决定最有效的结果值处理方式。

  • [dialect] [refactor]

    已弃用 Dialect.get_params() 并已移除。

  • [dialect] [refactor]

    Dialect.get_rowcount() 已重命名为描述符 “rowcount”,并直接调用 cursor.rowcount。对于某些调用需要硬编码行计数的方言,应重写该方法以提供不同的行为。

  • [dialect] [refactor]

    DefaultRunner 及其子类已被移除。此对象的工作已简化并移至 ExecutionContext。支持序列的方言应向其执行上下文实现添加 fire_sequence() 方法。

    参考链接: #1566

  • [dialect] [refactor]

    编译器生成的功能和运算符现在使用(几乎)常规的调度函数,形式为 “visit_<opname>” 和 “visit_<funcname>_fn”,以提供自定义处理。这取代了在编译器子类中复制 “functions” 和 “operators” 字典的需求,而是使用直接的访问者方法,并且还允许编译器子类完全控制渲染,因为传递了完整的 _Function 或 _BinaryExpression 对象。

  • [firebird]

    RowProxy() 的 keys() 方法现在返回标准化为 SQLAlchemy 大小写不敏感名称的结果列名称。这意味着对于大小写不敏感的名称,它们将是小写,而 DBAPI 通常会将它们作为大写名称返回。这允许行 keys() 与进一步的 SQLAlchemy 操作兼容。

  • [firebird]

    使用新的 dialect.initialize() 功能来设置依赖于版本的行为。

  • [firebird]

    “大小写敏感性” 功能将在反射期间检测到全小写的大小写敏感列名称,并将 “quote=True” 添加到生成的 Column,以便保持正确的引用。

  • [types]

    方言中类型的构造已完全改进。方言现在将公开可用的类型定义为完全大写的名称,并将内部实现类型使用下划线标识符(即私有的)。SQL 和 DDL 中表示类型的系统已移至编译器系统。这样做的好处是大多数方言中的类型对象要少得多。有关方言作者的此体系结构的详细文档位于 lib/sqlalchemy/dialects/type_migration_guidelines.txt 中。

  • [types]

    类型不再对默认参数进行任何猜测。特别是,Numeric、Float、NUMERIC、FLOAT、DECIMAL 不会生成任何长度或比例,除非指定。

  • [types]

    types.Binary 已重命名为 types.LargeBinary,它仅生成 BLOB、BYTEA 或类似的 “long binary” 类型。新的基本 BINARY 和 VARBINARY 类型已添加,以不特定于数据库的方式访问这些 MySQL/MS-SQL 特定类型。

    参考:#1664

  • [types]

    如果方言检测到 DBAPI 本机返回 Python unicode 对象,则 String/Text/Unicode 类型现在会跳过对每个结果列值的 unicode() 检查。此检查在首次连接时使用 “SELECT CAST ‘some text’ AS VARCHAR(10)” 或等效命令发出,然后检查返回的对象是否为 Python unicode。这为本机 unicode DBAPI 提供了巨大的性能提升,包括 pysqlite/sqlite3、psycopg2 和 pg8000。

  • [types]

    大多数类型的 result processors 都已检查了可能的性能改进。具体来说,以下通用类型已得到优化,从而实现了不同的速度提升:Unicode、PickleType、Interval、TypeDecorator、Binary。此外,以下 dbapi 特定实现也得到了改进:Sqlite 上的 Time、Date 和 DateTime、PostgreSQL 上的 ARRAY、MySQL 上的 Time、MySQL、oursql 和 pypostgresql 上的 Numeric(as_decimal=False)、cx_oracle 上的 DateTime 以及 cx_oracle 上的基于 LOB 的类型。

  • [types]

    类型的反射现在返回 types.py 中的确切大写类型,或者如果类型不是标准 SQL 类型,则返回方言本身中的大写类型。这意味着反射现在返回关于反射类型的更准确的信息。

  • [types]

    添加了新的 Enum 通用类型。Enum 是一个模式感知对象,用于支持需要特定 DDL 才能使用枚举或等效项的数据库;在 PG 的情况下,它处理 CREATE TYPE 的详细信息,而在没有原生枚举支持的其他数据库上,将通过生成 VARCHAR + 内联 CHECK 约束来强制执行枚举。

    参考:#1109, #1511

  • [types]

    Interval 类型包含一个 “native” 标志,用于控制是否选择可用的原生 INTERVAL 类型(postgresql + oracle)。还添加了 “day_precision” 和 “second_precision” 参数,它们会适当地传播到这些原生类型。相关于。

    参考:#1467

  • [types]

    Boolean 类型在没有原生布尔支持的后端上使用时,将生成 CHECK 约束 “col IN (0, 1)” 以及基于 int/smallint 的列类型。如果需要,可以使用 create_constraint=False 关闭此功能。请注意,MySQL 没有原生布尔 CHECK 约束支持,因此此功能在该平台上不可用。

    参考:#1589

  • [types]

    PickleType 现在在 mutable=True 时使用 == 进行值比较,除非为类型指定了带有比较函数的 “comparator” 参数。如果未重写 __eq__() 或未提供比较函数,则将基于标识比较要 pickle 的对象(这会破坏 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.<sometable>.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]

    由于 Scott Torborg 的贡献,association_proxy 现在具有基本的比较器方法 .any()、.has()、.contains()、==、!=。

    参考:#1372