0.8 更新日志

0.8.7

发布日期:2014年7月22日

orm

  • [orm] [bug]

    修复了子查询预加载中的错误,该错误发生在多态子类边界上的长链预加载与多态加载结合使用时,会导致在链中找不到子类链接,从而在 AliasedClass 上因缺少属性名称而报错。

    参考: #3055

  • [orm] [bug]

    修复了 ORM 错误,其中 class_mapper() 函数会屏蔽在映射器配置期间由于用户错误而应引发的 AttributeError 或 KeyError。 属性/键错误捕获已变得更具体,不包括配置步骤。

    参考: #3047

sql

  • [sql] [bug]

    修复了 Enum 和其他 SchemaType 子类中的错误,其中类型与 MetaData 的直接关联会导致在 MetaData 上发出事件(如创建事件)时挂起。

    参考: #3124

  • [sql] [bug]

    修复了自定义运算符加上 TypeEngine.with_variant() 系统中的一个错误,由此,当使用比较运算符时,将 TypeDecorator 与 variant 结合使用将因 MRO 错误而失败。

    参考: #3102

  • [sql] [bug]

    修复了 INSERT..FROM SELECT 构造中的错误,其中从 UNION 中选择会将 union 包装在匿名(例如,未标记)子查询中。

    参考: #3044

  • [sql] [bug]

    修复了当应用空的 and_()or_() 或其他空白表达式时,Table.update()Table.delete() 会生成空 WHERE 子句的错误。 现在这与 select() 的行为一致。

    参考: #3045

postgresql

  • [postgresql] [bug]

    为 PG HSTORE 类型添加了 hashable=False 标志,这是允许 ORM 在混合列/实体列表中请求 ORM 映射的 HSTORE 列时跳过尝试“哈希”它的步骤所必需的。 此补丁由 Gunnlaugur Þór Briem 提供。

    参考: #3053

  • [postgresql] [bug]

    添加了一条新的“断开连接”消息“connection has been closed unexpectedly”(连接已意外关闭)。 这似乎与较新版本的 SSL 有关。 此 pull request 由 Antti Haapala 提供。

mysql

  • [mysql] [bug]

    在现代 MySQL-Python 版本中,MySQL 错误 2014 “commands out of sync”(命令不同步)似乎作为 ProgrammingError 而不是 OperationalError 引发; 现在,无论如何,都会在 OperationalError 和 ProgrammingError 中检查所有被测试为“is disconnect”(是否断开连接)的 MySQL 错误代码。

    参考: #3101

  • [mysql] [bug]

    修复了在索引上添加到 mysql_length 参数的列名需要具有相同的引号才能被识别为带引号名称的错误。 此修复使引号成为可选的,但也为那些使用解决方法的人提供了向后兼容的旧行为。

    参考: #3085

  • [mysql] [bug]

    添加了对使用等号反映包含 KEY_BLOCK_SIZE 的索引的表的支持。 此 pull request 由 Sean McGivern 提供。

mssql

  • [mssql] [bug]

    为“SET IDENTITY_INSERT”语句添加了语句编码,这些语句在显式 INSERT 被插入 IDENTITY 列时运行,以支持不支持 unicode 语句的驱动程序(如 pyodbc + unix + py2k)上的非 ascii 表标识符。

  • [mssql] [bug]

    在 SQL Server pyodbc 方言中,修复了 description_encoding 方言参数的实现,当未显式设置该参数时,会阻止在结果集中包含备用编码的名称的情况下正确解析 cursor.description。 今后应该不需要此参数。

    参考: #3091

misc

  • [bug] [declarative]

    当访问 __mapper_args__ 字典时,会从声明式 mixin 或抽象类中复制它,以便声明式自身对此字典所做的修改不会与其他映射的修改冲突。 该字典针对 version_id_colpolymorphic_on 参数进行了修改,将字典中的列替换为正式映射到本地类/表的列。

    参考: #3062

  • [bug] [ext]

    修复了 mutable 扩展中的错误,其中 MutableDict 未报告 setdefault() 字典操作的更改事件。

    参考: #3051, #3093

  • [bug] [ext]

    修复了 MutableDict.setdefault() 没有返回现有值或新值的错误(此错误未在任何 0.8 版本中发布)。 此 pull request 由 Thomas Hervé 提供。

    参考: #3051, #3093

0.8.6

发布日期:2014年3月28日

general

  • [general] [bug]

    调整了 setup.py 文件以支持未来可能从 setuptools 中删除 setuptools.Feature 扩展。 如果此关键字不存在,则设置仍将使用 setuptools 成功,而不是回退到 distutils。 现在也可以通过设置 DISABLE_SQLALCHEMY_CEXT 环境变量来禁用 C 扩展构建。 无论 setuptools 是否可用,此变量都有效。

    参考: #2986

orm

  • [orm] [bug]

    修复了 ORM 错误,其中更改对象的主键,然后将其标记为 DELETE 将无法定位要 DELETE 的正确行。

    参考: #3006

  • [orm] [bug]

    修复了因 #2818 导致的 0.8.3 回归,其中 Query.exists() 将无法在仅具有 Query.select_from() 条目但没有其他实体的查询上工作。

    参考: #2995

  • [orm] [bug]

    改进了错误消息,如果针对不可选对象(例如 literal_column())进行 query(),然后尝试使用 Query.join(),以至于“left”侧将被确定为 None 然后失败,则会发生此错误消息。 现在已显式检测到此情况。

  • [orm] [bug]

    sqlalchemy.orm.interfaces.__all__ 中删除了过时的名称,并使用当前名称刷新,以便再次从该模块 import * 可以正常工作。

    参考: #2975

sql

  • [sql] [bug]

    修复了 tuple_() 构造中的错误,其中本质上第一个 SQL 表达式的“类型”将作为“比较类型”应用于比较的元组值; 这在某些情况下会产生不适当的“类型强制转换”,例如,当具有 String 和 Binary 值混合的元组不正确地将目标值强制转换为 Binary,即使这不是它们在左侧的类型时。 tuple_() 现在期望其值列表中包含异构类型。

    参考: #2977

postgresql

  • [postgresql] [feature]

    为 psycopg2 DBAPI 启用了“明智的多行计数”检查,因为这似乎在 psycopg2 2.0.9 及更高版本中受支持。

  • [postgresql] [bug]

    修复了由版本 0.8.5 / 0.9.3 的兼容性增强功能引起的回归,其中特定于仅 8.1、8.2 系列的 PostgreSQL 版本上的索引反射再次中断,围绕着始终存在问题的 int2vector 类型。 虽然 int2vector 从 8.1 开始支持数组操作,但显然它仅从 8.3 开始支持 CAST 到 varchar。

    参考: #3000

misc

  • [bug] [ext]

    修复了 mutable 扩展以及 flag_modified() 中的错误,其中如果属性已重新分配给自己,则不会传播更改事件。

    参考: #2997

0.8.5

发布日期:2014年2月19日

orm

  • [orm] [bug]

    修复了 Query.get() 在对具有现有条件的查询调用,且给定标识已存在于标识映射中时,未能始终如一地引发 InvalidRequestError 的错误。

    参考: #2951

  • [orm] [bug]

    修复了将迭代器对象传递给 class_mapper() 或类似函数时,错误无法以字符串格式呈现的错误。 Pullreq 由 Kyle Stark 提供。

  • [orm] [bug]

    subqueryload() 策略的调整,该策略确保查询在加载过程开始后运行; 这是为了使 subqueryload 优先于可能由于其他错误的时间的其他预加载/noload 情况而访问同一属性的其他加载器。

    参考: #2887

  • [orm] [bug]

    修复了从表到基表上的 select/alias 使用连接表继承时,PK 列也不同名时的错误; 持久性系统将无法在 INSERT 时将主键值从基表复制到继承表。

    参考: #2885

  • [orm] [bug]

    当传递的列/属性(名称)无法解析为 Column 或映射属性(例如错误的元组)时,composite() 将引发信息性错误消息; 之前引发了未绑定的本地变量错误。

    参考: #2889

engine

  • [engine] [bug] [pool]

    修复了由 #2880 引起的严重回归,其中从池返回连接的新并发能力意味着 “first_connect”(首次连接)事件现在也不同步,从而导致即使在最小的并发情况下也会出现方言配置错误。

    参考: #2880, #2964

sql

  • [sql] [bug]

    修复了使用空列表或元组调用 Insert.values() 会引发 IndexError 的错误。 现在它会生成一个空插入构造,就像使用空字典一样。

    参考: #2944

  • [sql] [bug]

    修复了如果错误地将列表达式(其比较器包含 __getitem__() 方法,例如使用 ARRAY 类型的列)传递给 ColumnOperators.in_(),则会进入无限循环的错误。

    参考: #2957

  • [sql] [bug]

    修复了主键列上有一个 Sequence,但该列不是“自动递增”列(因为它具有外键约束或设置了 autoincrement=False)的问题,当 INSERT 缺少主键值时,它会尝试在不支持序列的后端上触发 Sequence。 这将发生在非序列后端(如 SQLite、MySQL)上。

    参考: #2896

  • [sql] [bug]

    修复了 Insert.from_select() 方法的错误,其中在生成 INSERT 语句时不会考虑给定名称的顺序,从而导致与给定 SELECT 语句中的列名不匹配。 另请注意,Insert.from_select() 意味着不能使用 Python 端插入默认值,因为该语句没有 VALUES 子句。

    参考: #2895

  • [sql] [enhancement]

    现在,当编译语句中存在 BindParameter 且没有值时引发的异常,会在错误消息中包含绑定参数的键名。

postgresql

  • [postgresql] [bug]

    为 psycopg2 断开连接检测添加了一条附加消息“could not send data to server”(无法将数据发送到服务器),该消息补充了现有的“could not receive data from server”(无法从服务器接收数据),并且已被用户观察到。

    参考: #2936

  • [postgresql] [bug]

    改进了对非常旧的 PostgreSQL 版本(8.1 之前)以及潜在的其他 PG 引擎(如 Redshift)(假设 Redshift 将版本报告为 < 8.1)的 PostgreSQL 反射行为的支持。 “索引”以及“主键”的查询依赖于检查所谓的“int2vector”数据类型,该数据类型在 8.1 之前拒绝强制转换为数组,从而导致在使用查询中使用的 “ANY()” 运算符时失败。 大量的谷歌搜索已经找到了非常 hacky 但由 PG 核心开发人员推荐的查询,以便在使用 PG 版本 < 8.1 时使用,因此索引和主键约束反射现在在这些版本上有效。

  • [postgresql] [bug]

    修订了这个非常古老的问题,其中 PostgreSQL “获取主键”反射查询已更新为考虑重命名的主键约束; 较新的查询在非常旧的 PostgreSQL 版本(如版本 7)上失败,因此在检测到 server_version_info < (8, 0) 时,旧查询将在这些情况下恢复。

    参考: #2291

mysql

  • [mysql] [feature]

    添加了新的 MySQL 特有 DATETIME,其中包括小数秒支持; 还为 TIMESTAMP 添加了小数秒支持。 DBAPI 支持有限,但已知 MySQL Connector/Python 支持小数秒。 此补丁由 Geert JM Vanderkelen 提供。

    参考: #2941

  • [mysql] [bug]

    添加了对 PARTITION BYPARTITIONS MySQL 表关键字的支持,指定为 Tablemysql_partition_by='value'mysql_partitions='value'。 此 pull request 由 Marcus McCurdy 提供。

    参考: #2966

  • [mysql] [bug]

    修复了阻止基于 MySQLdb 的方言(例如 pymysql)在 Py3K 中工作的错误,其中由于 Py3K 更严格的值比较规则,对“connection charset”(连接字符集)的检查将失败。 在任何情况下,所讨论的调用都没有考虑数据库版本,因为此时服务器版本仍然为 None,因此总体方法已简化为依赖于 connection.character_set_name()。

    参考: #2933

  • [mysql] [bug]

    为 cymysql 方言添加了一些缺失的方法,包括 _get_server_version_info() 和 _detect_charset()。 Pullreq 由 Hajime Nakagami 提供。

sqlite

  • [sqlite] [bug]

    恢复了在将唯一约束反射反向移植到 0.8 时遗漏的更改,其中如果 UniqueConstraint 与 SQLite 一起使用,并且列名称中包含保留关键字,则会失败。 此 pull request 由 Roman Podolyaka 提供。

mssql

  • [mssql] [bug] [firebird]

    Float 类型一起使用的 “asdecimal” 标志现在也可以与 Firebird 以及 mssql+pyodbc 方言一起使用; 以前未发生十进制转换。

  • [mssql] [bug] [pymssql]

    将 “Net-Lib error during Connection reset by peer”(对等方重置连接期间的 Net-Lib 错误)消息添加到 pymssql 方言中检查 “disconnect”(断开连接)的消息列表中。 由 John Anderson 提供。

misc

  • [bug] [py3k]

    修复了 Py3K 错误,其中缺少导入会导致在呈现绑定参数时 “literal binary”(字面二进制)模式无法导入 “util.binary_type”。 0.9 以不同的方式处理此问题。 此 pull request 由 Andreas Zeidler 提供。

  • [bug] [firebird]

    firebird 方言将引用以下划线开头的标识符。 由 Treeve Jelbert 提供。

    参考: #2897

  • [bug] [firebird]

    修复了 Firebird 索引反射中的错误,其中索引中的列未正确排序; 它们现在按 RDB$FIELD_POSITION 的顺序排序。

  • [bug] [declarative]

    已更正发送到 relationship() 且无法解析为类或映射器的字符串参数的错误消息,使其与接收到非字符串参数时的工作方式相同,后者指示了具有配置错误的关联名称。

    参考: #2888

0.8.4

发布日期:2013年12月8日

orm

  • [orm] [bug]

    修复了由 #2818 引入的回归,其中生成的 EXISTS 查询会为具有两个同名列的语句生成 “columns being replaced”(列被替换)警告,因为内部 SELECT 没有设置 use_labels。

    参考: #2818

engine

  • [engine] [bug]

    一个 DBAPI 在 connect() 上引发错误,且该错误不是 dbapi.Error 的子类(例如 TypeErrorNotImplementedError 等),则会保持异常不变地传播。 以前,特定于 connect() 例程的错误处理既会不恰当地通过方言的 Dialect.is_disconnect() 例程运行异常,也会将其包装在 sqlalchemy.exc.DBAPIError 中。 现在,它会像在执行过程中一样保持不变地传播。

    参考: #2881

  • [engine] [bug] [pool]

    QueuePool 已得到增强,在现有连接尝试阻塞时不会阻塞新的连接尝试。 以前,新连接的生产在监视溢出的块内被序列化; 现在,溢出计数器在其自身的关键部分内,在连接过程之外被更改。

    参考: #2880

  • [engine] [bug] [pool]

    对等待池连接可用的逻辑进行了轻微调整,以便对于未指定超时的连接池,它将每半秒跳出等待以检查所谓的“中止”标志,该标志允许等待者在整个连接池被转储的情况下跳出; 通常,等待者应该由于 notify_all() 而跳出,但是在非常极端的情况下,notify_all() 可能会丢失。 这是 0.8.0 中首次引入的逻辑的扩展,并且该问题仅在压力测试中偶尔观察到。

    参考: #2522

  • [engine] [bug]

    修复了在 Connection.execute() 中引发 pre-DBAPI StatementError 时,SQL 语句会被不正确地进行 ASCII 编码的错误,从而导致非 ASCII 语句的编码错误。 字符串化现在保留在 Python unicode 中,从而避免了编码错误。

    参考: #2871

sql

postgresql

  • [postgresql] [bug]

    修复了当使用 pypostgresql 适配器时,索引反射会错误地解释 indkey 值的错误,该适配器将这些值作为列表返回,而不是 psycopg2 的字符串返回类型。

    参考: #2855

mssql

  • [mssql] [bug]

    修复了 0.8.0 中引入的错误,即如果 MSSQL 中索引的 DROP INDEX 语句位于备用模式中,则会错误地呈现; 模式名/表名将被颠倒。 格式也已修改为与当前的 MSSQL 文档匹配。 感谢 Derek Harland。

oracle

  • [oracle] [bug]

    将 ORA-02396 “最大空闲时间” 错误代码添加到带有 cx_oracle 的 “is disconnect” 代码列表中。

    参考: #2864

  • [oracle] [bug]

    修复了当没有长度的 Oracle VARCHAR 类型(例如,对于 CAST 或类似情况)会错误地呈现 None CHAR 或类似的错误。

    参考: #2870

misc

  • [bug] [ext]

    修复了阻止 serializer 扩展程序与包含非 ASCII 字符的表名或列名正确工作的错误。

    参考: #2869

0.8.3

发布日期:2013 年 10 月 26 日

orm

  • [orm] [feature]

    relationship() 添加了新选项 distinct_target_key。 这使子查询急切加载策略可以将 DISTINCT 应用于最内层的 SELECT 子查询,以帮助解决最内层查询(对应于此关系)生成重复行的情况(对于子查询急切加载中的重复行问题,目前还没有通用的解决方案,但是,当最内层子查询之外的连接产生重复项时)。 当标志设置为 True 时,将无条件地呈现 DISTINCT,当设置为 None 时,如果最内层关系的目标列不包含完整的主键,则呈现 DISTINCT。 该选项在 0.8 中默认为 False(例如,在所有情况下默认关闭),在 0.9 中为 None(例如,默认自动)。 感谢 Alexander Koval 在这方面的帮助。

    参考: #2836

  • [orm] [bug]

    修复了列表检测无法正确表示 [0:0] 的 setslice 的错误,这种情况尤其在使用关联代理时可能发生。 由于 Python 集合中的一些怪癖,该问题在 Python 3 中比在 Python 2 中更常见。

    此更改也向后移植到:0.7.11

    参考: #2807

  • [orm] [bug]

    修复了在 Column 上使用诸如 remote()foreign() 之类的注释,然后在与父 Table 关联之前,可能会由于注释执行的固有复制操作而产生与父表未在连接中呈现相关的问题。

    参考: #2813

  • [orm] [bug]

    修复了 Query.exists() 在没有任何 WHERE 条件的情况下无法正常工作的错误。 感谢 Vladimir Magamedov。

    参考: #2818

  • [orm] [bug]

    从 0.9 向后移植了一个更改,其中用于多态继承加载的映射器层次结构的迭代是排序的,这允许为多态查询生成的 SELECT 语句具有确定性的呈现,这反过来有助于在 SQL 字符串本身上缓存的缓存方案。

    参考: #2779

  • [orm] [bug]

    修复了 ORM 使用的有序序列实现中可能存在的问题,以迭代映射器层次结构; 在 Jython 解释器下,此实现不是有序的,即使 cPython 和 PyPy 保持了排序。

    参考: #2794

  • [orm] [bug]

    修复了 ORM 级别的事件注册中的错误,其中 “raw” 或 “propagate” 标志在某些 “未映射的基类” 配置中可能配置错误。

    参考: #2786

  • [orm] [bug]

    与加载映射实体时 defer() 选项的用法相关的性能修复。 在加载时将每个对象的延迟可调用函数应用于实例的函数开销,明显高于仅从行加载数据的开销(请注意,defer() 旨在减少数据库/网络开销,而不一定是函数调用计数); 现在,在所有情况下,函数调用开销都小于从列加载数据的开销。 每次加载创建的 “延迟可调用” 对象数量也从 N(结果中的延迟值总数)减少到 1(延迟列的总数)。

    参考: #2778

  • [orm] [bug]

    修复了当使用 make_transient() 函数将对象从 “persistent” 移动到 “pending” 时,属性历史记录函数会失败的错误,用于涉及基于集合的反向引用的操作。

    参考: #2773

orm declarative

  • [orm] [declarative] [feature]

    添加了一个方便的类装饰器 as_declarative(),它是 declarative_base() 的包装器,它允许使用漂亮的类装饰方法应用现有的基类。

examples

  • [examples] [feature]

    改进了 examples/generic_associations 中的示例,包括 discriminator_on_association.py 使用单表继承来使用 “discriminator” 完成工作。 还添加了一个真正的 “通用外键” 示例,它与其他流行的框架类似,因为它使用开放式整数来指向任何其他表,放弃了传统的引用完整性。 虽然我们不推荐这种模式,但信息希望是自由的。

  • [examples] [bug]

    在版本控制示例中创建的历史记录表中添加了 “autoincrement=False”,因为无论如何此表都不应具有自动递增功能,感谢 Patrick Schmid。

engine

  • [engine] [feature]

    EngineURLrepr() 现在将使用星号隐藏密码。 感谢 Gunnlaugur Þór Briem。

    参考: #2821

  • [engine] [bug]

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

    此更改也向后移植到:0.7.11

    参考: #2851

  • [engine] [bug] [oracle]

    如果由于断开连接错误而重新创建 Engine,则不会第二次调用 Dialect.initialize()。 这修复了 Oracle 8 方言中的一个特定问题,但通常 dialect.initialize() 阶段应该每个方言只执行一次。

    参考: #2776

  • [engine] [bug] [pool]

    修复了如果现有的池连接在失效或回收事件后无法重新连接,QueuePool 会丢失正确的检出计数的错误。

    参考: #2772

sql

  • [sql] [feature]

    insert() 构造添加了新方法 Insert.from_select()。 给定列列表和可选择对象,呈现 INSERT INTO (table) (columns) SELECT ..

    参考: #722

  • [sql] [feature]

    update()insert()delete() 构造现在会将 ORM 实体解释为要操作的目标表,例如:

    from sqlalchemy import insert, update, delete
    
    ins = insert(SomeMappedClass).values(x=5)
    
    del_ = delete(SomeMappedClass).where(SomeMappedClass.id == 5)
    
    upd = update(SomeMappedClass).where(SomeMappedClass.id == 5).values(name="ed")

  • [sql] [bug]

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

    此更改也向后移植到:0.7.11

    参考: #2801

  • [sql] [bug] [cte]

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

    此更改也向后移植到:0.7.11

    参考: #2783

  • [sql] [bug]

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

    此更改也向后移植到:0.7.11

    参考: #2784

  • [sql] [bug]

    修复了 type_coerce() 无法正确解释具有 __clause_element__() 方法的 ORM 元素的错误。

    参考: #2849

  • [sql] [bug]

    EnumBoolean 类型现在绕过使用中的任何自定义(例如 TypeDecorator)类型,以生成 “非原生” 类型的 CHECK 约束。 这样自定义类型就不会参与 CHECK 中的表达式,因为此表达式是针对 “impl” 值而不是 “decorated” 值。

    参考: #2842

  • [sql] [bug]

    如果 Column 未指定 unique(默认为 None),则 Index 上的 .unique 标志可以生成为 None。 该标志现在将始终为 TrueFalse

    参考: #2825

  • [sql] [bug]

    修复了默认编译器以及 postgresql、mysql 和 mssql 的编译器中的错误,以确保任何文字 SQL 表达式值在 CREATE INDEX 语句中直接呈现为文字,而不是作为绑定参数。 这也更改了其他 DDL(例如约束)的呈现方案。

    参考: #2742

  • [sql] [bug]

    一个 select() 在其 FROM 子句中引用自身(通常通过就地突变)的语句,将引发信息性错误消息,而不是导致递归溢出。

    参考: #2815

  • [sql] [bug]

    ForeignKey 上不起作用的 “schema” 参数已弃用; 引发警告。 在 0.9 中已删除。

    参考: #2831

  • [sql] [bug]

    修复了使用 column_reflect 事件更改传入的 Column.key 会阻止正确反射主键约束、索引和外键约束的错误。

    参考: #2811

  • [sql] [bug]

    当针对空集合使用时,0.8 中添加的 ColumnOperators.notin_() 运算符现在正确生成表达式 “IN” 返回的否定。

  • [sql] [bug] [postgresql]

    修复了表达式系统在引用 select() 构造上的 .c 集合时,依赖于某些表达式的 str() 形式的错误,但是 str() 形式不可用,因为该元素依赖于特定于方言的编译构造,特别是与 PostgreSQL ARRAY 元素一起使用的 __getitem__() 运算符。 此修复还添加了一个新的异常类 UnsupportedCompilationError,当编译器被要求编译它不知道如何编译的内容时,会引发该异常类。

    参考: #2780

postgresql

  • [postgresql] [bug]

    从列的服务器默认值的反射中删除了 128 个字符的截断; 此代码最初来自 PG 系统视图,该视图截断了字符串以提高可读性。

    参考: #2844

  • [postgresql] [bug]

    括号将应用于复合 SQL 表达式,如 CREATE INDEX 语句的列列表中呈现的那样。

    参考: #2742

  • [postgresql] [bug]

    修复了 PostgreSQL 版本字符串在 “PostgreSQL” 或 “EnterpriseDB” 词语之前带有前缀时无法解析的错误。 感谢 Scott Schaefer。

    参考: #2819

mysql

  • [mysql] [bug]

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

    此更改也向后移植到:0.7.11

    参考: #2791

  • [mysql] [bug]

    #2721 中的更改,即 ForeignKeyConstraintdeferrable 关键字在 MySQL 后端上被静默忽略,将在 0.9 中恢复; 此关键字现在将再次呈现,并在 MySQL 上引发错误,因为它不被理解 - 相同的行为也将应用于 initially 关键字。 在 0.8 中,关键字将保持忽略,但会发出警告。 此外,match 关键字现在在 0.9 上引发 CompileError,并在 0.8 上发出警告; 此关键字不仅被 MySQL 静默忽略,而且还破坏了 ON UPDATE/ON DELETE 选项。

    要使用在 MySQL 上不呈现或呈现方式不同的 ForeignKeyConstraint,请使用自定义编译选项。 文档中已添加此用法的示例,请参阅 MySQL / MariaDB 外键

    参考: #2721, #2839

  • [mysql] [bug]

    MySQL-connector 方言现在允许 create_engine 查询字符串中的选项覆盖 connect 中设置的那些默认值,包括 “buffered” 和 “raise_on_warnings”。

    参考: #2515

sqlite

  • [sqlite] [bug]

    新添加的 SQLite DATETIME 参数 storage_format 和 regexp 显然没有完全正确实现; 虽然参数被接受,但在实践中它们将不起作用; 这已得到修复。

    参考: #2781

oracle

  • [oracle] [bug]

    修复了当同义词和表位于不同的远程模式时,使用同义词进行 Oracle 表反射会失败的错误。感谢 Kyle Derr 提供补丁程序来修复此问题。

    参考链接:#2853

其他

  • [feature]

    Column 添加了一个新的标志 system=True,该标志将列标记为“系统”列,该列由数据库自动生成(例如 PostgreSQL oidxmin)。该列将从 CREATE TABLE 语句中省略,但仍可用于查询。此外,CreateColumn 构造可以应用于自定义编译规则,该规则允许跳过列,方法是生成一个返回 None 的规则。

0.8.2

发布日期:2013 年 7 月 3 日

ORM

  • [orm] [feature]

    添加了一个新的方法 Query.select_entity_from(),该方法将在 0.9 版本中替换 Query.select_from() 的部分功能。在 0.8 版本中,这两个方法执行相同的功能,以便可以将代码迁移为使用 Query.select_entity_from() 方法(如果适用)。有关详细信息,请参阅 0.9 迁移指南。

    参考链接:#2736

  • [orm] [bug]

    当尝试刷新继承类的对象时,如果多态鉴别器已分配给对该类无效的值,则会发出警告。

    参考链接:#2750

  • [orm] [bug]

    修复了多态 SQL 生成中的错误,其中针对同一基类的多个连接继承实体也相互连接时,如果连接字符串的长度超过两个实体,则不会彼此独立地跟踪基表上的列。

    参考链接:#2759

  • [orm] [bug]

    修复了将复合属性发送到 Query.order_by() 中会生成某些数据库不接受的带括号表达式的错误。

    参考链接:#2754

  • [orm] [bug]

    修复了复合属性和 aliased() 函数之间的交互。以前,当应用别名时,复合属性在比较操作中无法正常工作。

    参考链接:#2755

  • [orm] [bug] [ext]

    修复了当调用 clear() 时,MutableDict 不报告更改事件的错误。

    参考链接:#2730

  • [orm] [bug]

    修复了由 #2682 引起的回归错误,由此 Query.update()Query.delete() 调用的评估会遇到不支持的 TrueFalse 符号,这些符号现在由于使用了 IS 而出现。

    参考链接:#2737

  • [orm] [bug]

    修复了由此工单引起的 0.7 版本的回归错误,该错误导致自引用急切连接中的递归溢出检查过于宽松,从而遗漏了一种特殊情况,即子类配置了 lazy=”joined” 或 “subquery”,并且加载是针对基类的 “with_polymorphic”。

    参考链接:#2481

  • [orm] [bug]

    修复了 0.7 版本的回归错误,其中 Session.begin_nested() 的 contextmanager 功能在发生刷新错误时无法正确回滚事务,而是引发了自己的异常,同时使会话仍处于等待回滚状态。

    参考链接:#2718

ORM 声明式

  • [orm] [declarative] [feature]

    ORM 描述符(如混合属性)现在可以通过在 relationship() 中的 order_byprimaryjoin 或类似参数中使用的字符串参数按名称引用,除了绑定到列的属性之外。

    参考链接:#2761

示例

  • [examples] [bug]

    修复了“版本控制”配方中的一个问题,即当存在反向引用时,即使目标未更改,多对一引用也可能为目标生成无意义的版本。感谢 Matt Chisholm 提供补丁程序。

  • [examples] [bug]

    修复了 dogpile 示例中的一个小错误,其中 SQL 缓存键的生成没有以 Query 通常执行的方式将重复数据删除标签应用于语句。

引擎

  • [engine] [bug]

    修复了当重新生成池时,Pool 的各种实现中的 reset_on_return 参数未传播的错误。感谢 Eevee。

  • [engine] [bug] [sybase]

    修复了在某些情况下,例如使用 Sybase 方言时,检测发送到 create_engine() 的正确 kwargs 的例程会失败的错误。

    参考链接:#2732

SQL

  • [sql] [feature]

    TypeDecorator 提供了一个新的属性 TypeDecorator.coerce_to_is_types,以便更轻松地控制使用 ==!=None 和布尔类型进行比较时,如何生成 IS 表达式,或带有绑定参数的普通相等表达式。

    参考链接:#2734#2744

  • [sql] [bug]

    Select 构造的相关行为进行了多项修复,这些构造首次在 0.8.0 中引入

    • 为了满足 FROM 条目应向外关联到包含另一个 SELECT 的 SELECT(然后又包含此 SELECT)的用例,当通过 Select.correlate() 建立显式关联时,关联现在可以跨多个级别工作,前提是目标 select 位于由 WHERE/ORDER BY/columns 子句包含的链中的某个位置,而不仅仅是嵌套的 FROM 子句。这使得 Select.correlate() 的行为更兼容 0.7 版本,同时仍保持新的“智能”关联。

    • 当不使用显式关联时,通常的“隐式”关联将其行为限制为仅限直接封闭的 SELECT,以最大限度地提高与 0.7 应用程序的兼容性,并且在这种情况下也防止跨嵌套 FROM 的关联,从而保持与 0.8.0/0.8.1 的兼容性。

    • Select.correlate_except() 方法并非在所有情况下都阻止给定的 FROM 子句进行关联,并且还会导致 FROM 子句被错误地完全省略(更像 0.7 版本的做法),此问题已修复。

    • 调用 select.correlate_except(None) 将使所有 FROM 子句都按预期进入关联。

    参考链接:#2668#2746

  • [sql] [bug]

    修复了将表 “A” 的 select() 与到表 “B” 的多个外键路径连接到表 “B” 时,不会产生如果您直接将表 “A” 连接到 “B” 时会报告的 “ambiguous join condition” 错误,而是产生具有多个条件的连接条件的错误。

    参考链接:#2738

  • [sql] [bug] [reflection]

    修复了在远程模式和本地模式上使用 MetaData.reflect() 时,如果两个模式都具有同名的表,则可能产生错误结果的错误。

    参考链接:#2728

  • [sql] [bug]

    从基类 ColumnOperators 类中删除了 “未实现” 的 __iter__() 调用,虽然这是在 0.8.0 中引入的,目的是为了防止当用户在自定义运算符上实现 __getitem__() 方法,然后错误地在该对象上调用 list() 时,出现无限的、内存增长的循环,但这会使列元素报告它们实际上是可迭代类型,然后在尝试迭代时引发错误。这里没有真正两全其美的方法,因此我们坚持 Python 的最佳实践。在自定义运算符上实现 __getitem__() 时要小心!

    参考链接:#2726

  • [sql] [bug] [mssql]

    此工单的回归错误导致呈现不支持的关键字 “true”,添加了逻辑以将其转换为 SQL Server 的 1/0。

    参考链接:#2682

PostgreSQL

  • [postgresql] [feature]

    增加了对 PostgreSQL 9.2 范围类型的支持。目前,未提供类型转换,因此目前直接使用字符串或 psycopg2 2.5 范围扩展类型。感谢 Chris Withers 提供补丁程序。

  • [postgresql] [feature]

    在使用 psycopg2 DBAPI 时,增加了对 “AUTOCOMMIT” 隔离级别的支持。关键字可以通过 isolation_level 执行选项使用。感谢 Roman Podolyaka 提供补丁程序。

    参考链接:#2072

  • [postgresql] [bug]

    简化了 PostgreSQL 方言上 extract() 的行为,不再将硬编码的 ::timestamp 或类似的强制转换注入到给定的表达式中,因为这会干扰时区感知日期时间等类型,而且对于现代版本的 psycopg2 而言,这似乎完全没有必要。

    参考链接:#2740

  • [postgresql] [bug]

    修复了 HSTORE 类型中的错误,其中在使用“非原生”(即非 psycopg2)方式翻译 HSTORE 数据时,包含反斜杠引号的键/值不会被正确转义。感谢 Ryan Kelly 提供补丁程序。

    参考链接:#2766

  • [postgresql] [bug]

    修复了多列 PostgreSQL 索引中的列顺序会以错误顺序反射的错误。感谢 Roman Podolyaka。

    参考链接:#2767

  • [postgresql] [bug]

    修复了 HSTORE 类型以正确编码/解码 Unicode。这始终处于启用状态,因为 hstore 是一种文本类型,并且在使用 Python 3 时与 psycopg2 的行为相匹配。感谢 Dmitry Mugtasimov。

    参考链接:#2735

MySQL

  • [mysql] [feature]

    Index 一起使用的 mysql_length 参数现在可以作为列名称/长度的字典传递,用于复合索引。非常感谢 Roman Podolyaka 提供的补丁程序。

    参考链接:#2704

  • [mysql] [bug]

    修复了在使用多表 UPDATE 时,当补充表是一个带有自身绑定参数的 SELECT 时,绑定参数的位置在使用 MySQL 的特殊语法时会与语句本身相反的错误。

    参考链接:#2768

  • [mysql] [bug]

    mysql+gaerdbms 方言添加了另一个条件,以检测所谓的 “开发” 模式,在这种模式下,我们应该使用 rdbms_mysqldb DBAPI。感谢 Brett Slatkin 提供补丁程序。

    参考链接:#2715

  • [mysql] [bug]

    ForeignKeyForeignKeyConstraint 上的 deferrable 关键字参数不会在 MySQL 方言上呈现 DEFERRABLE 关键字。长期以来,我们一直保留此功能,因为不可延迟的外键与可延迟的外键的行为非常不同,但是某些环境只是在 MySQL 上禁用了 FK,因此我们将在此处减少主观性。

    参考链接:#2721

  • [mysql] [bug]

    更新了 mysqlconnector 方言,以根据异常中发送的明显字符串消息检查断开连接;已针对 mysqlconnector 1.0.9 进行测试。

SQLite

  • [sqlite] [bug]

    sqlalchemy.types.BIGINT 添加到 SQLite 方言可以反射的类型名称列表中;感谢 Russell Stuart。

    参考链接:#2764

MSSQL

  • [mssql] [bug]

    在查询 SQL Server 2000 上的信息架构时,删除了 0.8.1 中添加的 CAST 调用,以帮助解决驱动程序问题,但显然在 2000 上不兼容。CAST 保留在 SQL Server 2005 及更高版本中。

    参考链接:#2747

其他

  • [feature] [firebird]

    为 kinterbasdb 和 fdb 方言添加了新的标志 retaining=True。这控制发送到 DBAPI 连接的 commit()rollback() 方法的 retaining 标志的值。由于历史原因,此标志在 0.8.2 中默认为 True,但在 0.9.0b1 中,此标志默认为 False

    参考链接:#2763

  • [bug] [firebird]

    修复了反射 Firebird 类型 LONG 和 INT64 时的类型查找,以便将 LONG 视为 INTEGER,INT64 视为 BIGINT,除非该类型具有 “precision”,在这种情况下,它被视为 NUMERIC。感谢 Russell Stuart 提供补丁程序。

    参考链接:#2757

  • [bug] [ext]

    修复了如果复合类型是使用函数而不是类设置的,则当可变扩展尝试检查该列是否为 MutableComposite(但事实并非如此)时,会出错的错误。感谢 asldevi。

  • [requirements]

    现在需要 Python mock 库才能运行单元测试套件。虽然从 Python 3.3 开始成为标准库的一部分,但以前的 Python 安装需要安装此库才能运行单元测试或使用外部方言的 sqlalchemy.testing 包。

0.8.1

发布日期:2013 年 4 月 27 日

ORM

  • [orm] [feature]

    为 Query 添加了一个便捷方法,该方法将查询转换为 EXISTS (SELECT 1 FROM ... WHERE ...) 形式的 EXISTS 子查询。

    参考链接:#2673

  • [orm] [bug]

    修复了表单查询:query(SubClass).options(subqueryload(Baseclass.attrname)) 中的错误,其中 SubClassBaseClass 的连接继承,无法在属性加载的子查询内应用 JOIN,从而产生笛卡尔积。填充结果仍然倾向于正确,因为额外的行只是被忽略了,因此此问题可能作为性能下降存在于其他工作正常的应用程序中。

    此更改也向后移植到:0.7.11

    参考链接:#2699

  • [orm] [bug]

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

    此更改也向后移植到:0.7.11

    参考链接:#2689

  • [orm] [bug]

    修复了 sqlalchemy.ext.serializer 扩展,包括从 pickler 传递的 “id” 被转换为字符串以防止在 Py3K 上解析字节,以及 relationship()orm.join() 构造现在已正确序列化。

    参考链接:#2698

  • [orm] [bug]

    对 query.join() 的内部工作原理进行了重大改进,从而大大简化了关于如何连接的决策过程。新的测试用例现在可以通过,例如从已经复杂的涉及继承等的连接系列中间扩展的多个连接。从深度嵌套的子查询结构进行连接仍然很复杂,并且并非没有注意事项,但是通过这些改进,边缘情况有望进一步推向边缘。

    参考链接:#2714

  • [orm] [bug]

    为 ORM 映射对象的解封过程添加了一个条件,这样,如果在封存对象时对象引用丢失,我们就不会错误地尝试设置 _sa_instance_state - 修复了 NoneType 错误。

  • [orm] [bug]

    修复了 uselist=False 的多对多关系在标量属性设置为 None 时,将无法删除关联行并引发错误的错误。这是由 #2229 的更改引入的回归错误。

    参考链接:#2710

  • [orm] [bug]

    改进了关于在 Session 中创建强引用的实例管理行为;如果对象处于瞬态或移动到分离状态,则对象将不再创建内部引用循环 - 强引用仅在对象附加到 Session 时创建,并在对象分离时删除。这使得具有 __del__() 方法的对象在某种程度上更安全,即使不建议这样做,因为与反向引用的关系也会产生循环。当映射具有 __del__() 方法的类时,会添加警告。

    参考链接:#2708

  • [orm] [bug]

    修复了当刷新继承映射类(其中超类映射到非 Table 对象,如自定义 join() 或 select())时,ORM 会运行错误类型的查询的错误,运行的查询假定映射到每个类的单独 Table 的层次结构。

    参考链接:#2697

  • [orm] [bug]

    修复了 mapper 属性构造上的 __repr__(),使其在对象初始化之前工作,以便使用最近 Sphinx 版本的 Sphinx 构建可以读取它们。

orm 声明式

  • [orm] [声明式] [bug]

    修复了关于 has_inherited_table() 的间接回归,因为该函数会考虑当前类的 __table__,所以对它的调用时机很敏感。 这也是 0.7 的行为,但在 0.7 中,事情往往会在诸如 __mapper_args__() 之类的事件中“解决”。has_inherited_table() 现在仅考虑超类,因此无论何时调用(显然假设超类的状态),都应返回关于当前类的相同答案。

    参考:#2656

示例

  • [示例] [bug]

    修复了缓存示例中一个长期存在的 bug,即在计算缓存键时,limit/offset 参数值不会被考虑在内。 _key_from_query() 函数已被简化为直接从最终编译的语句中工作,以便获取完整的语句以及完全处理的参数列表。

sql

  • [sql] [feature]

    放宽了对传递给 Table() 的方言特定参数名称的检查;由于我们希望支持外部方言,并且还希望在没有安装特定方言的情况下支持参数,因此现在仅检查参数的格式,而不是在 sqlalchemy.dialects 中查找该方言。

  • [sql] [bug] [mysql]

    完全实现了关于 True/False 常量的 IS 和 IS NOT 运算符。 像 col.is_(True) 这样的表达式现在将在目标平台上呈现 col IS true,而不是将 True/False 常量转换为整数绑定参数。 这允许 is_() 运算符在给定 True/False 常量时在 MySQL 上工作。

    参考链接:#2682

  • [sql] [bug]

    对当使用 apply_labels() 时 select() 对象生成带标签列的方式进行了重大修复;此模式生成一个 SELECT,其中每列都标记为 <tablename>_<columnname>,以消除多表选择的列名冲突。 修复方案是,如果两个标签在与表名组合时发生冲突,例如 “foo.bar_id” 和 “foo_bar.id”,则将对其中一个重复项应用匿名别名。 这允许 ORM 独立处理这两列; 以前,0.7 在某些情况下会静默地为 “重复” 的列发出第二个 SELECT,而在 0.8 中会发出歧义列错误。 应用于 select() 的 .c. 集合的 “keys” 也将被去重,以便对于任何指定 use_labels 的 select(),将不再发出 “正在替换列” 警告,尽管重复的键将被赋予一个通常对用户不友好的匿名标签。

    参考:#2702

  • [sql] [bug]

    修复了当错误在 Connection 对象已关闭后引发时,错误时断开连接检测会引发属性错误的 bug。

    参考:#2691

  • [sql] [bug]

    重做了在重新引发之前发出 rollback() 的内部异常引发,以便在进入 rollback 之前从 sys.exc_info() 中保留堆栈跟踪。 这样,在使用可能在 rollback 函数返回之前切换了上下文的协程框架时,可以保留回溯。

    参考:#2703

  • [sql] [bug] [postgresql]

    _Binary 基类型现在在 Python 3 上运行时通过 bytes() 可调用对象转换值; 特别是,带有 Python 3.3 的 psycopg2 2.5 似乎现在返回 “memoryview” 类型,因此在返回之前将其转换为 bytes。

  • [sql] [bug]

    改进了 Connection 自动失效处理。 如果发生非断开连接错误,但在错误处理中导致延迟的断开连接错误(在 MySQL 中发生),则会检测到断开连接条件。 Connection 现在也可以在无效状态下关闭,这意味着它将在下次使用时引发 “closed”,此外,即使错误处理例程中的 autorollback 失败,并且无论条件是否为断开连接, “close with result” 功能也都可以工作。

    参考:#2695

  • [sql] [bug]

    修复了 DBAPI 可以为 cursor.lastrowid 返回 “0” 的 bug,该 bug 会导致与 ResultProxy.inserted_primary_key 结合使用时无法正常工作。

postgresql

  • [postgresql] [bug]

    开放了对 psycopg2/libpq 的 “断开连接” 的检查,以检查整个异常层次结构中的各种 “断开连接” 消息。 特别是, “closed the connection unexpectedly” 消息现在已经在至少三种不同的异常类型中看到。 由 Eli Collins 友情提供。

    参考:#2712

  • [postgresql] [bug]

    PostgreSQL ARRAY 类型的运算符支持集合、生成器等的输入类型,即使未指定维度,也会通过无条件地将给定的可迭代对象转换为集合来实现。

    参考:#2681

  • [postgresql] [bug]

    将缺少的 HSTORE 类型添加到 postgresql 类型名称中,以便可以反射该类型。

    参考:#2680

mysql

  • [mysql] [bug]

    修复了对最新 cymysql DBAPI 的支持,由 Hajime Nakagami 友情提供。

  • [mysql] [bug]

    改进了 pymysql 方言在 Python 3 上的操作,包括一些重要的解码/字节步骤。 由于驱动程序问题,BLOB 类型仍然存在问题。 由 Ben Trofatter 友情提供。

    参考:#2663

  • [mysql] [bug]

    更新了一个正则表达式,以正确提取 google app engine v1.7.5 及更高版本上的错误代码。 由 Dan Ring 友情提供。

mssql

  • [mssql] [bug]

    作为 pyodbc+ mssql 所需的更长系列修复的一部分,已将 CAST 添加到所有信息模式查询中表名和模式名称的绑定参数的 NVARCHAR(max),以避免将 NVARCHAR 与 NTEXT 进行比较的问题,在某些情况下,ODBC 驱动程序似乎拒绝了这种比较,例如 FreeTDS (仅限 0.91?) 加上传递的 unicode 绑定参数。 该问题似乎特定于 SQL Server 信息模式表,并且对于那些首先不存在问题的情况,解决方法是无害的。

    参考:#2355

  • [mssql] [bug]

    为 pymssql 方言添加了对其他 “断开连接” 消息的支持。 由 John Anderson 友情提供。

  • [mssql] [bug]

    修复了关于 “binary” 类型和 pymssql 的 Py3K bug。 由 Marc Abramowitz 友情提供。

    参考:#2683

0.8.0

发布日期:2013 年 3 月 9 日

注意

自 0.8.0 起,存在一些 0.8.0b2 中不存在的新行为更改。 它们在迁移文档中如下所示

orm

  • [orm] [feature]

    添加了一个有意义的 QueryableAttribute.info 属性,该属性代理到 Column 对象(如果直接存在)或 MapperProperty (否则)上的 .info 属性。 完整的行为已记录在案,并通过测试确保保持稳定。

    参考:#2675

  • [orm] [feature]

    可以在 relationship() 构造函数构造后设置/更改其 “cascade” 属性。 这不是正常使用的模式,但我们喜欢在教程中更改设置以进行演示。

  • [orm] [feature]

    添加了新的辅助函数 was_deleted(),如果给定对象是 Session.delete() 操作的主题,则返回 True。

    参考:#2658

  • [orm] [feature]

    扩展了 运行时检查 API 系统,以便可以检索与 ORM 或其扩展关联的所有 Python 描述符。 这满足了能够检查所有 QueryableAttribute 描述符以及诸如 hybrid_propertyAssociationProxy 之类的扩展类型的常见请求。 请参阅 Mapper.all_orm_descriptors

  • [orm] [bug]

    改进了在映射器配置期间对现有 backref 名称冲突的检查; 现在将测试超类和子类以及当前映射器上的名称冲突,因为这些冲突同样会破坏事情。 这是 0.8 的新功能,但请参阅下文,了解 0.7.11 中也将触发的警告。

    参考:#2674

  • [orm] [bug]

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

    参考:#2674

  • [orm] [bug]

    当 MapperProperty 被分配给替换现有属性的映射器时,如果所讨论的属性不是普通的基于列的属性,则会发出警告。 关系属性的替换很少(甚至从不?)是预期的,通常指的是映射器配置错误。 也在 0.7.11 中。

    参考:#2674

  • [orm] [bug]

    如果事件处理程序尝试在 after_commit() 处理程序中在 Session 上发出 SQL,而在该处理程序中没有可行的事务正在进行,则会发出清晰的错误消息。

    参考:#2662

  • [orm] [bug]

    即使密钥是复合的,并且只有部分属性已更改,自然主键更新的级联过程中的主键更改检测也将成功。

    参考:#2665

  • [orm] [bug]

    从会话中删除的对象将在事务提交后完全与该会话取消关联,即 object_session() 函数将返回 None。

    参考:#2658

  • [orm] [bug]

    修复了 Query.yield_per() 会错误地设置执行选项的 bug,从而破坏了 Query.execution_options() 方法的后续使用。 由 Ryan Kelly 友情提供。

    参考:#2661

  • [orm] [bug]

    修复了 between() 运算符的考虑,使其可以与新的关系 local/remote 系统正确配合使用。

    参考:#1768

  • [orm] [bug]

    已修改将待定对象视为 “孤立” 对象的情况,使其更紧密地匹配持久对象的行为,即一旦对象与其任何启用孤立的父对象取消关联,该对象就会从 Session 中删除。 以前,仅当待定对象与所有启用孤立的父对象取消关联时,才会被删除。 新标志 legacy_is_orphan 已添加到 Mapper 中,该标志重新建立了旧的行为。

    有关此更改的详细讨论,请参阅 将 “待定” 对象视为 “孤立” 对象的情况变得更严格 中的更改说明和示例案例。

    参考:#2655

  • [orm] [bug]

    修复了(很可能从未使用过的)“@collection.link” 集合方法,该方法在每次集合与映射对象关联或取消关联时触发 - 该装饰器未经测试或无法正常工作。 装饰器方法现在被命名为 collection.linker(),尽管为了向后兼容性,名称 “link” 仍然保留。 由 Luca Wehrstedt 友情提供。

    参考:#2653

  • [orm] [bug]

    对生成自定义检测集合的系统进行了一些修复,主要是 @collection 装饰器的使用现在将遵守给定类的 __mro__,应用子类最版本特定的集合方法的逻辑。 以前,在子类化现有的检测类(例如 MappedCollection)时,自定义方法是否会正确解析是不可预测的。

    参考:#2654

  • [orm] [bug]

    修复了如果创建任意数量的 sessionmaker 对象可能发生的潜在内存泄漏。 当取消引用时,sessionmaker 创建的匿名子类将不会被垃圾回收,因为事件包中仍然存在类级别的引用。 此问题也适用于任何使用临时子类结合事件调度程序的自定义系统。 也在 0.7.10 中。

    参考:#2650

  • [orm] [bug]

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

    参考:#2640

  • [orm] [bug]

    修复了 relationship() 上的 “dynamic” 加载器,包括即使禁用 autoflush 时,backref 也能正常工作,在同一对象多次添加/删除的情况下,历史事件也更准确。

    参考:#2637

  • [orm] [removed]

    移除了使用与集合关联的 __instrumentation__ 数据结构生成自定义集合的未记录(并且希望未使用)的系统,因为这是一个复杂且未经测试的功能,并且与装饰器方法相比,它也基本上是冗余的。 也对 orm.collections 模块进行了其他内部简化。

示例

  • [示例] [bug]

    修复了 examples/dogpile_caching 示例中的回归,该回归是由于 #2614 中的更改引起的。

sql

  • [sql] [feature]

    Enum 及其基本 SchemaType inherit_schema 添加了一个新参数。 当设置为 True 时,该类型将设置其 schema 属性,该属性是其关联的 Table 的模式属性。 这也会在 Table.tometadata() 操作期间发生; 现在在 Table.tometadata() 发生时,在所有情况下都会复制 SchemaType ,如果 inherit_schema=True,则该类型将采用传递给该方法的新模式名称。 当与 PostgreSQL 后端一起使用时, schema 很重要,因为该类型会导致 CREATE TYPE 语句。

    参考:#2657

  • [sql] [feature]

    Index 现在除了直接列之外,还支持任意 SQL 表达式和/或函数。 常见的修饰符包括使用 somecolumn.desc() 表示降序索引,使用 func.lower(somecolumn) 表示不区分大小写的索引,具体取决于目标后端的性能。

    参考:#695

  • [sql] [bug]

    改进了 SELECT 关联的行为,使得 Select.correlate()Select.correlate_except() 方法及其 ORM 类似物仍将保留 “自动关联” 行为,因为仅当输出将是合法的 SQL 时才修改 FROM 子句; 也就是说,如果关联的 SELECT 未在封闭 SELECT 的 WHERE、columns 或 HAVING 子句的上下文中使用,则 FROM 子句将保持不变。 这两个方法现在仅指定默认 “自动关联” 的条件,而不是绝对 FROM 列表。

    参考:#2668

  • [sql] [bug]

    修复了关于列注释的 bug,该 bug 特别会影响新的 remote()local() 注释函数的某些用法,其中当列在后续表达式中使用时,注释可能会丢失。

    参考:#1768, #2660

  • [sql] [bug]

    ColumnOperators.in_() 运算符现在会将 None 值强制转换为 null()

    参考:#2496

  • [sql] [bug]

    修复了如果 Column 同时具有外键和列的备用 “.key” 名称,则 Table.tometadata() 会失败的 bug。 也在 0.7.10 中。

    参考:#2643

  • [sql] [bug]

    如果尝试在不支持 RETURNING 的方言上编译,insert().returning() 会引发信息丰富的 CompileError。

    参考:#2629

  • [sql] [bug]

    调整了编译器用于标识需要传递的 INSERT/UPDATE 绑定参数的 “REQUIRED” 符号,以便在编写自定义绑定处理代码时更容易识别。

    参考:#2648

schema

postgresql

  • [postgresql] [feature]

    添加了对 PostgreSQL 的传统 SUBSTRING 函数语法的支持,当使用常规 func.substring() 时,呈现为 “SUBSTRING(x FROM y FOR z)”。 由 Gunnlaugur Þór Briem 友情提供。

    此更改也向后移植到:0.7.11

    参考:#2676

  • [postgresql] [feature]

    添加了 Comparator.any()Comparator.all() 方法,以及独立的表达式构造。 非常感谢 Audrius Kažukauskas 在此方面的出色工作。

  • [postgresql] [bug]

    修复了 array() 构造函数中的 bug,该 bug 会导致在 insert() 构造函数内部使用它时,会在 self_group() 方法中产生关于参数问题的错误。

mysql

  • [mysql] [feature]

    添加了 CyMySQL 的新方言,由 Hajime Nakagami 友情提供。

  • [mysql] [feature]

    GAE 方言现在接受 URL 中的用户名/密码参数,由 Owen Nelson 友情提供。

  • [mysql] [bug] [gae]

    gaerdbms 方言添加了条件导入,该导入尝试导入 rdbms_apiproxy 与 rdbms_googleapi,以便在开发和生产平台上都能工作。 现在也遵守 instance 属性。 由 Sean Lynch 友情提供。 也在 0.7.10 中。

    参考:#2649

  • [mysql] [bug]

    如果无法从异常抛出中提取错误代码,GAE 方言将不会在 None 匹配时失败; 由 Owen Nelson 友情提供。

mssql

  • [mssql] [feature]

    Index 添加了 mssql_includemssql_clustered 选项,分别渲染 INCLUDECLUSTERED 关键字。感谢 Derek Harland。

  • [mssql] [feature]

    现在非主键列上的 IDENTITY 列也支持 DDL,通过在任何整数列上建立 Sequence 构造来实现。感谢 Derek Harland。

    参考文献: #2644

  • [mssql] [bug]

    在 mssql 信息模式中,为不必要的 .decode() 调用添加了 py3K 条件判断,修复了 Py3K 中的反射问题。也在 0.7.10 版本中修复。

    参考文献: #2638

  • [mssql] [bug]

    修复了回归问题,即字符类型 CHAR、NCHAR 等的 “collation” 参数停止工作,因为基本字符串类型现在支持 “collation”。MSSQL 方言中的 TEXT、NCHAR、CHAR、VARCHAR 类型现在是基本类型的同义词。

oracle

  • [oracle] [bug]

    cx_oracle 方言将不再通过 encode() 运行绑定参数名称,因为这在 Python 3 上无效,并阻止了语句在 Python 3 上正常运行。现在,我们仅在 supports_unicode_binds 为 False 时才进行编码,而当使用 cx_oracle 至少版本 5 时,cx_oracle 的情况并非如此。

tests

  • [tests] [bug]

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

    参考文献: #2669

0.8.0b2

发布日期:2012 年 12 月 14 日

orm

  • [orm] [feature]

    KeyedTuple 类添加了 KeyedTuple._asdict()KeyedTuple._fields,以提供与 Python 标准库 collections.namedtuple() 的一定程度的兼容性。

    参考文献: #2601

  • [orm] [feature]

    允许在为关系定义主连接和辅助连接时使用同义词。

  • [orm] [bug]

    现在,Query.select_from() 方法可以与 aliased() 构造一起使用,而不会干扰正在选择的实体。基本上,像这样的语句

    ua = aliased(User)
    session.query(User.name).select_from(ua).join(User, User.name > ua.name)

    将保持 SELECT 的 columns 子句来自未别名的 “user”,如指定的那样;select_from 仅发生在 FROM 子句中

    SELECT users.name AS users_name FROM users AS users_1
    JOIN users ON users.name < users_1.name

    请注意,此行为与 Query.select_from() 的原始、较旧的用例相反,后者是以不同的 selectable 重新声明映射实体

    session.query(User.name).select_from(user_table.select().where(user_table.c.id > 5))

    这将产生

    SELECT anon_1.name AS anon_1_name FROM (SELECT users.id AS id,
    users.name AS name FROM users WHERE users.id > :id_1) AS anon_1

    正是后一种用例的 “别名” 行为妨碍了前一种用例。该方法现在明确地将 SQL 表达式(如 select()alias())与映射实体(如 aliased() 构造)分开考虑。

    参考文献: #2635

  • [orm] [bug]

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

    参考文献: #2624

  • [orm] [bug]

    别名/内部路径机制的第二次全面修改现在允许两个子类具有相同名称的不同关系,当使用完全多态加载时,同时支持在两者上进行子查询或连接的预先加载。

    参考文献: #2614

  • [orm] [bug]

    修复了在特定的 with_polymorphic 加载中,多跳子查询加载会产生 KeyError 的错误。利用了与 #2614 相同的内部路径全面修改。

    参考文献: #2617

  • [orm] [bug]

    修复了回归问题,即如果与 “fetch” 同步策略匹配的对象在本地不存在,query.update() 将产生错误。感谢 Scott Torborg。

    参考文献: #2602

orm extensions

engine

  • [engine] [feature]

    现在,Connection.connect()Connection.contextual_connect() 方法返回 “branched” 版本,以便可以在返回的连接上调用 Connection.close() 方法,而不会影响原始连接。当将 EngineConnection 对象用作上下文管理器时,允许对称性

    with conn.connect() as c:  # leaves the Connection open
        c.execute("...")
    
    with engine.connect() as c:  # closes the Connection
        c.execute("...")

  • [engine] [bug]

    修复了 MetaData.reflect(),以便在给定 Connection 的情况下,正确使用该连接,而无需从该连接的 Engine 打开第二个连接。

    此更改也向后移植到:0.7.10

    参考文献: #2604

  • [engine]

    已弃用 MetaData 的 “reflect=True” 参数。请使用 MetaData.reflect() 方法。

sql

  • [sql] [feature]

    Insert 构造现在支持多值插入,即,INSERT 呈现为 “INSERT INTO table VALUES (…), (…), …”。PostgreSQL、SQLite 和 MySQL 支持此功能。非常感谢 Idan Kamara 在这方面所做的努力。

    参考文献: #2623

  • [sql] [bug]

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

    此更改也向后移植到:0.7.10

    参考文献: #2631

  • [sql] [bug]

    修复了由 #2410 引起的回归问题,即 CheckConstraint 会在 Table.tometadata() 操作期间将其自身应用回原始表,因为它会解析父表的 SQL 表达式。现在,该操作会复制给定的表达式以对应于新表。

    参考文献: #2633

  • [sql] [bug]

    修复了在方言上使用小于实际列标识符大小的 label_length 会导致无法在 SELECT 语句中正确渲染列的错误。

    参考文献: #2610

  • [sql] [bug]

    现在,DECIMAL 类型在渲染 DDL 时会遵循 “precision” 和 “scale” 参数。

    参考文献: #2618

  • [sql] [bug]

    对二进制表达式(即 x1 == x2)的 “boolean”(即 __nonzero__)求值进行了调整,使得 BinaryExpression 在某些情况下应用的 “自动分组” 不会妨碍此比较。 以前,像这样的表达式

    expr1 = mycolumn > 2
    bool(expr1 == expr1)

    即使这是一个恒等比较,也会求值为 False,因为 mycolumn > 2 将在放入 BinaryExpression 之前被 “分组”,从而改变其恒等性。BinaryExpression 现在跟踪传入的 “原始” 对象。此外,__nonzero__ 方法现在仅在运算符为 ==!= 时返回 - 所有其他运算符都会引发 TypeError

    参考文献: #2621

  • [sql] [bug]

    修复了一个陷阱,即如果实现了 ColumnOperators.__getitem__(),则在 ColumnElement 上意外调用 list() 会进入无限循环。现在通过 __iter__() 发出新的 NotImplementedError。

  • [sql] [bug]

    修复了 type_coerce() 中的错误,如果语句用作另一个语句内的子查询,以及其他类似情况,则可能会丢失类型信息。 除此之外,还会导致当 Oracle/mssql 方言应用 limit/offset 包装时,类型信息丢失。

    参考文献: #2603

  • [sql] [bug]

    修复了在针对 selectable 生成列的 “代理” 时,Column 的 “.key” 未被使用的错误。这可能不会发生在 0.7 中,因为 0.7 在更广泛的场景中不尊重 “.key”。

    参考文献: #2597

postgresql

  • [postgresql] [feature]

    PostgreSQL 方言中现在可以使用 HSTORE。如果可用,还将使用 psycopg2 的扩展。感谢 Audrius Kažukauskas。

    参考文献: #2606

sqlite

  • [sqlite] [bug]

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

    此更改也向后移植到:0.7.10

    参考文献: #2568

mssql

  • [mssql] [feature]

    添加了对主键约束的 “name” 反射的支持,感谢 Dave Moore。

    参考文献: #2600

  • [mssql] [bug]

    修复了将 “key” 与 Column 结合使用,以及将 “schema” 与拥有 Table 结合使用,由于 MSSQL 方言的 “schema 渲染” 逻辑未能考虑 .key,因此无法定位结果行的错误。

    此更改也向后移植到:0.7.10

oracle

  • [oracle] [bug]

    修复了在访问引用 DBLINK 远程数据库的同义词时,Oracle 的表反射问题;虽然该语法已在 Oracle 方言中存在一段时间,但到目前为止尚未经过测试。该语法已针对链接到自身的示例数据库进行了测试,但是,在查询远程数据库以获取表信息时,应该使用什么 “所有者” 仍然存在一些不确定性。目前,使用 user_db_links 中的 “username” 值来匹配 “所有者”。

    参考文献: #2619

  • [oracle] [bug]

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

    参考文献: #2620

  • [oracle] [bug]

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

    参考文献: #2611

misc

  • [feature] [sybase]

    已将反射支持添加到 Sybase 方言。非常感谢 Ben Trofatter 在开发和测试此功能方面所做的所有工作。

    参考文献: #1753

  • [feature] [pool]

    现在,Pool 将同等地记录所有 connection.close() 操作,包括无效连接、分离连接和超出池容量的连接发生的关闭。

  • [feature] [pool]

    现在,Pool 咨询 Dialect,以了解有关连接应如何 “自动回滚” 以及关闭的功能。这为方言提供了对事务范围的更多控制,因此我们将能够更好地实现事务性解决方法,例如 pysqlite 和 cx_oracle 可能需要的解决方法。

    参考文献: #2611

  • [feature] [pool]

    添加了新的 PoolEvents.reset() 钩子,用于捕获连接在返回到池时自动回滚之前的事件。与 ConnectionEvents.rollback() 一起,这允许拦截所有回滚事件。

  • [bug] [firebird]

    为实验性的 “firebird+fdb” 方言添加了缺少的 “fdb” 导入。

    参考文献: #2622

  • [informix]

    已删除一些关于 informix 事务处理的无用代码,包括一个会跳过调用 commit()/rollback() 的功能,以及关于 begin() 的一些硬编码隔离级别假设。由于我们没有任何用户使用此方言,也没有任何访问 Informix 数据库的权限,因此我们不太了解此方言的状态。如果任何可以访问 Informix 的人想帮助测试此方言,请告知我们。

0.8.0b1

发布日期:2012 年 10 月 30 日

general

  • [general] [removed]

    完全删除了 “sqlalchemy.exceptions” 同义词,以替换为 “sqlalchemy.exc”。

    参考文献: #2433

  • [general]

    SQLAlchemy 0.8 现在面向 Python 2.5 及更高版本。不再支持 Python 2.4。

orm

  • [orm] [feature]

    relationship() 内部机制的重大重写现在允许连接条件,其中包括指向复合外键中自身的列。添加了用于非常特殊 primaryjoin 条件的新 API,允许在必要时通过将注释函数 remote() 和 foreign() 内联放置在表达式中来处理基于 SQL 函数、CAST 等的条件。以前使用半私有 _local_remote_pairs 方法的配方可以升级到这种新方法。

    参考文献: #1401

  • [orm] [feature]

    新的独立函数 with_polymorphic() 以独立形式提供了 query.with_polymorphic() 的功能。它可以应用于查询中的任何实体,包括作为连接的目标以代替 “of_type()” 修饰符。

    参考文献: #2333

  • [orm] [feature]

    属性上的 of_type() 构造现在接受 aliased() 类构造以及 with_polymorphic 构造,并且与 query.join()、any()、has() 以及预先加载器 subqueryload()、joinedload()、contains_eager() 一起使用

    参考文献: #1106, #2438

  • [orm] [feature]

    映射类的事件侦听改进允许为实例事件和映射器事件指定未映射的类。当传递 propagate=True 标志时,已建立的事件将自动在子类上设置,并且如果最终映射该类,则将为该类本身设置事件。

    参考文献: #2585

  • [orm] [feature]

    “延迟声明式反射” 系统已移至声明式扩展本身,使用新的 DeferredReflection 类。此类现在已针对单表和连接表继承用例进行了测试。

    参考文献: #2485

  • [orm] [feature]

    添加了新的核心函数 “inspect()”,它充当 mapper、对象和其他对象的内省的通用网关。Mapper 和 InstanceState 对象已通过公共 API 增强,该 API 允许检查映射的属性,包括用于列绑定或关系绑定的属性的过滤器,检查当前对象状态、属性历史记录等。

    参考文献: #2208

  • [orm] [feature]

    在 session.begin_nested() 中调用 rollback() 现在将仅使在该事务范围内具有净更改的对象过期,即在 flush 时已脏或已修改的对象。这允许 begin_nested() 的典型用例,即更改对象的小子集,将来自未在该子事务中修改的较大部分对象集的数据保留在原位。

    参考文献: #2452

  • [orm] [功能]

    添加了实用功能 Session.enable_relationship_loading(),取代 relationship.load_on_pending。然而,应避免使用这两个功能。

    参考文献: #2372

  • [orm] [功能]

    为 column_property()、relationship()、composite() 添加了对 .info 字典参数的支持。所有 MapperProperty 类都具有可用的自动创建的 .info 字典。

  • [orm] [功能]

    从映射集合中添加/删除 None 现在会生成属性事件。 以前,在某些情况下会忽略 None 追加。 与以下内容相关。

    参考文献: #2229

  • [orm] [功能]

    在映射集合中存在 None 现在会在 flush 期间引发错误。 以前,集合中的 None 值会被静默忽略。

    参考文献: #2229

  • [orm] [功能]

    Query.update() 方法现在对于要更新的表更加宽松。 现在更好地支持纯 Table 对象,并且可以将 joined-inheritance 子类与 update() 一起使用; 子类表将成为更新的目标,并且如果在 WHERE 子句中引用了父表,则编译器将根据方言的允许调用 UPDATE..FROM 语法以满足 WHERE 子句。 如果在“values”字典中通过对象指定列,则还支持 MySQL 的多表更新功能。 PG 的 DELETE..USING 在 Core 中尚不可用。

  • [orm] [功能]

    新的会话事件 after_transaction_create 和 after_transaction_end 允许跟踪新的 SessionTransaction 对象。 如果检查该对象,则可以用于确定会话何时首次变为活动状态以及何时停用。

  • [orm] [功能]

    Query 现在可以加载包含不可哈希类型的实体/标量混合“元组”行,方法是在使用的相应 TypeEngine 对象上设置标志 “hashable=False”。 返回不可哈希类型(通常是列表)的自定义类型可以将此标志设置为 False。

    参考文献: #2592

  • [orm] [功能]

    Query 现在默认以与 select() 相同的方式“自动关联”。 以前,在另一个查询中用作子查询的 Query 需要显式调用 correlate() 方法,以便将内部的表与外部的表关联起来。 与往常一样,correlate(None) 禁用关联。

    参考文献: #2179

  • [orm] [功能]

    after_attach 事件现在在对象通过 Session.add()、Session.merge() 等在 Session.new 或 Session.identity_map 中建立后发出,以便在调用事件时对象在这些集合中表示。 添加了 before_attach 事件以适应需要预附加对象自动刷新的用例。

    参考文献: #2464

  • [orm] [功能]

    当在 flush 的 “execute” 部分中使用不支持的方法时,Session 将产生警告。 这些是在 mapper 级别的 flush 事件(如 after_insert()、after_update() 等)中调用的熟悉的方法 add()、delete() 等以及集合和相关对象操作。 长期以来,文档中已突出说明,当在 flush 计划的执行中操作 Session 时,SQLAlchemy 无法保证结果,但是用户仍在这样做,因此现在有一个警告。 也许有一天 Session 将得到增强以支持 flush 内的这些操作,但就目前而言,无法保证结果。

  • [orm] [功能]

    ORM 实体可以传递到核心 select() 构造以及 select() 的 select_from()、correlate() 和 correlate_except() 方法,在这些方法中,它们将被解包为 selectable。

    参考文献: #2245

  • [orm] [功能]

    基于映射属性自动呈现关系连接条件的一些支持,使用核心 SQL 构造。 例如,select([SomeClass]).where(SomeClass.somerelationship) 将呈现来自 “someclass” 的 SELECT,并使用 “somerelationship” 的 primaryjoin 作为 WHERE 子句。 这改变了在核心 SQL 上下文中使用 “SomeClass.somerelationship” 的先前含义; 以前,它会“解析”为父 selectable,这通常没有用。 也适用于 query.filter()。 与以下内容相关。

    参考文献: #2245

  • [orm] [功能]

    declarative_base() 中的类注册表现在是一个 WeakValueDictionary。 因此,如果 “Base” 的子类被取消引用,如果它们没有被任何其他 mapper/超类 mapper 引用,它们将被垃圾回收。 请参阅此票证的下一条注释。

    参考文献: #2526

  • [orm] [功能]

    单继承声明性子类上的列之间的冲突,无论是否使用 mixin,都可以使用文档中描述的新 @declared_attr 用法来解决。

    参考文献: #2472

  • [orm] [功能]

    declared_attr 现在可以用于非 mixin 类,即使这通常仅对单继承子类列冲突解决有用。

    参考文献: #2472

  • [orm] [功能]

    declared_attr 现在可以与不是 Column 或 MapperProperty 的属性一起使用; 包括任何用户定义的值以及关联代理对象。

    参考文献: #2517

  • [orm] [功能]

    非常有限的支持,用于在类本身被取消引用时将 mapper 继承为 GC。 mapper 必须没有自己的表(即仅单表继承),并且没有多态属性。 这允许创建声明性映射类的临时子类的用例,该子类没有自己的表或映射指令,以便在被单元测试取消引用时进行垃圾回收。

    参考文献: #2526

  • [orm] [功能]

    Declarative 现在维护按字符串名称以及完整模块限定名称的类注册表。 现在可以基于 relationship() 中的模块限定字符串查找具有相同名称的多个类。 当多个类共享同一名称时,简单的类名查找现在会引发信息丰富的错误消息。

    参考文献: #2338

  • [orm] [功能]

    现在可以提供类绑定的属性,这些属性覆盖任何非 ORM 类型的列,而不仅仅是描述符。

    参考文献: #2535

  • [orm] [功能]

    为 Query.subquery() 添加了 with_labels 和 reduce_columns 关键字参数,以提供两种备用策略来生成具有唯一命名列的查询。

    参考文献: #1729

  • [orm] [功能]

    当对工具化集合的引用不再与父类关联(由于过期/属性刷新/集合替换),但在现在已分离的集合上收到追加或删除操作时,会发出警告。

    参考文献: #2476

  • [orm] [错误修复]

    如果两个表通过连接继承相关联,并且 FK 依赖项不是 inherit_condition 的一部分,则 ORM 将额外努力确定两个表之间的 FK 依赖项在 flush 期间是否不重要,从而为用户节省 use_alter 指令。

    参考文献: #2527

  • [orm] [错误修复]

    工具化事件 class_instrument()、class_uninstrument() 和 attribute_instrument() 现在仅针对分配给 listen() 的类的后代类触发。 以前,事件侦听器将被分配以侦听所有情况下的所有类,而与传递的 “target” 参数无关。

    参考文献: #2590

  • [orm] [错误修复]

    在任意顺序发送多级子类或缺少中间类的情况下,with_polymorphic() 以正确的顺序生成 JOIN,并使用正确的继承表。

    参考文献: #1900

  • [orm] [错误修复]

    改进了连接/子查询急切加载,处理共享公共基类的子类实体链,而未提供特定的 “join depth”。 将在检测到 “循环” 之前单独链接到每个子类 mapper,而不是将基类视为 “循环” 的源。

    参考链接:#2481

  • [orm] [错误修复]

    Session.is_modified() 上的 “passive” 标志不再具有任何效果。 在所有情况下,is_modified() 仅查看本地内存中的已修改标志,并且不会发出任何 SQL 或调用加载器可调用对象/初始化程序。

    参考文献: #2320

  • [orm] [错误修复]

    当将 delete-orphan cascade 与 one-to-many 或 many-to-many 结合使用而没有 single-parent=True 时发出的警告现在是一个错误。 在任何情况下,ORM 在发出此警告后都将无法正常运行。

    参考文献: #2405

  • [orm] [错误修复]

    在 flush 事件(如 before_flush()、before_update() 等)中发出的惰性加载现在将像在非事件代码中一样运行,关于在惰性发出的查询中使用的 PK/FK 值的考虑。 以前,将建立特殊标志,这些标志将导致惰性加载基于父 PK/FK 值的 “previous” 值来加载相关项,尤其是在 flush 中调用时; 以这种方式加载的信号现在本地化到工作单元实际需要以这种方式加载的地方。 请注意,UOW 有时会在调用 before_update() 事件之前加载这些集合,因此 “passive_updates” 的使用与否可能会影响集合是否表示 “旧” 或 “新” 数据,当在 flush 事件中访问时,基于惰性加载的发出时间。 此更改向后不兼容,极小的可能性是用户事件代码依赖于旧的行为。

    参考文献: #2350

  • [orm] [错误修复]

    继续关于由于事件侦听器导致的 flush 后额外状态; 从属性角度标记为 “dirty” 的任何状态,通常通过 after_insert()、after_update() 等中的 column-attribute set 事件,将在所有情况下重置 “history” 标志,而不是仅重置那些作为 flush 一部分的实例。 这具有以下效果:此 “dirty” 状态不会在 flush 后延续,并且不会导致 UPDATE 语句。 发出了关于此效果的警告; set_committed_state() 方法可用于在对象上分配属性,而不会生成历史事件。

    参考文献: #2566, #2582

  • [orm] [错误修复]

    修复了 @declared_attr Column 和 mixin 上直接定义的 Column 之间缓慢演变的断开连接。 在这两种情况下,Column 都将应用于声明类的表,但不应用于连接继承子类的表。 以前,直接定义的 Column 将放置在基表和子表上,但这通常不是期望的。

    参考文献: #2565

  • [orm] [错误修复]

    当父类本身映射到 join() 或 select() 语句(直接或通过连接继承,而不仅仅是 Table)时,Declarative 现在可以将单表继承子类上声明的列传播到父类的表。

    参考文献: #2549

  • [orm] [错误修复]

    当 uselist=False 与 “dynamic” 加载器结合使用时,会发出错误。 这在 0.7.9 中是一个警告。

  • [orm] [已移除]

    ORM 的旧 “mutable” 系统,包括 MutableType 类以及 PickleType 和 postgresql.ARRAY 上的 mutable=True 标志已被删除。 原位突变由 ORM 使用 sqlalchemy.ext.mutable 扩展检测,该扩展在 0.7 中引入。 MutableType 和相关构造的删除消除了 SQLAlchemy 内部的大量复杂性。 该方法效果不佳,因为它在使用时会扫描 Session 的全部内容。

    参考文献: #2442

  • [orm] [已移除]

    已删除已弃用的标识符

    • allow_null_pks mapper() 参数(使用 allow_partial_pks)

    • _get_col_to_prop() mapper 方法(使用 get_property_by_column())

    • Session.merge() 的 dont_load 参数(使用 load=True)

    • sqlalchemy.orm.shard 模块(使用 sqlalchemy.ext.horizontal_shard)

  • [orm] [已移动]

    InstrumentationManager 接口和整个相关的备用类实现系统现在已移至 sqlalchemy.ext.instrumentation。 这是一个很少使用的系统,它为类工具化的机制增加了显着的复杂性和开销。 新的架构允许它保持未使用状态,直到实际导入 InstrumentationManager,此时它将被引导到核心中。

示例

  • [示例]

    Beaker 缓存示例已转换为使用 dogpile.cache。 这是一个由 Beaker 缓存内部结构的同一创建者编写的新缓存库,代表了一个大大改进、简化和现代化的缓存系统。

    另请参阅

    Dogpile 缓存

    参考文献: #2589

引擎

  • [引擎] [功能]

    连接事件侦听器现在可以与单个 Connection 对象关联,而不仅仅是 Engine 对象。

    参考文献: #2511

  • [引擎] [功能]

    before_cursor_execute 事件针对所谓的 “_cursor_execute” 事件触发,这些事件通常是主键绑定序列和默认生成 SQL 短语的特殊情况执行,当 RETURNING 未与 INSERT 一起使用时,会单独调用。

    参考文献: #2459

  • [引擎] [功能]

    测试套件使用的库已四处移动,以便它们再次成为 SQLAlchemy 安装的一部分。 此外,新的测试套件存在于新的 sqlalchemy.testing.suite 包中。 这是一个正在开发中的系统,希望为外部方言提供通用测试套件。 在 SQLAlchemy 外部维护的方言可以使用新的测试装置作为其自身测试的框架,并将免费获得一组以方言为中心的 “合规性” 套件测试,包括改进的 “requirements” 系统,其中可以启用或禁用特定功能和特性以进行测试。

  • [引擎] [功能]

    添加了一个新的系统,用于进程内注册新的方言,而无需使用入口点。 请参阅 “注册新方言” 的文档。

    参考文献: #2462

  • [引擎] [功能]

    如果未显式传递,则在 bindparam() 上,如果未传递 “value” 或 “callable” 参数,则默认情况下将 “required” 标志设置为 True。 这将导致语句执行检查参数是否出现在绑定参数的最终集合中,而不是隐式分配 None。

    参考文献: #2556

  • [引擎] [功能]

    对 “dialect” API 进行了各种 API 调整,以更好地支持高度专业化的系统(如 Akiban 数据库),包括更多挂钩以允许执行上下文访问类型处理器。

  • [引擎] [功能]

    Inspector.get_primary_keys() 已弃用; 请使用 Inspector.get_pk_constraint()。 由 Diana Clarke 贡献。

    参考文献: #2422

  • [引擎] [功能]

    新的 C 扩展模块 “utils” 已添加,以便在我们有时间实施时提高函数速度。

  • [引擎] [错误修复]

    Inspector.get_table_names() order_by=”foreign_key” 功能现在首先按依赖项对表进行排序,以与 util.sort_tables 和 metadata.sorted_tables 一致。

  • [引擎] [错误修复]

    修复了数据库重启影响多个连接时,即使只需要一次处置,每个连接也会单独调用新的池处置的错误。

    参考: #2522

  • [引擎] [错误修复]

    select().apply_labels() 的 .c. 属性上的列名称现在基于 <tablename>_<colkey> 而不是 <tablename>_<colname>,对于那些具有明确命名的 .key 的列。

    参考文献: #2397

  • [引擎] [错误修复]

    当为 False 时,Table 上的 autoload_replace 标志将导致跳过任何引用已声明列的反射外键约束,假设 Python 中声明的列将接管指定 Python 中的 ForeignKey 或 ForeignKeyConstraint 声明的任务。

  • [引擎] [错误修复]

    ResultProxy 方法 inserted_primary_key、last_updated_params()、last_inserted_params()、postfetch_cols()、prefetch_cols() 都断言给定的语句是已编译的构造,并且是 insert() 或 update() 语句(视情况而定),否则引发 InvalidRequestError。

    参考文献: #2498

  • [引擎]

    ResultProxy.last_inserted_ids 已删除,已替换为 inserted_primary_key。

sql

  • [sql] [功能]

    Engine 添加了一个新方法 Engine.execution_options()。 此方法的工作方式类似于 Connection.execution_options(),因为它创建了父对象的副本,该副本将引用新的选项集。 该方法可用于构建分片方案,其中每个引擎共享相同的底层连接池。 该方法已针对 ORM 中的水平分片配方进行了测试。

  • [sql] [功能]

    核心中运算符系统的重大改写,允许在类型级别重新定义现有运算符以及添加新运算符。 可以从现有类型创建新类型,这些类型添加或重新定义导出到列表达式的操作,类似于 ORM 如何允许 comparator_factory。 新的架构将此功能移至核心,以便在所有情况下都一致可用,并使用现有的类型传播行为进行干净地传播。

    参考文献: #2547

  • [sql] [功能]

    作为补充,类型现在可以提供 “bind expressions” 和 “column expressions”,它们允许将 SQL 表达式在编译时注入到语句中,在每列或每绑定级别。 这是为了适应需要在 SQL 级别(而不是在 Python 级别)增强绑定和结果行为的类型用例。 允许透明加密/解密、PostGIS 函数的使用等方案。

    参考文献: #1534, #2547

  • [sql] [功能]

    核心运算符系统现在包括 getitem 运算符,即 Python 中的括号运算符。 这首先用于为 PostgreSQL ARRAY 类型提供索引和切片行为,并且还为最终用户定义自定义 __getitem__ 方案提供了一个挂钩,该方案可以在类型级别以及 ORM 级别的自定义运算符方案中应用。 lshift (<<) 和 rshift (>>) 也作为可选运算符支持。

    请注意,此更改的影响是,ORM 结合 synonym() 或其他 “descriptor-wrapped” 方案使用的基于描述符的 __getitem__ 方案将需要开始使用自定义比较器,以便保持此行为。

  • [sql] [功能]

    修改了用于确定用户定义的运算符(即使用 op() 方法授予的运算符)的运算符优先级规则。 以前,在所有情况下都应用最小优先级,现在默认优先级为零,低于除 “逗号”(例如,在 func 调用的参数列表中使用)和 “AS” 之外的所有运算符,并且也可以通过 op() 方法上的 “precedence” 参数进行自定义。

    参考文献: #2537

  • [sql] [功能]

    为所有 String 类型添加了 “collation” 参数。 存在时,呈现为 COLLATE <collation>。 这支持包括 MySQL、SQLite 和 PostgreSQL 在内的多个数据库现在支持的 COLLATE 关键字。

    参考文献: #2276

  • [sql] [功能]

    现在可以通过将 operators.custom_op() 与 UnaryExpression() 结合使用来自定义一元运算符。

  • [sql] [功能]

    增强了 GenericFunction 和 func.*,以允许用户定义的 GenericFunction 子类通过类名自动通过 func.* 命名空间可用,可以选择使用包名,以及具有使呈现的名称与 func.* 中标识的名称不同的能力。

  • [sql] [功能]

    cast() 和 extract() 构造现在也将通过 func.* 访问器生成,因为用户自然会尝试从 func.* 访问这些名称,即使返回的对象不是 FunctionElement,它们也可能执行预期的操作。

    参考文献: #2562

  • [sql] [功能]

    现在可以使用新的 inspect() 服务获取 Inspector 对象,它是

    参考文献: #2208

  • [sql] [功能]

    column_reflect 事件现在接受 Inspector 对象作为第一个参数,位于 “table” 之前。 使用此非常新的事件的 0.7 版本的代码需要修改以添加 “inspector” 对象作为第一个参数。

    参考文献: #2418

  • [sql] [功能]

    结果集中的列目标行为现在默认区分大小写。多年来,SQLAlchemy 会对这些值运行不区分大小写的转换,这可能是为了缓解像 Oracle 和 Firebird 这样方言的早期大小写敏感性问题。这些问题在更现代的版本中已得到更清晰的解决,因此移除了在标识符上调用 lower() 的性能损失。可以通过在 create_engine() 上设置“case_insensitive=False”来重新启用不区分大小写的比较。

    参考链接: #2423

  • [sql] [feature]

    当 insert.values() 或 update.values() 中存在不在目标表中的键时发出的“未使用的列名”警告现在是一个异常。

    参考链接: #2415

  • [sql] [feature]

    为 ForeignKey 和 ForeignKeyConstraint 添加了 “MATCH” 子句,感谢 Ryan Kelly。

    参考链接: #2502

  • [sql] [feature]

    添加了从表的别名中 DELETE 和 UPDATE 的支持,这可能与查询中的其他地方自身相关,感谢 Ryan Kelly。

    参考链接: #2507

  • [sql] [feature]

    select() 具有 correlate_except() 方法,自动关联除了传递的那些之外的所有 selectable。

  • [sql] [feature]

    prefix_with() 方法现在在 select()、insert()、update()、delete() 的每个方法上都可用,具有相同的 API,接受多个 prefix 调用,以及“dialect name”,以便 prefix 可以限制为一种方言。

    参考链接: #2431

  • [sql] [feature]

    为 select() 构造添加了 reduce_columns() 方法,使用 util.reduce_columns 实用函数内联替换列以删除等效列。 reduce_columns() 还添加了 “with_only_synonyms” 以将缩减限制为仅具有相同名称的列。已弃用的 fold_equivalents() 功能已移除。

    参考文献: #1729

  • [sql] [feature]

    重做了 startswith()、endswith()、contains() 运算符,以便更好地处理否定 (NOT LIKE),并在编译时组装它们,以便可以更改其渲染的 SQL,例如 Firebird 的 STARTING WITH 的情况。

    参考链接: #2470

  • [sql] [feature]

    为渲染 CREATE TABLE 系统添加了一个钩子,通过针对新的 schema.CreateColumn 构造构建 @compiles 函数,可以访问每个 Column 的渲染。

    参考链接: #2463

  • [sql] [feature]

    “标量” select 现在具有 WHERE 方法,以帮助生成式构建。关于 SS “关联” 列的方式也进行了细微调整;新的方法不再对正在选择的底层 Table 列应用含义。这改进了一些相当深奥的情况,并且那里的逻辑似乎没有任何目的。

  • [sql] [feature]

    当首次使用构造为引用多个远程表的 ForeignKeyConstraint() 时,会引发显式错误。

    参考链接: #2455

  • [sql] [feature]

    添加了 ColumnOperators.notin_(), ColumnOperators.notlike(), ColumnOperators.notilike()ColumnOperators

    参考链接: #2580

  • [sql] [change]

    Text() 类型会渲染赋予它的长度(如果指定了长度)。

  • [sql] [changed]

    expression.sql 中的大多数类不再以 underscore 开头,例如 Label、SelectBase、Generative、CompareMixin。 _BindParamClause 也被重命名为 BindParameter。这些类的旧 underscore 名称将在可预见的未来仍然可用作同义词。

  • [sql] [bug]

    修复了关键字参数传递给 Compiler.process() 时不会传播到 SELECT 语句的 columns 子句中存在的列表达式的错误。特别是当自定义编译方案依赖于特殊标志时,会出现这种情况。

    参考链接: #2593

  • [sql] [bug] [orm]

    select() 的自动关联功能,以及 Query 的代理功能,对于直接在封闭 SELECT 的 FROM 列表中渲染的 SELECT 语句无效。SQL 中的关联仅适用于列表达式,例如 WHERE、ORDER BY、columns 子句中的列表达式。

    参考链接: #2595

  • [sql] [bug]

    对列优先级进行了调整,将 “concat” 和 “match” 运算符移动到与 “is”、“like” 等相同的级别;这有助于在与 “IS” 结合使用时进行括号渲染。

    参考链接: #2564

  • [sql] [bug]

    使用标签(无论是否带有其他修改构造)将列表达式应用于 select 语句将不再 “target” 该表达式到基础 Column;这会影响 ORM 操作,这些操作依赖于 Column targeting 以检索结果。也就是说,像 query(User.id, User.id.label(‘foo’)) 这样的查询现在将分别跟踪每个 “User.id” 表达式的值,而不是将它们混在一起。预计任何用户都不会受到此影响;但是,如果使用 select() 结合 query.from_statement() 并尝试加载完全组成的 ORM 实体,如果 select() 使用任意 .label() 名称命名 Column 对象,则可能无法按预期工作,因为这些对象将不再 target 到该实体映射的 Column 对象。

    参考链接: #2591

  • [sql] [bug]

    修复了将 Column “default” 参数解释为可调用对象时,不会将 ExecutionContext 传递到关键字参数参数中的问题。

    参考链接: #2520

  • [sql] [bug]

    当 UniqueConstraint、ForeignKeyConstraint、CheckConstraint 和 PrimaryKeyConstraint 直接引用 Table 绑定的 Column 对象(即不仅仅是字符串列名),并且仅引用一个 Table 时,它们都会自动附加到其父表。在 0.8 之前,此行为发生在 UniqueConstraint 和 PrimaryKeyConstraint 上,但没有发生在 ForeignKeyConstraint 或 CheckConstraint 上。

    参考链接: #2410

  • [sql] [bug]

    TypeDecorator 现在包含一个通用的 repr(),默认情况下根据 “impl” 类型工作。对于指定了自定义 __init__ 方法的 TypeDecorator 类来说,这是一个行为更改;如果这些类型需要 __repr__() 提供忠实的构造函数表示,则需要重新定义 __repr__()。

    参考链接: #2594

  • [sql] [bug]

    column.label(None) 现在生成一个匿名标签,而不是返回列对象本身,这与 label(column, None) 的行为一致。

    参考链接: #2168

  • [sql] [removed]

    移除了 create_engine() 以及 String 上长期弃用且无功能的 assert_unicode 标志。

postgresql

  • [postgresql] [feature]

    postgresql.ARRAY 具有可选的 “dimension” 参数,将为数组分配特定数量的维度,这将在 DDL 中渲染为 ARRAY[][]…,还可以提高绑定/结果处理的性能。

    参考链接: #2441

  • [postgresql] [feature]

    postgresql.ARRAY 现在支持索引和切片。Python [] 运算符在所有 ARRAY 类型的 SQL 表达式上都可用;可以传递整数或简单切片。切片也可以在 UPDATE 语句的 SET 子句的赋值端使用,方法是将它们传递到 Update.values() 中;请参阅文档中的示例。

  • [postgresql] [feature]

    添加了新的 “数组字面量” 构造 postgresql.array()。基本上是一个渲染为 ARRAY[1,2,3] 的 “tuple”。

  • [postgresql] [feature]

    添加了对 PostgreSQL ONLY 关键字的支持,该关键字可以出现在 SELECT、UPDATE 或 DELETE 语句中的表对应的位置。该短语使用 with_hint() 建立。感谢 Ryan Kelly

    参考链接: #2506

  • [postgresql] [feature]

    PostgreSQL 方言的 “ischema_names” 字典是 “非官方地” 可自定义的。这意味着,可以将 PostGIS 类型等新类型添加到此字典中,并且 PG 类型反射代码应该能够处理具有可变数量参数的简单类型。此处的 “非官方” 功能有三个原因

    1. 这不是 “官方” API。理想情况下,“官方” API 将允许在方言或全局级别以通用方式处理自定义类型的可调用对象。

    2. 这仅针对 PG 方言实现,特别是因为 PG 对自定义类型的广泛支持优于其他数据库后端。真正的 API 将在默认方言级别实现。

    3. 此处的反射代码仅针对简单类型进行测试,并且可能在更复杂的组合类型中存在问题。

    补丁由 Éric Lemoine 提供。

mysql

  • [mysql] [feature]

    为 mysql 方言添加了 TIME 类型,接受 “fst” 参数,这是最新 MySQL 版本的新的 “fractional seconds” 说明符。该数据类型将解释从驱动程序接收到的微秒部分,但请注意,目前大多数/所有 MySQL DBAPI 都不支持返回此值。

    参考链接: #2534

  • [mysql] [bug]

    方言不再在首次连接时发出昂贵的服务器排序规则查询以及服务器大小写。这些函数仍然作为半私有函数可用。

    参考链接: #2404

sqlite

  • [sqlite] [feature]

    SQLite 日期和时间类型已经过全面修改,以支持更开放的输入和输出格式,使用基于名称的格式字符串和正则表达式。“microseconds” 新参数还提供了省略时间戳 “microseconds” 部分的选项。感谢 Nathan Wright 在这方面的工作和测试。

    参考链接: #2363

  • [sqlite]

    NCHAR, NVARCHAR 添加到 SQLite 方言的已识别类型名称列表中以进行反射。SQLite 返回赋予类型的名称作为返回的名称。

    参考链接: rc3addcc9ffad

mssql

  • [mssql] [feature]

    SQL Server 方言可以给定数据库限定的模式名称,例如 “schema=’mydatabase.dbo’”; 反射操作将检测到这一点,在 “.” 之间拆分模式以分别获取所有者,并在反射 “dbo” 所有者中的目标之前发出 “USE mydatabase” 语句;然后恢复从 DB_NAME() 返回的现有数据库。

  • [mssql] [feature]

    更新了对 mxodbc 驱动程序的支持;建议使用 mxodbc 3.2.1 以获得完全兼容性。

  • [mssql] [bug]

    移除了旧的行为,即通过 == 将列与标量 SELECT 进行比较会强制转换为 SQL server 方言的 IN。这是隐式行为,在其他场景中会失败,因此被移除。依赖于此行为的代码需要修改为显式使用 column.in_(select)。

    参考链接: #2277

oracle

  • [oracle] [feature]

    可以通过使用 exclude_setinputsizes 方言参数发送要排除的字符串 DBAPI 类型名称列表来自定义从 setinputsizes() 集合中排除的列的类型。此列表以前是固定的。该列表现在也默认为 STRING、UNICODE,从列表中删除 CLOB、NCLOB。

    参考链接: #2561

  • [oracle] [bug]

    当为 bindparam() 对象生成同名绑定参数时(如生成的 INSERT 和 UPDATE 语句中那样),引用信息现在会从 quote=True 的 Column 中传递,以便可以完全支持未知的保留名称。

    参考链接: #2437

  • [oracle] [bug]

    Oracle 中的 CreateIndex 构造现在将索引名称的模式限定为父表的模式。以前省略了此名称,这显然会在默认模式而不是表的模式中创建索引。

misc

  • [feature] [access]

    MS Access 方言已移至 Bitbucket 上的独立项目,利用了新的 SQLAlchemy 方言合规性套件。该方言仍然非常粗糙,可能尚未准备好进行通用,但它现在确实具有极其初步的功能。 https://github.com/gordthompson/sqlalchemy-access

  • [feature] [firebird]

    “startswith()” 运算符渲染为 “STARTING WITH”,“~startswith()” 渲染为 “NOT STARTING WITH”,使用 FB 更高效的运算符。

    参考链接: #2470

  • [feature] [firebird]

    添加了一个用于 fdb 驱动程序的实验性方言,但由于我无法构建 fdb 包而未经测试。

    参考链接: #2504

  • [bug] [firebird]

    当尝试发出没有长度的 VARCHAR 时,会引发 CompileError,与 MySQL 相同。

    参考链接: #2505

  • [bug] [firebird]

    Firebird 现在使用严格的 “ansi bind rules”,以便绑定参数不会在语句的 columns 子句中渲染 - 而是按字面意思渲染。

  • [bug] [firebird]

    支持在使用 Firebird 的 DateTime 类型时将 datetime 作为 date 传递;其他方言支持此功能。

  • [moved] [maxdb]

    MaxDB 方言已移出到待定的 bitbucket 项目,该方言多年来一直无法正常工作,(已删除;要查看 MaxDB 代码,请参阅删除之前的提交 https://github.com/sqlalchemy/sqlalchemy/tree/ba67f7dbc5eb7a1ed2a3e1b56df72a837130f7bb/lib/sqlalchemy/dialects/maxdb)