SqlAlchemy 2.0 中文文档(六十四)(1)

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


原文:docs.sqlalchemy.org/en/20/contents.html

0.9 变更日志

原文:docs.sqlalchemy.org/en/20/changelog/changelog_09.html

0.9.10

发布日期:2015 年 7 月 22���

orm

  • [orm] [feature]
    Query.column_descriptions返回的字典中添加了一个新条目"entity"。这指的是由表达式引用的主 ORM 映射类或别名类。与现有的"type"条目相比,它将始终是一个映射实体,即使从列表达式中提取,或者如果给定的表达式是纯核心表达式,则为None。另请参见#3403,该修复了此功能中的一个回归,该回归在 0.9.10 中未发布,但在 1.0 版本中发布。
    参考:#3320
  • [orm] [bug]
    当使用Query.update()Query.delete()方法时,Query不支持连接、子查询或特殊的 FROM 子句;如果已调用类似Query.join()Query.select_from()的方法,而不是静默地忽略这些字段,将发出警告。从 1.0.0b5 开始,这将引发错误。
    参考:#3349
  • [orm] [bug]
    修复了在多个嵌套的Session.begin_nested()操作中状态跟踪失败的 bug,导致在内部保存点中更新的对象的“脏”标志无法传播,因此如果外部保存点被回滚,该对象将不会成为过期状态的一部分,因此将恢复到其数据库状态。
    参考:#3352

engine

  • [engine] [bug]
    将字符串值"none"添加到Pool.reset_on_return参数中,作为None的同义词,以便所有设置都可以使用字符串值,从而允许像engine_from_config()这样的实用程序可以无问题地使用。
    参考:#3375

sql

  • [sql] [feature]
    官方支持了Insert.from_select()内部 SELECT 中使用的 CTE。此行为在 0.9.9 版本之前意外生效,当时由于与 #3248 的无关更改而不再生效。请注意,这是 INSERT 之后、SELECT 之前 WITH 子句的呈现方式;在 INSERT、UPDATE、DELETE 的顶层呈现 CTE 的完整功能是一个后续版本的新功能。
    参考:#3418
  • [sql] [bug]
    修复了一个问题,即使用命名约定的 MetaData 对象将无法正确与 pickle 一起工作。由于跳过了该属性,如果使用反序列化的 MetaData 对象来基于其他表,则会导致不一致和失败。
    参考:#3362

postgresql

  • [postgresql] [bug]
    修复了长期存在的错误,即在 psycopg2 方言中与非 ASCII 值和 native_enum=False 结合使用时,Enum 类型无法正确解码返回结果。这源于 PG ENUM 类型曾经是一个独立的类型,没有“非本机”选项。
    参考:#3354

mysql

  • [mysql] [bug] [pymysql]
    当使用“executemany”操作并带有  unicode 参数时,修复了 PyMySQL 的 Unicode 支持。SQLAlchemy 现在将语句和绑定参数都作为 Unicode  对象传递,因为 PyMySQL 通常在内部使用字符串插值来生成最终语句,在 executemany 情况下仅对最终语句执行“encode”步骤。
    参考:#3337
  • [mysql] [bug] [py3k]
    修复了在 Py3K 上未正确使用 ord() 函数的 BIT 类型。感谢 David Marin 的拉取请求。
    参考:#3333

sqlite

  • [sqlite] [bug]
    修复了 SQLite 方言中的一个错误,即不会反映包含非字母字符(如点或空格)的唯一约束的反射问题。
    参考:#3495

测试

  • [tests] [bug] [pypy]
    修复了一个导入问题,阻止了“pypy setup.py test”的正确工作。
    参考:#3406

杂项

  • [bug] [ext]
    修复了在使用扩展属性仪器系统时的错误,当使用 class_mapper() 调用无效输入(同时也不是弱引用可引用的)时,不会引发正确的异常,例如整数。
    参考:#3408
  • [bug] [ext]
    修复了从 0.9.9 开始的回归,其中 as_declarative() 符号从 sqlalchemy.ext.declarative 命名空间中移除。
    参考:#3324

0.9.9

发布日期:2015 年 3 月 10 日

orm

  • [orm] [feature]
    添加了新的参数 Session.connection.execution_options,可以在事务开始之前,当 Connection 第一次被检出时设置执行选项。这用于在事务开始之前在连接上设置诸如隔离级别等选项。
    另请参阅
    设置事务隔离级别 / DBAPI AUTOCOMMIT - 新文档部分,详细介绍了使用会话设置事务隔离的最佳实践。
    参考:#3296
  • [orm] [feature]
    添加了新的方法 Session.invalidate(),功能类似于 Session.close(),但还会在所有连接上调用 Connection.invalidate(),确保它们不会返回到连接池。在某些情况下很有用,比如处理 gevent 超时时,不能进一步使用连接,即使是回滚也不安全。
  • [orm] [bug]
    修复了 ORM 对象比较中的错误,当比较多对一 != None 时,如果源是别名类,或者查询需要对表达式应用特殊别名处理,例如由于别名连接或多态查询导致,比较将失败;还修复了当将多对一与对象状态进行比较时,如果查询需要对别名连接或多态查询应用特殊别名处理,比较将失败的情况。
    参考:#3310
  • [orm] [bug]
    修复了一个 bug,在Sessionafter_rollback()处理程序错误地在处理程序内向该Session添加状态时,内部断言将失败,并且尝试继续的任务警告和删除此状态(由#2389建立)。
    参考:#3309
  • [orm] [bug]
    修复了一个 bug,当使用未知的 kw 参数调用Query.join()时会引发 TypeError,由于格式错误导致其自身引发 TypeError。感谢 Malthe Borch 的拉取请求。
  • [orm] [bug]
    修复了懒加载 SQL 构造中的 bug,其中一个复杂的 primaryjoin 在“指向自身的列”的自引用连接样式中多次引用相同的“本地”列时,在所有情况下都不会被替换。这里确定替换的逻辑已经重新制定为更加开放式。
    参考:#3300
  • [orm] [bug]
    “通配符”加载器选项,特别是由load_only()选项设置的选项,以覆盖未明确提及的所有属性,现在考虑到给定实体的超类,如果该实体使用继承映射进行映射,则超类中的属性名称也将从加载中省略。此外,多态鉴别器列无条件地包含在列表中,就像主键列一样,因此即使设置了  load_only(),子类型的多态加载仍将正常工作。
    参考:#3287
  • [orm] [bug] [pypy]
    修复了一个 bug,在Query在获取结果之前抛出异常时,特别是当无法形成行处理器时,游标会保持打开状态,结果仍在等待中,实际上并未关闭。这通常只在像 PyPy 这样的解释器上出现问题,其中游标不会立即被 GC 回收,并且在某些情况下可能导致事务/锁定的持续时间超过所需时间。
    参考:#3285
  • [orm] [bug]
    修复了一个泄漏问题,该问题会在不支持且极不推荐的情况下发生,即多次替换固定映射类上的关系,引用任意增长的目标映射器数量。当替换旧关系时会发出警告,但是如果映射已用于查询,则旧关系仍将在某些注册表中被引用。
    参考:#3251
  • [orm] [bug] [sqlite]
    修复了表达式变异可能表现为在使用Query从多个匿名列实体中选择时出现“无法找到列”错误的 bug,当针对 SQLite 查询时,作为 SQLite 方言使用的“join rewriting”功能的副作用。
    参考:#3241
  • [orm] [bug]
    修复了当使用of_type()将单继承子类连接到Query.join()Query.outerjoin()的 ON 子句时,如果设置了from_joinpoint=True标志,则不会在 ON 子句中呈现“单表条件”的 bug。
    参考:#3232

examples

  • [examples] [bug]
    更新了带有历史表的版本控制示例,使映射列重新映射以匹配列名称以及列的分组;特别是,这允许在同一列命名的连接继承场景中明确分组的列在历史映射中以相同的方式映射,避免了 0.9 系列中关于此模式的警告,并允许属��键的相同视图。
  • [examples] [bug]
    修复了示例/generic_associations/discriminator_on_association.py 中的 bug,在这里,AddressAssociation 的子类未被映射为“单表继承”,导致在尝试进一步使用映射时出现问题。

engine

  • [engine] [feature]
    添加了用于查看事务隔离级别的新用户空间访问器;Connection.get_isolation_level()Connection.default_isolation_level
  • [engine] [bug]
    修复了Connection和池中的 bug,当使用isolation_level参数与Connection.execution_options()一起使用时,Connection.invalidate()方法或由于数据库断开连接而导致的失效会失败;重置隔离级别的“finalizer”将在不再打开的连接上调用。
    参考:#3302
  • [engine] [bug]
    Connection.execution_options() 在使用 Transaction 时,如果使用了 isolation_level 参数,则会发出警告;DBAPIs 和/或 SQLAlchemy 方言(如 psycopg2、MySQLdb)可能会隐式回滚或提交事务,或者在下一个事务中不更改设置,因此这是不安全的。
    参考:#3296

sql

  • [sql] [bug]
    Enum__repr__() 输出中添加了 native_enum 标志,当与 Alembic autogenerate 一起使用时,这主要是重要的。贡献者:Dimitris Theodorou。
  • [sql] [bug]
    修复了使用实现了也是 TypeDecoratorTypeDecorator 会在针对使用此类型的对象进行任何类型的 SQL 比较表达式时失败的问题,Python 会报错“Cannot create a consistent method resolution order (MRO)”。
    参考:#3278
  • [sql] [bug]
    修复了在 INSERT 中嵌入 SELECT 时的问题,无论是通过 values 子句还是作为“from select”,当两个语句共享相同名称的列时,将污染由 RETURNING 子句生成的结果集中使用的列类型,导致检索返回行时可能出现错误或错误适应。
    参考:#3248

schema

  • [schema] [bug]
    修复了 0.9  版本中外键设置系统中的错误,即当外键与父级链接时,如果外键在稍后才会接收到其父级列,例如在反射 + “useexisting”  场景中,如果目标列实际上具有不同于其名称的键值,则使用了“link_to_name=True”的外键可能会失败,因为在反射中如果使用了列反射事件来更改反映的  Column 对象的 .key,使 link_to_name 变得重要。同样,在目标列具有不同键并且使用 link_to_name 引用时,也以类似的方式修复了通过 FK 传输列类型的支持。
    参考:#1765, #3298

postgresql

  • [postgresql] [feature]
    添加了对 PostgreSQL 索引使用 CONCURRENTLY 关键字的支持,使用 postgresql_concurrently 建立。感谢 Iuri de Silvio 的拉取请求。
    另请参见
    并发索引
  • [postgresql] [bug]
    修复了在使用  psycopg2 时支持 PostgreSQL UUID 类型与 ARRAY 类型的问题。现在 psycopg2 方言使用  psycopg2.extras.register_uuid() 钩子,以便始终将 UUID 值作为 UUID() 对象传递到/从 DBAPI。UUID.as_uuid 标志仍然受到尊重,但在 psycopg2 中,当禁用此标志时,我们需要将返回的 UUID 对象转换回字符串。
    参考:#2940
  • [postgresql] [bug]
    添加了对 psycopg2 2.5.4 或更高版本使用 postgresql.JSONB 数据类型的支持,该版本具有 JSONB 数据的本机转换,因此必须禁用 SQLAlchemy 的转换器;此外,新添加的 psycopg2 扩展 extras.register_default_jsonb 用于通过 json_deserializer 参数传递给方言的 JSON 反序列化器。还修复了实际上未循环传输 JSONB 类型而不是 JSON 类型的 PostgreSQL 集成测试。感谢 Mateusz Susik 的拉取请求。
  • [postgresql] [bug]
    修复了在使用旧版本  psycopg2 < 2.4.3 时注册 HSTORE 类型时使用“array_oid”标志的问题,该版本不支持此标志,以及在使用  psycopg2 版本 < 2.5 时使用本机 json 序列化器钩子“register_default_json”与用户定义的json_deserializer时,该版本不包括本机 json。
  • [postgresql] [bug]
    修复了 PostgreSQL 方言在 Index 中未能呈现表绑定列的表达式的 bug;通常当一个 text() 构造是索引中的表达式之一时;或者如果其中一个或多个是这样的表达式,则可能会误解表达式列表。
    参考:#3174

mysql

  • [mysql] [change]
    gaerdbms 方言不再必要,并发出弃用警告。Google 现在建议直接使用 MySQLdb 方言。
    参考:#3275
  • [mysql] [bug]
    在 MySQLdb 方言周围添加了一个版本检查,用于检查‘utf8_bin’排序规则,因为这在 MySQL 服务器 < 5.0 上失败。
    参考:#3274

sqlite

  • [sqlite] [feature]
    添加了对 SQLite 上部分索引(例如带有 WHERE 子句)的支持。感谢 Kai Groner 的拉取请求。
    另请参见
    部分索引
  • [sqlite] [feature]
    添加了一个新的 SQLite 后端用于 SQLCipher 后端。该后端使用 pysqlcipher Python 驱动程序提供加密的 SQLite 数据库,该驱动程序与 pysqlite 驱动程序非常相似。
    另请参阅
    pysqlcipher

杂项

  • [bug] [ext] [py3k]
    修复了在 Py3K 下关联代理列表类无法正确解释切片的 bug。感谢 Gilles Dartiguelongue 提供的拉取请求。

0.9.8

发布日期:2014 年 10 月 13 日

orm

  • [orm] [bug] [engine]
    修复了一个影响与#3199相同类别事件的 bug,当使用named=True参数时会出现问题。一些事件无法注册,其他事件无法正确调用事件参数,通常在事件被“包装”以适应其他方式时。已重新排列“named”机制,以不干扰内部包装函数期望的参数签名。
    参考:#3197
  • [orm] [bug]
    修复了一个影响许多事件类的 bug,特别是 ORM 事件,但也包括引擎事件,在这些事件中,“去重复”一个冗余调用listen()的常规逻辑失败,对于那些监听器函数被包装的事件。在 registry.py 中会触发一个断言。现在这个断言已经整合到去重复检查中,另外还有一个更简单的检查去重复的方法。
    参考:#3199
  • [orm] [bug]
    修复了一个警告,当一个复杂的自引用主连接包含函数时会发出警告,同时指定了 remote_side;警告会建议设置“remote side”。现在只有在 remote_side 不存在时才会发出警告。
    参考:#3194

orm 声明式

  • [orm] [declarative] [bug]
    在使用AbstractConcreteBase与声明__abstract__的子类时修复了“‘NoneType’ object has no attribute ‘concrete’”错误。
    参考:#3185

引擎

  • [engine] [bug]
    通过create_engine.execution_optionsEngine.update_execution_options()传递给Engine的执行选项不会传递给在“第一次连接”事件中初始化方言的特殊Connection;方言通常会在此阶段执行自己的查询,并且不应应用任何当前可用的选项。特别是,“autocommit”选项导致在此初始连接中尝试自动提交,由于Connection的非标准状态而导致 AttributeError 失败。
    参考:#3200
  • [引擎] [错误]
    用于确定 INSERT 或 UPDATE 影响的列的字符串键现在在它们对“compiled cache”缓存键的贡献时排序。这些键之前没有确定性地排序,这意味着相同的语句可能会基于等效键多次被缓存,这既会在内存方面带来成本,也会在性能方面带来成本。
    参考:#3165

sql

  • [sql] [错误]
    修复了在 sql 包中有相当数量的 SQL 元素无法成功执行__repr__()的 bug,因为缺少description属性,这将导致一个内部 AttributeError 再次调用__repr__()时递归溢出。
    参考:#3195
  • [sql] [错误]
    调整表/索引反射,如果索引报告的列在表中未找到,则发出警告并跳过该列。这可能会发生在一些特殊的系统列情况下,如在 Oracle 中观察到的情况。
    参考:#3180
  • [sql] [错误]
    修复了 CTE 中的 bug,其中当一个 CTE 引用语句中的另一个别名 CTE 时,literal_binds编译器参数将不会始终正确传播。
    参考:#3154
  • [sql] [错误]
    修复了 0.9.7 版本的退化,由#3067引起,结合一个命名错误的单元测试,以至于所谓的“schema”类型如BooleanEnum无法再被 pickle 化。
    参考:#3067#3144

postgresql

  • [postgresql] [feature] [pg8000]
    使用 pg8000 驱动程序添加了对“合理的多行计数”的支持,这主要适用于在 ORM 中使用版本控制时。该功能基于使用 pg8000 1.9.14 或更高版本进行版本检测。感谢 Tony Locke 的拉取请求。
  • [postgresql] [bug]
    重新访问了首次在 0.9.5 中修补的此问题,显然 psycopg2 的.closed访问器并不像我们假设的那样可靠,因此我们已添加了对异常消息“SSL  SYSCALL error: Bad file descriptor”和“SSL SYSCALL error: EOF  detected”进行显式检查,以检测到断开连接的情况。我们将继续将 psycopg2 的 connection.closed 作为首次检查。
    参考:#3021
  • [postgresql] [bug]修复了 PostgreSQL JSON 类型无法持久化或以其他方式呈现 SQL NULL 列值,而不是 JSON 编码的'null'的错误。为支持此情况,更改如下:
  • 现在可以指定值null(),这将始终导致结果语句中的 NULL 值。
  • 添加了一个新参数JSON.none_as_null,当为 True 时表示 Python 的None值应该持久化为 SQL NULL,而不是 JSON 编码的'null'
  • 对于除了 psycopg2 之外的其他 DBAPI,如 pg8000,将 NULL 检索为 None 也已修复。
    参考:#3159
  • [postgresql] [bug]
    现在,DBAPI 错误的异常包装系统可以适应非标准的 DBAPI 异常,例如 psycopg2 的 TransactionRollbackError。这些异常现在将使用sqlalchemy.exc中最接近的可用子类引发,在 TransactionRollbackError 的情况下,使用sqlalchemy.exc.OperationalError
    参考:#3075
  • [postgresql] [bug]
    修复了array对象中的错误,其中与普通的 Python 列表进行比较会导致使用不正确的数组构造函数。感谢 Andrew 的拉取请求。
    参考:#3141
  • [postgresql] [bug]
    为函数添加了支持的FunctionElement.alias()方法,例如func构造。先前,此方法的行为是未定义的。当前行为模仿了 0.9.4 之前的行为,即将函数转换为具有给定别名的单列 FROM 子句,其中列本身是匿名命名的。
    参考:#3137

mysql

  • [mysql] [bug] [mysqlconnector]
    从版本  2.0 开始的 Mysqlconnector,可能是由于 Python 3  合并的副作用,现在不再期望百分号(例如作为模数运算符等)被加倍,即使使用“pyformat”绑定参数格式(Mysqlconnector  没有记录此更改)。 方言现在在检测模数运算符是否应该呈现为%%%时,会检查 py2k 和 mysqlconnector 小于版本 2.0。
  • [mysql] [bug] [mysqlconnector]
    MySQLconnector 版本 2.0 及以上现在会传递 Unicode SQL;对于 Py2k 和 MySQL < 2.0,字符串会被编码。

sqlite

  • [sqlite] [bug]
    当使用附加数据库文件从 UNION  进行选择时,pysqlite 驱动器在 cursor.description  中报告列名为‘dbname.tablename.colname’,而不是正常情况下的‘tablename.colname’(请注意,对于  UNION,它应该是‘colname’,但我们对此进行了处理)。  此处的列翻译逻辑已调整为检索最右侧的标记,而不是第二个标记,因此在两种情况下都有效。 解决方法由 Tony Roberts 提供。
    参考:#3211

mssql

  • [mssql] [bug]
    修复了 pymssql 方言中版本字符串检测的问题,以便与 Microsoft SQL Azure 一起工作,后者将“SQL Server”更改为“SQL Azure”。
    参考:#3151

oracle

  • [oracle] [bug]
    修复了 Oracle 方言中长期存在的 bug,即以数字开头的绑定参数名不会被引用,因为 Oracle 不喜欢绑定参数名中的数字。
    参考:#2138

misc

  • [bug] [declarative]
    修复了在一些特殊的终端用户设置中观察到的不太可能的竞争条件,其中在声明性检查“重复类名”时会遇到未完全清理的弱引用,与其他被移除的类相关联;此处的检查现在确保在进一步调用之前弱引用仍然引用对象。
    参考:#3208
  • [bug] [ext]
    修复了排序列表中的 bug,在集合替换事件期间,如果 reorder_on_append 标志设置为 True,则项目的顺序会被打乱。 修复确保排序列表仅影响显式与对象相关联的列表。
    参考:#3191
  • [bug] [ext]
    修复了MutableDict中未能实现update()字典方法的错误,因此未捕获更改。 拉请求由 Matt Chisholm 提供。
  • [bug] [ext]
    修复了一个错误,即MutableDict的自定义子类在“强制”操作中不会显示,并且会返回一个普通的MutableDict。感谢 Matt Chisholm 的拉取请求。
  • [bug] [pool]
    修复了连接池日志记录中的错误,即如果使用logging.setLevel()设置日志记录而不是使用echo_pool标志,则“连接已检出”调试日志消息将不会发出。已添加用于断言此日志记录的测试。这是在 0.9.0 中引入的回归。
    参考:#3168

0.9.7

发布日期:2014 年 7 月 22 日

orm

  • [orm] [bug] [eagerloading]
    修复了由 0.9.4 发布的#2976引起的回归,其中沿着一系列连接的急加载的“外连接”传播会错误地将兄弟连接路径上的“内连接”也转换为外连接,当只有后代路径应该接收“外连接”传播时;另外,修复了相关问题,即“嵌套”连接传播会不适当地发生在两个兄弟连接路径之间。
    参考:#3131
  • [orm] [bug]
    由于#2736导致的 0.9.0 的回归已修复,Query.select_from()方法不再正确设置Query对象的“from entity”,因此随后的Query.filter_by()Query.join()调用将无法在按字符串名称搜索属性时检查适当的“from”实体。
    参考:#2736#3083
  • [orm] [bug]
    对于  query.update()/delete()的“评估器”不适用于多表更新,并且需要设置为 synchronize_session=False  或 synchronize_session=‘fetch’;现在会发出警告。在 1.0 版本中,这将升级为完整的异常。
    参考:#3117
  • [orm] [bug]
    修复了在保存点块内持久化、删除或主键更改的项目在外部事务回滚后不参与恢复到其先前状态(不在会话中,在会话中,先前的 PK)的错误。
    参考:#3108
  • [orm] [bug]
    修复了子查询急加载与with_polymorphic()一起使用时的错误,子查询加载中实体和列的定位对于这种类型的实体和其他实体更加准确。
    参考:#3106
  • [orm] [bug]
    修复了涉及动态属性的错误,这是从版本 0.9.5 中的#3060再次出现的回归。具有lazy='dynamic'的自引用关系在刷新操作中会引发 TypeError。
    参考:#3099

engine

  • [engine] [feature]
    添加了新的事件ConnectionEvents.handle_error(),这是ConnectionEvents.dbapi_error()的更全面和全面的替代品。
    参考:#3076

sql

  • [sql] [bug]
    修复了Enum和其他SchemaType子类中的错误,直接将类型与MetaData关联会导致在MetaData上发���事件(如创建事件)时挂起。
    这个更改也被回溯到:0.8.7
    参考:#3124
  • [sql] [bug]
    修复了自定义操作符加TypeEngine.with_variant()系统中的错误,当与变体一起使用TypeDecorator时,使用比较运算符会导致 MRO 错误。
    这个更改也被回溯到:0.8.7
    参考:#3102
  • [sql] [bug]
    修复了命名约定功能中的错误,其中使用包含constraint_name的检查约定会强制所有BooleanEnum类型也需要名称,因为这些隐式创建约束,即使最终目标后端不需要生成约束,比如 PostgreSQL。这些特定约束的命名约定机制已经重新组织,使得命名确定在 DDL 编译时完成,而不是在约束/表构建时完成。
    参考:#3067
  • [sql] [bug]
    修复了通用表达式中的错误,当 CTE 在某些方式中嵌套时,位置绑定参数可能以错误的最终顺序表达。
    参考:#3090
  • [sql] [bug]
    修复了多值Insert构造中的错误,使得对于字面 SQL 表达式给定的第一个值之外的后续值条目未能检查。
    参考:#3069
  • [sql] [bug]
    在 Python 版本< 2.6.5 中,为 dialect_kwargs 迭代添加了一个“str()”步骤,解决了“无 unicode 关键字参数”错误,因为这些参数在某些反射过程中作为关键字参数传递。
    参考:#3123
  • [sql] [bug]
    TypeEngine.with_variant()方��现在将接受一个类型类作为参数,内部将其转换为实例,使用了其他构造(如Column)长期建立的相同约定。
    参考:#3122

postgresql

  • [postgresql] [feature]
    添加了postgresql_regconfig参数到ColumnOperators.match()操作符,允许指定“reg config”参数到to_tsquery()函数中。感谢 Jonathan Vanasco 的拉取请求。
    参考:#3078
  • [postgresql] [feature]
    通过JSONB添加了对 PostgreSQL JSONB 的支持。感谢 Damian Dimmich 的拉取请求。
  • [postgresql] [bug] [pg8000]
    修复了 0.9.5 版本中由新的 pg8000 隔离级别功能引入的错误,其中引擎级别的隔离级别参数在连接时会引发错误。
    参考:#3134

mysql

  • [mysql] [bug]
    MySQL 错误 2014“commands  out of sync”似乎在现代 MySQL-Python 版本中被提升为 ProgrammingError,而不是  OperationalError;现在所有被测试为“is disconnect”的 MySQL 错误代码都在 OperationalError 和  ProgrammingError 中进行检查。
    此更改也被回溯到:0.8.7
    参考:#3101

sqlite

  • [sqlite] [bug]
    修复了 SQLite 连接重写问题,其中作为标量子查询嵌入的子查询(例如在 IN 中)会从包含查询中接收不适当的替换,如果相同的表在子查询中存在,并且在包含查询中也存在,例如在连接继承场景中。
    参考:#3130

mssql

  • [mssql] [功能]
    为 SQL Server 2008 启用了“多值插入”。感谢 Albert Cervin 的拉取请求。还扩展了“IDENTITY INSERT”模式的检查,以包括当标识键出现在语句的 VALUEs 子句中时。
  • [mssql] [错误]
    将语句编码添加到“SET IDENTITY_INSERT”语句中,当显式插入插入到 IDENTITY 列时,以支持像 pyodbc + unix + py2k 这样不支持 unicode 语句的驱动程序上的非 ascii 表标识符。
    此更改也回溯到:0.8.7
  • [mssql] [错误]
    在 SQL Server pyodbc 方言中,修复了description_encoding方言参数的实现,当未明确设置时,会导致无法正确解析包含不同编码名称的结果集的 cursor.description。未来不应该需要此参数。
    此更改也回溯到:0.8.7
    参考:#3091
  • [mssql] [错误]
    修复了从 0.9.5 引起的回归,由#3025引起,其中用于确定“默认模式”的查询在 SQL Server 2000 中无效。对于 SQL Server 2000,我们回到默认的“模式名称”参数,该参数是可配置的,但默认为’dbo’。
    参考:#3025

oracle

  • [oracle] [错误] [测试]
    修复了 oracle 方言测试套件中的错误,其中在一个测试中,假定‘用户名’在数据库 URL 中,即使这可能并非事实。
    参考:#3128

测试

  • [测试] [错误]
    修复了“python setup.py test”未正确调用 distutils 的错误,导致在测试套件结束时会发出错误。

杂项

  • [错误] [声明性]
    修复了当声明性__abstract__标志未被区分为实际值False时的错误。__abstract__标志需要在被测试的级别上实际评估为 True 值。
    参考:#3097

0.9.6

发布日期:2014 年 6 月 23 日

orm

  • [orm] [错误]
    撤销了#3060的更改 - 这是一个在 1.0 中更全面更新的工作单元修复,通过#3061#3060中的修复不幸地产生了一个新问题,即对多对一属性的急加载可能会产生被解释为属性更改的事件。
    参考:#3060

0.9.5

发布日期:2014 年 6 月 23 日

orm

  • [orm] [功能]
    “primaryjoin”模型已经进一步扩展,允许严格从单个列到自身的连接条件,通过某种 SQL 函数或表达式进行转换。这有点实验性质,但第一个概念验证是“材料化路径”连接条件,其中路径字符串使用“like”与自身进行比较。ColumnOperators.like() 操作符也已添加到可在 primaryjoin 条件中使用的有效操作符列表中。
    参考:#3029
  • [orm] [feature]
    添加了新的实用函数make_transient_to_detached(),可用于制造行为就像它们从会话中加载然后分离的对象。不存在的属性被标记为过期,并且对象可以添加到一个会话中,它将表现得像一个持久对象。
    参考:#3017
  • [orm] [bug]
    修复了子查询急加载中的错误,当跨多态子类边界的长链急加载与多态加载一起使用时,会无法定位链中的子类链接,导致在AliasedClass上出现缺少属性名称的错误。
    此更改也已回溯至:0.8.7
    参考:#3055
  • [orm] [bug]
    修复了 ORM 中的 bug,class_mapper() 函数会掩盖应该在映射器配置期间由于用户错误而引发的 AttributeErrors 或 KeyErrors。对于属性/键错误的捕获已经更具体,不包括配置步骤。
    此更改也已回溯至:0.8.7
    参考:#3047
  • [orm] [bug]
    已添加额外的检查,用于处理继承映射器隐式组合其基于列的属性之一与父级属性的情况,其中这些列通常不一定共享相同的值。这是通过#1892添加的现有检查的扩展;然而,这个新检查只发出警告,而不是异常,以允许依赖于现有行为的应用程序。
    参见
    我收到关于“隐式组合列 X 在属性 Y 下”的警告或错误
    参考:#3042
  • [orm] [bug]
    修改了 load_only() 的行为,使得主键列始终被添加到“未延迟加载”列的列表中;否则,ORM 无法加载行的标识。显然,可以延迟映射的主键,ORM  将失败,这一点没有改变。但是,由于 load_only 本质上是说“除了 X 之外都延迟加载”,因此 PK 列不参与此延迟加载更为关键。
    引用:#3080
  • [orm] [bug]
    修复了在所谓的“行切换”场景中出现的一些边缘情况,其中  INSERT/DELETE 可以转换为 UPDATE。在这种情况下,将多对一关系设置为 None,或在某些情况下将标量属性设置为  None,可能不会被检测为值的净变化,因此 UPDATE 不会重置前一行上的内容。这是由于属性历史的一些尚未解决的副作用,这些副作用涉及隐式假定  None 对于先前未设置的属性实际上不是“变化”。另请参见 #3061
    注意
    此更改已在 0.9.6 版本中撤销。完整的修复将在 SQLAlchemy 的 1.0 版本中实现。
    引用:#3060
  • [orm] [bug]
    关联到 #3060,对工作单元进行了调整,以便在要删除的自引用对象图中,加载相关的多对一对象更为积极;加载相关对象有助于确定删除顺序的正确顺序,如果未设置 passive_deletes。
  • [orm] [bug]
    修复了 SQLite 连接重写中的错误,其中由于重复导致的匿名列名在子查询中不会被正确重写。这会影响带有任何类型子查询 + 连接的 SELECT 查询。
    引用:#3057
  • [orm] [bug] [sql]
    修复了 #2804 中新增的布尔强制转换的问题,新规则对于“where”和“having”在“whereclause”和“having” kw 参数上不会生效,这也是 select() 构造函数使用的内容,因此在 ORM 中也无法正常工作。
    引用:#3013

示例

  • [examples] [feature]
    添加了一个新示例,演示了使用最新关系特性的物化路径。示例由 Jack Zhou 提供。

引擎

  • [engine] [bug]
    修复了一个  bug,当引擎首次连接并进行初始检查时发生 DBAPI  异常,异常不是断开连接异常,但是当我们尝试关闭光标时光标引发错误。在这种情况下,真正的异常将被压制,因为我们试图通过连接池记录光标关闭异常并失败,因为我们试图以不适合这种非常特定情况的方式访问池的记录器。
    参考:#3063
  • [engine] [bug]
    检测到一些“双重无效”情况,其中连接无效可能发生在已经关键的部分内,比如连接关闭(); 最终,这些条件是由于#2907中的更改引起的,因为“返回时重置”功能调用 Connection/Transaction 来处理它,其中可能会捕获“断开检测”。然而,最近在#2985中的更改使得这种情况更有可能被视为“连接无效”操作更快,因为在 0.9.4 上更容易复现这个问题,而在 0.9.3 上更难。
    现在在可能发生无效的任何部分都添加了检查,以阻止在无效连接上发生进一步的不允许操作。这包括两个修复,一个在引擎级别,一个在池级别。虽然这个问题在高并发的 gevent 情况下被观察到,但理论上在任何发生断开连接的情况下都可能发生,这发生在连接关闭操作中。
    参考:#3043

sql

  • [sql] [feature]
    Index的合同中稍微放宽了一点,你可以指定一个text()表达式作为目标;如果要手动将索引添加到表中,那么索引不再需要存在绑定表列,可以通过内联声明或通过Table.append_constraint()添加。
    参考:#3028
  • [sql] [feature]
    添加了新标志between.symmetric,当设置为 True 时呈现“BETWEEN SYMMETRIC”。还添加了一个新的否定运算符“notbetween_op”,现在允许像~col.between(x, y)这样的表达式呈现为“col NOT BETWEEN x AND y”,而不是一个带括号的 NOT 字符串。
    参考:#2990
  • [sql] [bug]
    修复了在 INSERT…FROM SELECT 结构中的 bug,在从 UNION 中选择时,会将 UNION 包装在一个匿名(例如未标记)子查询中。
    这个更改也回溯到:0.8.7
    参考:#3044
  • [sql] [bug]
    修复了当应用空的and_()or_()或其他空表达式时,Table.update()Table.delete()会生成空的 WHERE 子句的错误。现在这与select()的行为一致。
    此更改也已回溯到:0.8.7
    参考:#3045
  • [sql] [bug]
    当在表的显式PrimaryKeyConstraint中引用该Column时,Column.nullable标志隐式设置为False。此行为现在与当Column本身的Column.primary_key标志设置为True时的行为相匹配,这意味着这是一个完全等价的情况。
    参考:#3023
  • [sql] [bug]
    修复了Operators.__and__()Operators.__or__()Operators.__invert__()运算符重载方法无法在自定义Comparator实现中被覆盖的错误。
    参考:#3012
  • [sql] [bug]
    修复了新的DialectKWArgs.argument_for()方法中的错误,其中为以前未包含任何特殊参数的构造添加参数将失败。
    参考:#3024
  • [sql] [bug]
    修复了 0.9 版本引入的回归问题,即新的“ORDER BY ”功能从#1068中不会对标签名称应用引用规则,如在 ORDER BY 中呈现的那样。
    参考:#1068, #3020
  • [sql] [bug]
    恢复了Function的导入到sqlalchemy.sql.expression导入命名空间,这在 0.9 版本开始时被移除。

postgresql

  • [postgresql] [feature]
    在使用 pg8000 DBAPI 时,添加了对 AUTOCOMMIT 隔离级别的支持。拉取请求由 Tony Locke 提供。
  • [postgresql] [feature]
    向 PostgreSQL ARRAY 类型添加了一个新标志ARRAY.zero_indexes。当设置为True时,将在传递给数据库之前将所有数组索引值加一,从而在 Python 风格的零基索引和 PostgreSQL 基索引之间实现更好的互操作性。拉取请求由 Alexey Terentev 提供。
    参考:#2785
  • [postgresql] [bug]
    在 PG HSTORE 类型中添加了hashable=False标志,这是为了允许 ORM 在请求混合列/实体列表时跳过尝试对 ORM 映射的 HSTORE 列进行“哈希”操作。补丁由 Gunnlaugur Þór Briem 提供。
    这个更改也被回溯到:0.8.7
    参考:#3053
  • [postgresql] [bug]
    添加了一个新的“断开连接”消息“连接意外关闭”。这似乎与较新版本的 SSL 有关。拉取请求由 Antti Haapala 提供。
    这个更改也被回溯到:0.8.7
  • [postgresql] [bug]
    现在在确定异常是否为“断开连接”错误时会咨询 psycopg2 的.closed访问器;理想情况下,这应该消除对异常消息的任何其他检查以检测断开连接的需要,但我们将保留这些现有消息作为备用。这应该能够处理新的情况,如“SSL EOF”条件。拉取请求由 Dirk Mueller 提供。
    参考:#3021
  • [postgresql] [enhancement]
    向 PostgreSQL 方言添加了一个新类型OID。虽然“oid”通常是 PG 内部的私有类型,在现代版本中不会公开,但在一些 PG 用例中(如大对象支持)可能会公开这些类型,以及在一些用户报告的模式反射用例中可能会公开。
    参考:#3002

mysql

  • [mysql] [bug]
    修复了在索引的mysql_length参数上添加列名时,需要对带引号的名称使用相同的引号才能被识别的错误。修复使引号变为可选,但也为那些使用解决方法的人提供了旧的行为,以便与向后兼容。
    此更改也回溯到:0.8.7
    参考:#3085
  • [mysql] [bug]
    添加了支持,以使用等号包含 KEY_BLOCK_SIZE 的索引来反映表。Pull 请求由 Sean McGivern 提供。
    此更改也回溯到:0.8.7

mssql

  • [mssql] [bug]
    修订了用于确定当前默认模式名称的查询,使用database_principal_id()函数与sys.database_principals视图结合使用,以便我们可以独立于正在进行的登录类型(例如,SQL Server,Windows 等)确定默认模式。
    参考:#3025

测试

  • [tests] [bug] [py3k]
    修正了运行测试时涉及imp模块和 Python 3.3 或更高版本的一些弃用警告。Pull 请求由 Matt Chisholm 提供。
    参考:#2830

杂项

  • [bug] [declarative]
    当访问时,__mapper_args__字典从声明性 mixin 或抽象类中复制,以便声明性本身对此字典所做的修改不会与其他映射发生冲突。该字典在version_id_colpolymorphic_on参数方面进行修改,用本地类/表正式映射到的列替换其中的列。
    此更改也回溯到:0.8.7
    参考:#3062
  • [bug] [ext]
    修复了可变扩展中的错误,其中MutableDict未对setdefault()字典操作报告更改事件。
    此更改也回溯到:0.8.7
    参考:#3051, #3093
  • [bug] [ext]
    修复了MutableDict.setdefault()未返回现有值或新值的错误(此错误未在任何 0.8 版本中发布)。Pull 请求由 Thomas Hervé提供。
    此更改也回溯到:0.8.7
    参考:#3051, #3093
  • [bug] [testsuite]
    在公共测试套件中,从不太受支持的Text改为使用String(40)StringTest.test_literal_backslashes中。Pullreq 由 Jan 提供。
  • [bug] [firebird]
    修复了一个错误,即在绑定参数(只有  firebird 同时具有“limit”渲染为“SELECT FIRST n  ROWS”的情况)中“limit”与列级子查询组合的情况下,“limit”以及“位置”绑定参数(例如 qmark 样式),将错误地在外围  SELECT 之前分配子查询级别的位置,从而返回顺序不正确的参数。
    参考:#3038

0.9.4

发布日期:2014 年 3 月 28 日

general

  • [general] [feature]
    添加了对 pytest  的支持以运行测试。该运行器当前在 nose 之外也得到了支持,并且将来可能会更倾向于使用 pytest。SQLAlchemy 使用的 nose  插件系统已拆分出来,以便它也可以在 pytest 下运行。目前没有计划放弃对 nose  的支持,我们希望测试套件本身可以继续保持尽可能与测试平台无关。有关使用 pytest 运行测试的更新信息,请参阅  README.unittests.rst 文件。
    还增强了测试插件系统,以支持一次针对多个数据库 URL 运行测试,方法是多次指定--db和/或--dburi标志。这不会对每个数据库运行整个测试套件,而是允许特定于某些后端的测试用例在运行测试时使用该后端。当将  pytest 作为测试运行器时,该系统还将多次运行特定的测试套件,每个数据库运行一次,特别是“dialect  suite”中的那些测试。计划增强的系统还将被 Alembic 使用,并允许 Alembic 在一次运行中针对多个后端运行迁移操作测试,包括  Alembic 本身未包含的第三方后端。还鼓励第三方方言和扩展标准化为 SQLAlchemy 的测试套件作为基础;请参阅  README.dialects.rst 文件,了解从 SQLAlchemy 的测试平台构建的背景。
  • [general] [bug]
    调整了setup.py文件,以支持将来可能从 setuptools 中移除setuptools.Feature扩展。如果不存在此关键字,则设置仍将成功使用 setuptools 而不是回退到 distutils。现在还可以通过设置 DISABLE_SQLALCHEMY_CEXT 环境变量来禁用 C 扩展构建。无论 setuptools 是否可用,此变量都起作用。
    此更改还被迁移到了:0.8.6
    参考:#2986
  • [general] [bug]
    修复了一些在 Python 3.4 中发生的测试/功能失败,特别是用于包装“column default”可调用对象的逻辑不会对 Python 内置函数起作用。
    参考:#2979

orm

  • [orm] [feature]
    添加了新参数mapper.confirm_deleted_rows。默认为  True,表示一系列 DELETE 语句应确认游标行数与应匹配的主键数量相匹配;这种行为在大多数情况下已被取消(除非使用  version_id),以支持自引用 ON DELETE CASCADE  的不寻常边缘情况;为了适应这一点,消息现在只是一个警告,而不是异常,并且可以使用该标志指示期望这种自引用级联删除的映射。另请参见#2403以了解原始更改的背景。
    参考:#3007
  • [orm] [功能]
    如果将MapperEvents.before_configured()MapperEvents.after_configured()事件应用于特定的映射器或映射类,则会发出警告,因为这些事件仅对一般级别的Mapper目标调用。
  • [orm] [功能]
    添加了一个新的关键字参数once=Truelisten()listens_for()。这是一个方便的功能,它将包装给定的监听器,以便只调用一次。
  • [orm] [功能]
    添加了一个新选项到relationship.innerjoin,即指定字符串"nested"。当设置为"nested"而不是True时,连接的“链式”将在现有外连接的右侧括号内连接,而不是作为一系列外连接的字符串连接。当 0.9 发布时,这可能应该是默认行为,因为我们在 ORM 中引入了右嵌套连接的功能,但是为了避免进一步的意外,我们目前将其保留为非默认行为。
    另请参见
    右嵌套内连接可用于连接的急加载
    参考:#2976
  • [orm] [错误]
    修复了 ORM 中的一个 bug,即更改对象的主键,然后将其标记为 DELETE 将无法定位正确的 DELETE 行。
    此更改也回溯到:0.8.6
    参考:#3006
  • [orm] [错误]
    修复了从 0.8.3 回归的错误,作为结果#2818,其中Query.exists()不会在仅具有Query.select_from()条目但没有其他实体的查询上工作。
    这个更改也被回溯到:0.8.6
    参考:#2995
  • [orm] [bug]
    改进了一个错误消息,如果对非可选择性(例如literal_column())进行了查询(),然后尝试使用Query.join()使得“左”侧被确定为None,然后失败。现在明确检测到这种情况。
    这个更改也被回溯到:0.8.6
  • [orm] [bug]
    sqlalchemy.orm.interfaces.__all__中删除陈旧的名称,并用当前名称刷新,以便再次从该模块进行import *
    这个更改也被回溯到:0.8.6
    参考:#2975
  • [orm] [bug]
    修复了一个非常古老的行为,其中对于一对多的惰性加载可能不当地拉入父表,并且基于父表中的内容返回不一致的结果,当 primaryjoin 包含针对父表的某种鉴别器时,例如and_(parent.id == child.parent_id, parent.deleted == False)。虽然这种 primaryjoin 对于一对多来说没有太多意义,但当应用于多对一的一侧时略微更常见,并且一对多作为 backref 的结果而出现。在这种情况下加载来自child的行将保持查询中的parent.deleted == False,从而将其拉入 FROM 子句并执行笛卡尔积。新的行为现在将适当地替换本地“parent.deleted”的值为该参数。尽管通常,真实世界的应用程序可能希望在任何情况下都为 o2m 侧使用不同的 primaryjoin。
    参考:#2948
  • [orm] [bug]
    改进了“如何从 A 连接到 B”的检查,以便当一个表具有多个,针对父表的复合外键时,relationship.foreign_keys参数将被正确解释以解决歧义; 以前,当事实上 foreign_keys 参数应该确定哪一个是预期的时,此条件将引发存在多个 FK 路径。
    参考:#2965
  • [orm] [bug]
    添加了对尚未完全记录的 insert=True 标志的支持,以便与 mapper / 实例事件一起使用 listen()
  • [ORM] [bug] [引擎]
    修复了一个 bug,即设置在类级别监听事件(例如在 MapperClassManager 等级上,而不是在单个映射类上,还有在 Connection 上,同时还使用了内部参数转换(在这些类别中大多数情况下)的事件将无法被移除。
    参考:#2973
  • [ORM] [bug]
    修复了从 0.8 版本中的一个回归 bug,即在使用类似 lazyload() 这样的选项与“通配符”表达式,例如 "*",在查询中不包含任何实际实体时会引发断言错误的情况。此断言是为其他情况而设计的,却无意中捕捉到了这种情况。
  • [ORM] [bug] [sqlite]
    对  SQLite 的“连接重写”进行了更多修复;在 0.9.3 版本发布之前实施的修复影响了 UNION  中包含嵌套连接的情况。“连接重写”是一个具有广泛可能性的功能,并且是多年来我们引入的第一个复杂的“SQL  重写”功能,因此我们正在进行许多迭代(就像在 0.2/0.3 系列中的急加载,0.4/0.5 中的多态加载)。我们很快就会完成,感谢您的耐心等待  😃.
    参考:#2969

示例

  • [示例] [bug]
    修复了版本化历史示例中的一个 bug,其中列级的 INSERT 默认值会阻止写入 NULL 的历史值。

引擎

  • [引擎] [功能]
    为方言级事件添加了一些新的事件机制;初始实现允许事件处理程序重新定义任意方言在 DBAPI 游标上调用 execute() 或 executemany() 的具体机制。这些新事件,目前是半公开和实验性的,是为了支持即将推出的一些与事务相关的扩展。
  • [引擎] [功能]
    现在可以将事件监听器与Engine关联,之后一个或多个Connection对象已创建(例如通过 orm Session或通过显式连接),监听器将从这些连接中接收事件。以前,性能问题导致事件传输从Engine仅在初始化时转移到Connection,但我们内联了一堆条件检查,使得这种操作在没有任何额外函数调用的情况下成为可能。
    参考:#2978
  • [engine] [bug]
    Engine在检测到“断开”条件时重新使用连接池的机制进行了重大改进;现在不再丢弃池并显式关闭连接,而是保留池并更新“生成”时间戳以反映当前时间,从而导致在下次检出时重新使用所有现有连接。这极大地简化了回收过程,消除了等待旧池的“唤醒”连接尝试的需要,并消除了在回收操作期间可能创建许多立即丢弃的“池”对象的竞争条件。
    参考:#2985
  • [engine] [bug]
    ConnectionEvents.after_cursor_execute() 事件现在针对Connection的“_cursor_execute()”方法发出;这是用于诸如在 INSERT 语句之前执行序列等快速执行器,以及用于方言启动检查(如 unicode 返回、字符集等)的事件。ConnectionEvents.before_cursor_execute() 事件已在此处调用。此处“executemany”标志现在始终设置为 False,因为此事件始终对应于单个执行。以前,如果我们代表 executemany INSERT 语句执行操作,该标志可能为 True。

sql

  • [sql] [feature]
    增加了对布尔值的文字呈现支持,例如“true” / “false”或“1” / “0”。
  • [sql] [feature]
    添加了一个新功能conv(),其目的是标记约束名称已经应用了命名约定。这个标记将在 Alembic 0.6.4 中被 Alembic 迁移使用,以便在迁移脚本中呈现已经标记为已经应用了命名约定的约束。
  • [sql] [feature]
    为了帮助依赖于向构造添加临时关键字参数的现有方案,已经增强了模式级构造的新方言级关键字参数系统。
    例如,类似Index这样的构造在构建后将再次接受Index.kwargs集合中的临时关键字参数:
idx = Index("a", "b")
idx.kwargs["mysql_someargument"] = True
  • 为了适应允许在构造时使用自定义参数的用例,DialectKWArgs.argument_for()方法现在允许这种注册:
Index.argument_for("mysql", "someargument", False)
idx = Index("a", "b", mysql_someargument=True)
  • 另请参阅
    DialectKWArgs.argument_for()
    参考:#2866#2962
  • [sql] [bug]
    修复了tuple_()构造中的错误,其中实质上第一个 SQL 表达式的“类型”会被应用为与比较的元组值的“比较类型”;在某些情况下,这会导致不恰当的“类型强制转换”发生,例如当一个包含字符串和二进制值混合的元组错误地将目标值强制转换为二进制,即使左侧并不是二进制。tuple_()现在期望其值列表中存在异构类型。
    这个更改也被回溯到:0.8.6
    参考:#2977
  • [sql] [bug]
    修复了 0.9 中的一个回归问题,即未能正确反映的Table不会从父MetaData中移除,即使处于无效状态。感谢 Roman Podoliaka 的 Pullreq。
    参考:#2988
  • [sql] [bug]
    MetaData.naming_convention 功能现在也将应用于直接与Column关联的CheckConstraint对象,而不仅仅是Table上的。
  • [sql] [bug]
    修复了新的MetaData.naming_convention功能中的错误,其中使用“%(constraint_name)s”标记的检查约束的名称会在布尔或枚举类型生成的约束中重复,而整体重复事件会导致“%(constraint_name)s”标记不断累积。
    参考:#2991
  • [sql] [bug]
    调整了将名称应用于 .c 集合时的逻辑,当接收到无名称的BindParameter时,例如通过literal()或类似方式;绑定参数的“key”被用作 .c 中的键,而不是渲染名称。由于这些绑定在任何情况下都具有“匿名”名称,这允许单独的绑定参数在可选择的情况下具有自己的名称,如果它们没有被标记。
    参考:#2974
  • [sql] [bug]
    FromClause.c集合的行为进行了一些更改,当遇到重复的列时。发出警告并替换具有相同名称的旧列的行为仍然在某种程度上保留;特别是替换是为了保持向后兼容性。但是,替换的列现在仍然与c集合关联在一起,现在在集合._all_columns中(用于处理诸如别名和联合之类的结构中的c列集合中的列集合),以更多地处理c中的列列表而不是唯一的键名称集合。这有助于处理在联合等情况下使用具有相同命名列的 SELECT 语句的情况,以便联合可以按位置匹配列,并且在这里仍然有一些机会使用FromClause.corresponding_column()(它现在可以返回仅在  selectable.c._all_columns  中而不以其他方式命名的列)。新集合是有下划线的,因为我们仍然需要决定这个列表最终可能会到哪里。从理论上讲,它将成为  iter(selectable.c)的结果,但是这意味着迭代的长度将不再与 keys()的长度匹配,需要检查该行为。
    参考:#2974
  • [sql] [bug]
    修复了新的TextClause.columns()方法中的问题,其中给定位置的列的顺序不会被保留。这可能会在诸如将生成的TextAsFrom对象应用于联合等位置情况下产生潜在影响。

postgresql

  • [postgresql] [feature]
    为 psycopg2 DBAPI 启用了“理智的多行计数”检查,因为截至 psycopg2 2.0.9 似乎支持这一点。
    此更改还被回溯到:0.8.6
  • [postgresql] [bug]
    由版本  0.8.5 / 0.9.3 的兼容性增强引起的回归错误已修复,在只针对 8.1、8.2 系列的 PostgreSQL  版本上反射索引时再次出现了问题,涉及到永远问题的 int2vector 类型。虽然 int2vector 从 8.1  开始支持数组操作,但显然它从 8.3 开始只支持 CAST 到 varchar。
    此更改还被回溯到:0.8.6
    参考:#3000

mysql

  • [mysql] [bug]
    调整了 mysql-connector-python 的设置;在 Py2K 中,“supports unicode statements”标志现在为 False,因此 SQLAlchemy 将在发送到数据库之前将SQL 字符串(注意:不是参数)编码为字节。这似乎允许 mysql-connector 的所有与 Unicode 相关的测试通过,包括那些使用非 ASCII 表/列名称以及使用 unicode 在 cursor.executemany()下的 TEXT 类型的一些测试。

oracle

  • [oracle] [feature]
    在 cx_Oracle 方言中添加了一个新的引擎选项 coerce_to_unicode=True,这恢复了在 Python 2 中 cx_Oracle 输出类型处理方法到 Python Unicode 转换的方式,该方法在 0.9.2 中因 #2911 被移除。一些使用情况可能会希望对所有字符串值进行 unicode 强制转换,尽管存在性能问题。补丁由 Christoph Zwerschke 提供。
    引用:#2911
  • [oracle] [bug]
    添加了新的数据类型 DATE,它是 DateTime 的子类。由于 Oracle 没有“datetime”类型,而只有 DATE,因此在 Oracle 方言中,DATE 类型作为 DateTime 的实例是合适的。这个问题并不改变类型的行为,因为数据转换无论如何都是由 DBAPI 处理的,但改进的子类布局将有助于跨数据库兼容性的检查类型的使用情况。此外,从 Oracle 方言中删除了大写的 DATETIME,因为这种类型在该上下文中无法使用。
    引用:#2987

测试

  • [测试] [bug]
    修复了一些在 Py3.2 中会导致测试失败的 errant u'' 字符串。补丁由 Arfrever Frehtes Taifersar Arahesis 提供。
    引用:#2980

杂项

  • [bug] [ext]
    修复了 mutable extension 和 flag_modified() 中的一个 bug,即如果属性被重新分配为自身,则更改事件将不会传播。
    这个变更也被回溯到:0.8.6
    引用:#2997
  • [bug] [automap] [ext]
    为 automap 添加了对两个处于联合继承关系的类之间不应创建关系的支持,用于将子类链接回父类的那些外键。
    引用:#3004
  • [bug] [池]
    修复了 SingletonThreadPool 中的一个小问题,即在“清理”过程中可能会无意间清除要返回的当前连接。补丁由 jd23 提供。
  • [bug] [扩展] [py3k]
    修复了关联代理中的一个 bug,在 Py3k 上,分配一个空切片(例如 x[:] = [...])将会失败。
  • [bug] [ext]
    修复了关联代理中由#2810引起的回归问题,该问题导致当从不存在的目标中获取标量值时,用户提供的“getter”不再接收None值。此更改引入的 None 检查现在已移至默认 getter 中,因此用户提供的 getter 也将再次接收到 None 值。
    参考:#2810

0.9.3

发布日期:2014 年 2 月 19 日

orm

  • [orm] [feature]
    添加了新的MapperEvents.before_configured()事件,允许在configure_mappers()开始时触发事件,以及在声明式中配合__declare_last__()__declare_first__()钩子。
  • [orm] [bug]
    修复了当Query.get()在具有现有条件的查询上调用时,如果给定的标识已经存在于标识映射中,则无法始终引发InvalidRequestError的错误的 bug。
    这个变更也被回移到了:0.8.5
    参考:#2951
  • [orm] [bug] [sqlite]
    修复了  SQLite “join rewriting” 中的一个 bug,即使用 exists() 构造时无法正确重写的问题,例如,当 exists  被映射到一个复杂的嵌套连接场景中的 column_property 时。还修复了一个有些相关的问题,即当目标是别名表而不是单独的别名列时,如果  SELECT 语句的 columns 子句的目标是别名表,则连接重写将在失败。
    参考:#2967
  • [orm] [bug]
    修复了一个 0.9 版本的回归问题,即应用于基类(例如使用了传播标志的声明式基类)的 ORM 实例或映射器事件将无法应用于还使用了继承的现有映射类的情况,因为存在一个断言。另外,修复了在移除这种事件时可能出现的属性错误,具体取决于首次分配的方式。
    参考:#2949
  • [orm] [bug]
    改进了复合属性的初始化逻辑,使得调用MyClass.attribute不再需要配置映射器步骤,例如,它将在不抛出任何错误的情况下正常工作。
    参考:#2935
  • [orm] [bug]
    更多关于[ticket:2932]的问题首次在 0.9.2 中解决,其中使用形式为_的列键与文本中的别名列仍然不匹配,这最终是由于核心列匹配问题。已添加额外规则,以便在使用TextAsFrom构造或文字列时考虑列_label
    参考:#2932

orm 声明性

  • [orm] [declarative] [bug]
    修复了一个 bug,AbstractConcreteBase在声明性关系配置中无法完全使用,因为其字符串类名在映射器配置时不可用。该类现在明确将自己添加到类注册表中,并且AbstractConcreteBase以及ConcreteBase在映射器配置之前之前设置自己,在configure_mappers()设置中,使用新的MapperEvents.before_configured()事件。
    参考:#2950

examples

  • [examples] [feature]
    在版本化行示例中添加了可选的“changed”列,以及当版本化的Table具有显式的Table.schema参数时的支持。感谢 jplaverdure 的拉取请求。

engine

  • [engine] [bug] [pool]
    修复了由#2880引起的关键回归,其中新的并发能力从池中返回连接意味着“first_connect”事件现在也不再同步,从而在即使是最小并发情况下也导致方言配置错误。
    此更改也回溯到:0.8.5
    参考:#2880#2964

sql

  • [sql] [bug]
    修复了调用Insert.values()时使用空列表或元组会引发 IndexError 的 bug。现在它会产生一个空的插入构造,就像使用空字典的情况一样。
    此更改也回溯到:0.8.5
    参考:#2944
  • [sql] [bug]
    修复了如果错误地传递了包含__getitem __()方法的列表达式的比较器的ColumnOperators.in_()会进入无限循环的错误,例如使用ARRAY类型的列。
    此更改也已经反向移植到:0.8.5
    参考:#2957
  • [sql] [bug]
    修复了新“命名约定”功能中的回归,如果外键中的引用表包含模式名称,则约定会失败。Pull request 来自 Thomas Farvour。
  • [sql] [bug]
    修复了所谓的“字面渲染”bindparam()构造的 bug,如果绑定是用可调用的方式构造而不是直接值,则会失败。这阻止了使用“literal_binds”编译器标志渲染 ORM 表达式。

postgresql

  • [postgresql] [feature]
    ARRAY类型上添加了TypeEngine.python_type的便利访问器。Pull request 来自 Alexey Terentev。
  • [postgresql] [bug]
    向 psycopg2 断开连接检测添加了一个额外的消息,“无法将数据发送到服务器”,这补充了现有的“无法从服务器接收数据”,并已被用户观察到。
    此更改也已经反向移植到:0.8.5
    参考:#2936
  • [postgresql] [bug]

对于非常旧的(8.1 之前)版本的 PostgreSQL 以及可能的其他 PG 引擎(假设 Redshift 报告版本小于  8.1),已改进了对 PostgreSQL 反射行为的支持。  “索引”和“主键”的查询依赖于检查所谓的“int2vector”数据类型,该数据类型在 8.1  之前的版本中拒绝转换为数组,导致查询中使用的“ANY()”运算符失败。通过广泛的搜索找到了非常巧妙但由 PG  核心开发人员推荐使用的查询,用于在使用 PG 版本<8.1 时,索引和主键约束反射现在可以在这些版本上工作。

  • 此更改也已经反向移植到:0.8.5
  • [postgresql] [bug]
    修正了这个非常老的问题,其中  PostgreSQL 的“获取主键”反射查询已更新以考虑已重命名的主键约束;新的查询在旧版本的 PostgreSQL 上失败,如版本  7,因此在检测到 server_version_info <(8, 0)的情况下,在这些情况下恢复旧的查询。
    此更改也已经反向移植到:0.8.5
    参考:#2291
  • [postgresql] [错误]
    在新添加的方言启动查询中添加了服务器版本检测,用于“show standard_conforming_strings”; 由于此变量是从 PG 8.2 开始添加的,我们会跳过对报告早于该版本的 PG 版本的查询。
    参考:#2946

mysql

  • [mysql] [功能]
    添加了新的 MySQL-specific DATETIME,其中包括分数秒支持;还为 TIMESTAMP 添加了分数秒支持。 DBAPI 支持有限,尽管 MySQL Connector/Python 已知支持分数秒。 补丁由 Geert JM Vanderkelen 提供。
    此更改也回溯到:0.8.5
    参考:#2941
  • [mysql] [错误]
    添加了对 PARTITION BYPARTITIONS MySQL 表关键字的支持,指定为 mysql_partition_by='value'mysql_partitions='value'Table。 拉取请求由 Marcus McCurdy 提供。
    此更改也回溯到:0.8.5
    参考:#2966
  • [mysql] [错误]
    修复了一个  bug,该 bug 阻止了基于 MySQLdb 的方言(例如 pymysql)在 Py3K 中工作,因为“connection  charset”的检查会由于 Py3K 更严格的值比较规则而失败。 在任何情况下,该调用都没有考虑数据库版本,因为服务器版本在那时仍然为  None,因此该方法已经简化为依赖于 connection.character_set_name()。
    此更改也回溯到:0.8.5
    参考:#2933
  • [mysql] [错误] [cymysql]
    修复了 cymysql 方言中的一个 bug,其中类似 '33a-MariaDB' 的版本字符串无法正确解析。 拉取请求由 Matt Schmidt 提供。
    参考:#2934

sqlite

  • [sqlite] [错误]
    SQLite 方言现在在反射类型时会跳过不支持的参数;例如,如果遇到类似 INTEGER(5) 的字符串,将实例化 INTEGER 类型时不包括“5”,基于在第一次尝试时检测到 TypeError
  • [sqlite] [错误]
    已向 SQLite 类型反射添加了对完全支持“类型亲和性”契约的支持,该契约在 www.sqlite.org/datatype3.html 中指定。 在此方案中,类型名称中的关键字如 INTCHARBLOBREAL 通常将类型与五种亲和性之一关联起来。 拉取请求由 Erich Blume 提供。
    另请参阅
    类型反射

杂项

  • [bug] [ext]
    修复了当类在单个或潜在的联合继承模式中预先排列时,新的自动映射扩展的 AutomapBase 类会失败的 bug。修复的联合继承问题也可能适用于使用 DeferredReflection 时。

0.9.2

发布日期:2014 年 2 月 2 日

orm

  • [orm] [feature]
    添加了一个新的参数 Operators.op.is_comparison。此标志允许将来自 Operators.op() 的自定义操作视为“比较”操作符,因此可用于自定义 relationship.primaryjoin 条件。
    另见
    在连接条件中使用自定义操作符
  • [orm] [feature]
    对于以 join() 构造作为 relationship.secondary 目标以创建非常复杂的 relationship() 连接条件的目的,支持得到了改善。此更改包括查询连接、连接的及时加载以不生成 SELECT 子查询、延迟加载的更改以使“secondary”目标正确包含在 SELECT 中,以及声明性的更改以更好地支持将 join() 对象与类作为目标的指定。
    新的用例有些实验性,但已添加了一个新的文档部分。
    另见
    组合“Secondary”连接
  • [orm] [bug]
    修复了当将迭代器对象传递给 class_mapper() 或类似函数时的错误消息,其中错误会在字符串格式化时失败的 bug。来自 Kyle Stark 的 Pullreq。
    此更改还被 回溯 到:0.8.5
  • [orm] [bug]
    修复了新的TextAsFrom构造中的错误,在此构造中,Column-定向行查找未能与TextAsFrom生成的临时ColumnClause对象匹配,因此不能在Query.from_statement()中使用。还修复了Query.from_statement()的机制,以免误将TextAsFrom误认为是Select构造。该错误也是 0.9 的退化,因为调用了TextClause.columns()方法以适应text.typemap参数。
    参考:#2932
  • [orm] [bug]
    在属性“set”操作的范围内添加了一个新的指令,用于禁用自动刷新,在属性需要延迟加载“旧”值的情况下使用,例如在替换一对一值或某些类型的一对多值时。否则,在属性为 None 时会发生刷新,并可能导致 NULL 违规。
    参考:#2921
  • [orm] [bug]
    修复了一个 0.9 退化,即当由Query自动应用别名时,以及在其他情况下选择或连接被别名化时(例如联接表继承),如果在表达式中使用了用户定义的Column子类,则可能失败。在这种情况下,子类将无法传播 ORM 特定的“注解”,而这些注解对适应是必需的。已根据这种情况纠正了“表达式注解”系统。
    参考:#2918
  • [orm] [bug]
    修复了一个 bug,涉及与新的扁平化 JOIN 结构一起使用的joinedload()(从而导致连接式贪婪加载的回归)以及与flat=True标志和连接表继承一起使用的aliased();基本上,通过不同路径跨越“父 JOIN 子”实体进行多个连接以到达目标类的情况下,不会形成正确的 ON 条件。 在处理一个别名的,连接继承类的“左侧”加入的机制中进行的调整/简化修复了该问题。
    参考: #2908

示例

  • [示例] [错误修复]
    在“history_meta”示例中添加了一个调整,其中对于关系绑定属性上的“history”检查如果关系未加载,则不再发出任何 SQL。

引擎

  • [引擎] [功能] [池]
    添加了一个新的池事件PoolEvents.invalidate()。 当要将 DBAPI 连接标记为“无效”并从池中丢弃时调用。

sql

  • [sql] [功能]
    添加了 MetaData.reflect.dialect_kwargs 以支持对所有Table对象进行反射的方言级反射选项。
  • [sql] [功能]
    添加了一个新功能,允许将自动命名约定应用于ConstraintIndex对象。 基于 wiki 中的一个配方,新功能使用模式事件来设置各个模式对象关联时的名称。 然后,事件通过一个新的参数MetaData.naming_convention暴露了一个配置系统。 该系统允许在每个MetaData基础上生成简单和自定义的约束和索引命名方案。
    另请参阅
    配置约束命名约定
    参考: #2923
  • [sql] [功能]
    现在可以在不涉及表中的列规范的情况下独立于primary_key=True标志指定PrimaryKeyConstraint对象上的选项;使用一个不包含列的PrimaryKeyConstraint对象来实现此结果。
    之前,显式的PrimaryKeyConstraint会导致那些标记为primary_key=True的列被忽略;由于现在不再是这样,PrimaryKeyConstraint现在将确保使用一种风格或另一种风格来指定列,或者如果两者都存在,则列列表完全匹配。如果在PrimaryKeyConstraint中存在不一致的列集,并且在Table内标记为primary_key=True的列,则会发出警告,并且列的列表仅来自先前发布中的PrimaryKeyConstraint本身,就像以前的情况一样。
    另请参阅
    PrimaryKeyConstraint
    参考:#2910
  • [sql] [特性]
    架构构造和某些 SQL 构造接受方言特定关键字参数的系统已得到加强。该系统通常包括TableIndex构造,它们接受各种各样的方言特定参数,如mysql_enginepostgresql_where,以及构造PrimaryKeyConstraintUniqueConstraintUpdateInsertDelete,并且还新增了对ForeignKeyConstraintForeignKey的关键字参数能力。变化在于参与的方言现在可以指定这些构造的可接受参数列表,允许在为特定方言指定无效关键字时引发参数错误。如果关键字的方言部分未被识别,仅发出警告;虽然系统实际上将使用  setuptools  入口点来定位非本地方言,但在某些方言特定参数在未安装第三方方言的环境中使用的用例仍然受支持。方言还必须显式地选择加入此系统,以便未使用此系统的外部方言不受影响。
    参考:#2866
  • [sql] [bug]
    Table.tometadata() 方法的行为已经调整,使得ForeignKey 的模式目标不会改变,除非该模式与父表的模式匹配。也就是说,如果一个表“schema_a.user”有一个指向“schema_b.order.id”的外键,无论是否将“schema”参数传递给Table.tometadata(),都将保持“schema_b”目标不变。然而,如果一个表“schema_a.user”引用“schema_a.order.id”,则“schema_a”  的存在将在父表和被引用的表上更新。这是一个行为变更,因此不太可能被回溯到 0.8 版本;假设以前的行为相当错误,而且很少有人依赖它。
    另外,新增了一个参数Table.tometadata.referred_schema_fn。这是指一个可调用函数,用于确定在 tometadata 操作中遇到的任何ForeignKeyConstraint 的新被引用模式。这个可调用函数可以用于恢复到以前的行为或自定义如何处理每个约束的被引用模式。
    参考:#2913
  • [sql] [bug]
    修复了一个 bug,即在某些情况下,如果与“test”方言一起使用二进制类型,例如 DefaultDialect 或其他没有 DBAPI 的方言,二进制类型会失败。
  • [sql] [bug] [py3k]
    修复了“literal binds”无法与绑定参数为二进制类型的 bug。0.8 版本中修复了一个类似但不同的问题。
  • [sql] [bug]
    修复了回归问题,即 ORM 使用的“注释”系统泄漏到sqlalchemy.sql.functions 中标准函数的名称中,例如func.coalesce()func.max()。在 ORM 属性中使用这些函数,从而生成它们的带注释版本,可能会破坏在 SQL 中呈现的实际函数名称。
    参考:#2927
  • [sql] [bug]
    修复了 0.9 版本中的回归问题,即RowProxy 的新可排序支持在与非元组类型进行比较时会导致TypeError,因为它试图无条件地应用 tuple()到“other”对象。现在在RowProxy 上实现了完整的 Python 比较运算符范围,使用一种保证等效于元组的比较系统的方法,只有在“other”对象是 RowProxy 的实例时才会强制转换该对象。
    参考:#2848, #2924
  • [sql] [bug]
    在没有列的 Table 内联创建的 UniqueConstraint 将被跳过。感谢 Derek Harland 提供了 Pullreq。
  • [sql] [bug] [orm]
    修复了多表“UPDATE…FROM”构造,在 MySQL 上可用,以正确渲染 SET 子句中跨表具有相同名称的多列。这还更改了仅针对非主表的 SET 子句中使用的绑定参数的名称为“_”;由于此参数通常是直接使用 Column 对象指定的,这不应对应用程序产生影响。该修复对 ORM 中的 Table.update()Query.update() 均生效。
    引用:#2912

schema

  • [schema] [bug]
    sqlalchemy.schema.SchemaVisitor 恢复到 .schema 模块中。感谢 Sean Dague 提供了 Pullreq。

postgresql

  • [postgresql] [feature]
    添加了一个新的方言级参数 postgresql_ignore_search_path;此参数被 Table 构造函数和 MetaData.reflect() 方法接受。在对 PostgreSQL 使用时,指定了远程模式名称的外键引用表将保留该模式名称,即使该名称存在于 search_path 中;自 0.7.3 版以来的默认行为是,search_path 中存在的模式不会复制到反射的 ForeignKey 对象中。文档已更新以详细描述 pg_get_constraintdef() 函数的行为,以及 postgresql_ignore_search_path 功能如何确定我们是否将遵守此函数报告的模式限定。
    另请参阅
    远程模式表内省和 PostgreSQL search_path
    引用:#2922

mysql

  • [mysql] [bug]
    为 cymysql 方言添加了一些缺失的方法,包括 _get_server_version_info() 和 _detect_charset()。感谢 Hajime Nakagami 提供了 Pullreq。
    此更改也被回溯到:0.8.5
  • [mysql] [bug] [sql]
    为所谓的 SQL 类型“向下适应”添加了新的测试覆盖,其中更具体的类型被适应为更通用的类型 - 这种用例被一些第三方工具(如sqlacodegen)所需。在此测试套件中需要修复的特定情况包括将ENUM降级为Enum,以及将 SQLite 日期类型转换为通用日期类型。adapt()方法在这里需要变得更具体,以抵消在 0.9 中删除的基本TypeEngine类上的“捕获所有”**kwargs集合的移除。
    参考:#2917
  • [mysql] [bug]
    现在 MySQL CAST 编译考虑了字符串类型的“字符集”和“排序”。虽然 MySQL 希望所有基于字符的 CAST 调用都使用 CHAR 类型,但我们现在在 CAST 时创建一个真正的 CHAR 对象,并复制它具有的所有参数,因此像cast(x, mysql.TEXT(charset='utf8'))这样的表达式将呈现为CAST(t.col AS CHAR CHARACTER SET utf8)
  • [mysql] [bug]
    对  MySQL 方言和默认方言系统整体添加了新的“unicode 返回”检测,以便任何方言都可以在首次连接时添加额外的“测试”来检测 DBAPI  是否直接返回  unicode。在这种情况下,我们特别针对“utf8”编码添加了一个检查,使用显式的“utf8_bin”排序类型(在检查此排序是否可用后),以测试观察到的  MySQLdb 版本 1.2.3 存在的一些错误的 unicode 行为。虽然 MySQLdb 在 1.2.4  中已解决了此问题,但此处的检查应该防止出现退化。此更改还允许“unicode”检查记录在引擎日志中,这以前是不可能的。
    参考:#2906
  • [mysql] [bug] [engine] [pool]
    Connection 现在将一个新的 RootTransactionTwoPhaseTransaction 与其直接的 _ConnectionFairy 关联为该事务的“重置处理程序”,在该事务的范围内接管调用 commit() 或 rollback()  以实现“返回时重置”的行为,如果事务未被完成。这解决了当连接在没有显式回滚或提交的情况下关闭时,像 MySQL  两阶段那样挑剔的事务将被正确关闭的问题(例如,在此情况下不再引发“XAER_RMFAIL” -  请注意,此异常仅在日志中显示,因为异常未在池重置中传播)。例如,当使用设置了 twophase 的 orm Session,然后在没有显式回滚或提交的情况下调用 Session.close() 时,将出现此问题。此更改还具有效果,即在非自动提交模式下使用 Session 对象时,无论如何丢弃该会话,您现在都将在日志中看到明确的“ROLLBACK”。感谢 Jeff Dairiki 和 Laurence Rowe 在此处隔离问题。
    参考:#2907

sqlite

  • [sqlite] [bug]
    修复了 SQLite 编译器未能将编译器参数(如“literal binds”)传播到 CAST 表达式中的 bug。

mssql

  • [mssql] [feature]
    UniqueConstraintPrimaryKeyConstraint构造中添加了一个选项mssql_clustered;在 SQL Server 上,这将在 DDL 中的约束构造中添加CLUSTERED关键字。感谢 Derek Harland 提交的 Pullreq。

oracle

  • [oracle] [bug]
    已经观察到,在 Python 2.xx 中使用 cx_Oracle 的“outputtypehandler”来将字符串值强制转换为 Unicode 是非常昂贵的;即使 cx_Oracle 是用 C 编写的,当你将 Python unicode 原语传递给 cursor.var() 并与输出处理程序关联时,该库会将每次转换都计为 Python 函数调用,并记录所有必要的开销;尽管在  Python 3 中运行时,所有字符串也都被无条件地转换为 Unicode,但它不会产生这种开销,这意味着 cx_Oracle 在 Py2K  中未能使用高效的技术。由于 SQLAlchemy  不能轻松地针对每列选择此类类型处理程序,因此处理程序被无条件地组装,从而将开销添加到所有字符串访问中。
    因此,这个逻辑已经被  SQLAlchemy 自己的 Unicode 转换系统取代,在 Py2K 中仅对请求为 Unicode 的列生效。当使用 C  扩展时,SQLAlchemy 的系统似乎比 cx_Oracle 的系统快 2-3 倍。此外,SQLAlchemy 的 Unicode  转换已经得到增强,以便在需要“条件”转换器(现在在 Oracle 后端需要)时,在 C 中执行“已经是  Unicode”的检查,不再引入显着的开销。
    这个变化对 cx_Oracle 后端有两个影响。一个是在 Py2K 中,未明确请求 Unicode 类型或 convert_unicode=True 的字符串值现在将返回str,而不是unicode - 这种行为类似于诸如 MySQL 的后端。此外,当使用 cx_Oracle 后端请求 Unicode 值时,如果未使用 C  扩展,现在每列都有一个 isinstance() 检查的额外开销。这种权衡已经被做出,因为可以解决它,并且不再对可能是非 Unicode  字符串的大多数 Oracle 结果列施加性能负担。
    参考:#2911

misc

  • [bug] [pool]
    PoolEvents.reset() 事件的参数名已更改为 dbapi_connectionconnection_record,以保持与所有其他池事件的一致性。预计任何现有的侦听器都在任何情况下都使用位置样式来接收参数。
  • [bug] [cextensions] [py3k]
    修复了在 Py3K 中 C 扩展使用错误的 API 来指定顶级模块函数的问题,这在 Python 3.4b2 中会出错。Py3.4b2 将 PyMODINIT_FUNC 更改为返回“void”而不是PyObject *,因此现在我们确保直接使用“PyMODINIT_FUNC”而不是PyObject *。拉取请求由 cgohlke 提供。


SqlAlchemy 2.0 中文文档(六十四)(2)https://developer.aliyun.com/article/1560872

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十四)(3)
SqlAlchemy 2.0 中文文档(六十四)
29 0
|
3月前
|
SQL JSON 关系型数据库
SqlAlchemy 2.0 中文文档(五十二)(3)
SqlAlchemy 2.0 中文文档(五十二)
26 0
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十四)(2)
SqlAlchemy 2.0 中文文档(六十四)
21 0
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十四)(4)
SqlAlchemy 2.0 中文文档(六十四)
27 0
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十四)(5)
SqlAlchemy 2.0 中文文档(六十四)
21 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十三)(3)
SqlAlchemy 2.0 中文文档(六十三)
21 0
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十三)(4)
SqlAlchemy 2.0 中文文档(六十三)
109 0
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十三)(1)
SqlAlchemy 2.0 中文文档(六十三)
17 0
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十三)(2)
SqlAlchemy 2.0 中文文档(六十三)
22 0
|
3月前
|
SQL 关系型数据库 MySQL
SqlAlchemy 2.0 中文文档(六十三)(5)
SqlAlchemy 2.0 中文文档(六十三)
23 0