0.7 更新日志
0.7.11
没有发布日期
orm
- [orm] [bug]
修复了一个错误,列表操作会无法正确表示[0:0]
的切片,尤其是在使用关联代理时可能发生。由于 Python 集合的一些怪癖,该问题在 Python 3 中更有可能发生而不是在 Python 2 中。
参考:#2807 - [orm] [bug]
修复了一个错误,当查询形式为:query(SubClass).options(subqueryload(Baseclass.attrname))
,其中SubClass
是BaseClass
的联接继承时,会在属性加载时未能在子查询中应用JOIN
,从而产生笛卡尔积。生成的结果仍然往往是正确的,因为额外的行只是被忽略,所以这个问题可能存在于其它方面正常工作的应用中作为性能下降。
参考:#2699 - [orm] [bug]
修复了工作单元中的错误,即如果两个表之间没有设置 ForeignKey 约束,则联接继承子类可能会在父表之前插入“子”表的行。
参考:#2689 - [orm] [bug]
改进了当检测到“backref 循环”时发出的错误消息,即当属性事件触发两个其他属性之间的双向赋值时。这种情况不仅会在分配错误类型的对象时发生,还会在属性被错误配置为 backref 到现有 backref 对时发生。
参考:#2674 - [orm] [bug]
当将 MapperProperty 分配给替换现有属性的映射器时,如果涉及的属性不是基于普通列的属性,则会发出警告。很少(或者从来没有?)有人打算替换关系属性,通常是指映射器错误配置。如果在继承关系中 backref 配置在现有的 backref 上(在 0.8 中是错误的),也会发出警告。
参考:#2674
engine
- [engine] [bug]
make_url()
函数使用的正则表达式现在可以解析 ipv6 地址,例如用方括号括起来。
参考:#2851
sql
- [sql] [bug]
修复了自 0.7.9 起存在的回归,即如果在多个 FROM 子句中引用了 CTE 的名称,则可能未正确引用该名称。
参考:#2801 - [sql] [bug] [cte]
修复了公共表达式系统中的错误,如果 CTE 仅用作alias()
构造,则不会使用 WITH 关键字进行渲染。
参考:#2783 - [sql] [bug]
修复了CheckConstraint
DDL 中的 bug,其中来自Column
对象的“quote”标志不会传播。
参考:#2784
postgresql
- [postgresql] [feature]
增加了对 PostgreSQL 传统 SUBSTRING 函数语法的支持,当使用常规的func.substring()
时,呈现为“SUBSTRING(x FROM y FOR z)”。感谢 Gunnlaugur Þór Briem。
参考:#2676
mysql
- [mysql] [bug]
更新 MySQL 5.5、5.6 版本的保留字,感谢 Hanno Schlichting。
参考:#2791
测试
- [tests] [bug]
修复了在某些 Linux 平台上无法在 test_execute 中导入“logging”的问题。
参考:#2669,pull request 41
0.7.10
发布日期:2013 年 2 月 7 日 星期四
orm
- [orm] [bug]
修复了潜在的内存泄漏问题,如果创建了任意数量的sessionmaker
对象。当解除引用时,sessionmaker 创建的匿名子类由于事件包中保留的类级引用而无法被垃圾回收。这个问题也适用于任何与事件调度程序一起使用临时子类的自定义系统。
参考:#2650 - [orm] [bug]
Query.merge_result()
现在可以从外连接加载行,其中一个实体可能为None
而不会抛出错误。
参考:#2640 - [orm] [bug]
MutableComposite
类型不允许使用MutableBase.coerce()
方法,尽管代码似乎表明了这个意图,所以现在可以使用,并添加了一个简短的示例。作为副作用,此事件处理程序的机制已更改,以便新的MutableComposite
类型不再添加每种类型的全局事件处理程序。也适用于 0.8.0b2 版本。
参考:#2624 - [orm] [bug]
修复了 Session 计算错误的 bug,替换已删除对象在身份映射中的另一个具有相同主键的对象会在 rollback()时引发“冲突状态”错误,如果被替换的主键是通过非工作单位建立的 INSERT 语句或通过另一个实例的主键切换来建立的。
参考:#2583
engine
- [engine] [bug]
修复了MetaData.reflect()
在正确使用给定的Connection
时不会打开第二个连接的错误,如果给定的话。
参考:#2604
sql
- [sql] [bug]
将__repr__
调整为TypeDecorator
的调整反向移植到 0.7,允许PickleType
生成干净的repr()
以帮助 Alembic。
参考:#2584, #2594 - [sql] [bug]
修复了Table.tometadata()
的错误,如果Column
同时具有外键和替代的“.key”名称,则会失败。
参考:#2643 - [sql] [bug]
修复了在没有传递“for_update=True”标志的情况下使用 server_onupdate=时会将默认对象应用于 server_default 的错误,从而清除了那里的任何内容。不应该使用显式的 for_update=True 参数来进行此使用(特别是因为文档显示了一个不使用该参数的示例),因此现在如果该标志未设置为对应于该参数的内容,则会内部使用给定默认对象的副本。
参考:#2631 - [sql] [gae] [mysql]
在gaerdbms
方言中添加了条件导入,尝试导入 rdbms_apiproxy 和 rdbms_googleapi 以在开发和生产平台上工作。现在还支持instance
属性。感谢 Sean Lynch 的贡献。还将增强功能反向移植,允许用户名/密码,并修复了从 0.8 开始的错误代码解释。
参考:#2649
mysql
- [mysql] [feature]
在 OurSQL 方言中添加了“raise_on_warnings”标志。
参考:#2523 - [mysql] [feature]
在 MySQLdb 方言中添加了“read_timeout”标志。
参考:#2554
sqlite
- [sqlite] [bug]
针对这个与 SQLite 相关的问题作了更多调整,该问题已在 0.7.9 中发布,以拦截反映外键时的旧 SQLite 引用字符。除了拦截双引号之外,现在还拦截其他引用字符,如括号、反引号和单引号。
参考:#2568
mssql
- [mssql] [bug]
修复了一个错误,即在与“schema”结合使用 Column 的“key”时,对于拥有表的“schema”会由于 MSSQL 方言的“schema 渲染”逻辑未考虑 .key 而无法定位结果行的错误。 - [mssql] [bug]
在 mssql 信息模式中,增加了 Py3K 条件,围绕不必要的 .decode() 调用,修复了 Py3k 中反射的问题。
参考:#2638
oracle
- [oracle] [bug]
Oracle LONG 类型,虽然是一个无界文本类型,但在返回结果行时似乎不使用 cx_Oracle.LOB 类型,因此方言已修复,以排除 LONG 从中获得 cx_Oracle.LOB 过滤的情况。
参考:#2620 - [oracle] [bug]
修复了在与 cx_Oracle 结合使用.prepare()
时的用法,以便当返回值为False
时,不会调用connection.commit()
,从而避免“无事务”错误。已经证明了 SQLAlchemy 和 cx_oracle 与两阶段事务一起以基本方式工作,但受到与驱动程序观察到的警告的限制;请查看文档了解详情。
参考:#2611 - [oracle] [bug]
更改了从 setinputsizes() 步骤中排除的 cx_oracle 类型列表,现在只包括 STRING 和 UNICODE;CLOB 和 NCLOB 已移除。这是为了解决 cx_oracle 对 executemany() 调用的行为问题。在 0.8 中,相同的更改也适用,但也可以通过 exclude_setinputsizes 参数进行配置。
参考:#2561
0.7.9
发布日期:Mon Oct 01 2012
orm
- [orm] [bug]
修复了一个主要局限于新 AbstractConcreteBase 助手的错误,其中来自超类的“type”属性不会被子类覆盖,从而产生“保留给基类”的错误消息,而是在那里放置一个无操作属性。这与使用 ConcreteBase 以及所有经典的具体映射行为不一致,在这些行为中,多态基类的“type”列会在子类上明确禁用,除非显式覆盖。 - [orm] [bug]
当 lazy=’dynamic’ 与 uselist=False 结合时,会发出警告。这在 0.8 中会引发异常。 - [orm] [bug]
修复了一个错误,即相关对象赋值中的用户错误可能导致递归溢出,如果赋值触发与错误类上的双向属性同名的 backref 到相同的目标。现在会引发一个信息性错误。 - [orm] [bug]
修复了当 ORM 绑定“version”列时传递错误类型信息的 bug,当使用“version”功能时。测试感谢 Daniel Miller。
参考:#2539 - [orm] [bug]
在 Session.commit()中发生的“flush”中添加了额外的逻辑,以便在随后的 flush 之前刷新由 after_flush()或 after_flush_postexec()钩子添加的额外状态,然后“commit”完成。后续调用 flush()将继续,直到 after_flush 钩子停止添加新状态。在事件 after_flush()钩子每次添加新内容时,还设置了一个“overflow”计数器为 100。
参考:#2566
engine
- [engine] [feature]
事件系统的内存使用情况显著改善;直到为该事件建立了实例级别的监听器,才会为特定类型的事件创建实例级别集合。
参考:#2516 - [engine] [bug]
修复了当 QueuePool 有线程等待连接时发生的 disconnect detect + dispose bug,会使这些线程等待旧池的超时时间(如果禁用超时,则会无限期等待)。现在修复了这个问题,通过特殊异常情况通知这些等待者,并让它们转移到新池。
参考:#2522 - [engine] [bug]
在 mysql/init.py 中添加了 gaerdbms 导入,缺少此导入会导致无法加载新的 GAE 方言。
参考:#2529 - [engine] [bug]
修复了 cextension bug,其中如果给定的索引是 Column 对象而不是字符串,则“模糊列错误”将无法正常工作。请注意,这里仍然存在一些列定位问题,在 0.8 中已修复。
参考:#2553 - [engine] [bug]
修复了 Enum 的 repr(),包括“name”和“native_enum”标志。有助于 Alembic 自动生成。
sql
- [sql] [bug]
修复了 DropIndex 构造以支持与远程模式中的表关联的索引。
参考:#2571 - [sql] [bug]
修复了 over()构造中的 bug,其中将空列表传递给 partition_by 或 order_by,而不是 None,将无法正确生成。感谢 Gunnlaugur Þór Briem。
参考:#2574 - [sql] [bug]
修复了 CTE bug,其中 CTE 本身存在位置绑定参数会破坏绑定参数的整体排序。这主要影响支持位置绑定+ CTE 支持的 SQL Server 平台。
参考:#2521 - [sql] [bug]
修复了 CTE 中更多的不直观问题,这些问题阻止了在不使用别名的情况下引用 CTE 自身的联合。现在,CTE 根据名称唯一呈现,仅呈现给定名称的最外层 CTE - 所有其他引用只是作为名称呈现。这甚至包括引用不同版本的相同 CTE 对象的其他 CTE/SELECT,比如引用该 SELECT 的 SELECT 或 UNION ALL。在这种情况下,我们在对象标识和词法标识之间有些放松通常的联系。两个不相关的 CTE 之间的真实名称冲突现在会引发错误。 - [sql] [bug]
在通用表达式的 WITH RECURSIVE 子句中,对列名应用引用规则,根据原始列的引用规则进行引用。
参考:#2512 - [sql] [bug]
修复了在 0.7.6 中引入的回归问题,即在某些“clone+replace”场景中,SELECT 语句的 FROM 列表可能不正确。
参考:#2518 - [sql] [bug]
修复了在嵌���子查询中使用 UNION 或类似操作会干扰结果列定位的错误,即在结果列与嵌套 UNION 中的名称相同时。
参考:#2552 - [sql] [bug]
自 0.6 版本以来修复了一个关于结果行定位的回归问题。现在可以在 select()语句中使用基于字符串的列,比如 select([‘id’, ‘name’]).select_from(‘mytable’),并且可以通过具有这些名称的 Column 对象来定位该语句;这是 query(MyClass).from_statement(some_statement)工作的机制。在某个时候,使用 select([‘id’])这种特定情况停止工作了,这等同于 select([literal_column(‘id’)]),所以这已经重新启用并当然进行了测试。
参考:#2558 - [sql] [bug]
将 is_()和 isnot()操作符添加到 ColumnOperators 基类中,以便这些长期可用的操作符作为其他操作符一样存在。
参考:#2544
postgresql
- [postgresql] [bug]
反射主键约束中的列现在按照约束本身定义的顺序返回,而不是表的顺序。感谢 Gunnlaugur Þór Briem。
参考:#2531 - [postgresql] [bug]
将“terminating connection”添加到我们用于检测与 PG 断开连接的消息列表中,当服务器重新启动时,某些版本中似乎存在这种情况。
参考:#2570
mysql
- [mysql] [bug]
更新了 mysqlconnector 接口,使用了更新的“client flag”和“charset”API,感谢 David McNelis。
sqlite
- [sqlite] [feature]
增加了对 SQLite 中实现的 localtimestamp() SQL 函数的支持,感谢 Richard Mitchell。 - [sqlite] [bug]
调整了一个非常古老的 bug 修复,该修复试图解决一个 SQLite 问题,而该问题本身已在 sqlite 3.6.14 时“修复”,即在使用“foreign_key_list”pragma 时,表名周围的引号问题。修复已调整为不干扰实际上在列或表的名称中*的引号,尽可能大程度地;如果目标表实际上在其名称周围有引号(即“”“mytable”””),则 sqlite 仍不会正确返回 foreign_key_list()的结果。
参考文献:#2568 - [sqlite] [bug]
调整了列默认反射代码,将非字符串值转换为字符串,以适应旧版本 SQLite 不将默认信息作为字符串提供的情况。
参考文献:#2265
mssql
- [mssql] [bug]
修复了编译器错误,其中在 ORDER BY 中使用相关子查询将无法正确呈现,如果语句还使用了 LIMIT/OFFSET,这是由于在 ROW_NUMBER() OVER 子句中的错误呈现导致的。修复由 sayap 提供。
参考文献:#2538 - [mssql] [bug]
修复了编译器错误,其中给定的 select()如果具有“offset”属性,则会修改它,导致构造在第二次编译时无法正确编译。
参考文献:#2545 - [mssql] [bug]
修复了主键约束的反射 bug,如果相同的约束/表存在于多个模式中,则会使列加倍。
0.7.8
发布日期:2012 年 6 月 16 日
orm
- [orm] [feature]
flush()的‘objects’参数不再被弃用,因为已经确定了一些有效的用例。 - [orm] [bug]
修复了 subqueryload()从多态映射到目标的问题,将为多态结果中遇到的每个不同的类产生一个新的查询调用。
参考文献:#2480 - [orm] [bug]
修复了在声明中的 bug,其中加入表的列的优先级(通常是用于 id 的复合列)如果列包含与其属性名称不同的名称,则将无法正确。这将导致针对实体属性的主键条件不正确。与此相关,因为这应该是那个的一部分,这是。
参考文献:#1892,#2491 - [orm] [bug]
修复了 identity_key()函数不接受标量参数作为标识的问题。
参考文献:#2508 - [orm] [bug]
修复了 populate_existing 选项不会传播到子查询急切加载程序的 bug。
参考文献:#2497
引擎
- [engine] [bug]
修复了结果代理的 C 版本中的内存泄漏 bug,即不提供纯 Python 元组作为结果行的 DBAPI 将无法正确减少引用计数。受影响最严重的 DBAPI 是 pyodbc。
参考:#2489 - [engine] [bug]
修复了影响 Py3K 的 bug,即传递给 engine/connection execute()的字符串位置参数将无法被正确解释,因为 Py3K 字符串上存在 iter。
参考:#2503
sql
- [sql] [bug]
将 BIGINT 添加到 types.all,将 BIGINT、BINARY、VARBINARY 添加到 sqlalchemy 模块命名空间,以及确保此破坏不会再次发���的测试。
参考:#2499 - [sql] [bug]
修复了当 SELECT 语句包含 UNION 或其他复合表达式时,公共表达式渲染无法正确运行的 bug,感谢 btbuilder。
参考:#2490 - [sql] [bug]
修复了在克隆的 select()构造上 append_column()无法正确运行的 bug,感谢 Gunnlaugur Þór Briem。
参考:#2482
postgresql
- [postgresql] [bug]
移除了在反射枚举时不必要的表子句,感谢 Gunnlaugur Þór Briem。
参考:#2510
mysql
- [mysql] [feature]
添加了一个新的 Google App Engine 方言。感谢 Richie Foreman。
参考:#2484
oracle
- [oracle] [bug]
向 oracle.*添加了 ROWID。
参考:#2483
0.7.7
发布日期:2012 年 5 月 5 日星期六
orm
- [orm] [feature]
向 Query 添加了 prefix_with()方法,调用 select().prefix_with()以允许在语句中放置 MySQL SELECT 指令。感谢 Diana Clarke。
参考:#2443 - [orm] [feature]
添加了新标志@validates include_removes。当为 True 时,集合删除和属性删除事件也将发送到验证函数,当使用此标志时,该函数将接受额外参数“is_remove”。 - [orm] [bug]
修复了工作单元中的问题,即将非 None 的自引用多对一关系设置为 None 时,如果前一个值尚未加载,则无法持久化更改。
参考:#2477 - [orm] [bug]
修复了 0.7.6 中引入的错误,即针对被映射为连接或其他间接可选择的列映射集合在使用时会失败的 bug。
参考:#2409 - [orm] [bug]
修复了一个 bug,即在 merge()操作中不正确地包含未在类中映射的 polymorphic_on 列,导致错误。
参考:#2449 - [orm] [bug]
修复了表达式注释机制中的错误,可能导致使用 column_property() 时,SELECT 语句的别名和连接渲染不正确。
引用:#2453 - [orm] [bug]
修复了 OrderingList 无法被 pickle 的 bug。感谢 Jeff Dairiki
引用:#2454 - [orm] [bug]
修复了关系比较中的 bug,调用未实现的方法如 SomeClass.somerelationship.like() 会产生递归溢出,而不是 NotImplementedError。
sql
- [sql] [feature]
添加了新的连接事件 dbapi_error()。对于所有 DBAPI 级别的错误,传递原始的 DBAPI 异常,在 SQLAlchemy 修改游标状态之前调用。 - [sql] [bug]
当 Index 创建时没有列时,移除警告;虽然这可能不是用户想要的,但作为一个 Index 可能只是某个名称的索引的占位符是一个有效的用例。 - [sql] [bug]
如果在调用“with engine.begin()”时 conn.begin() 失败,则新获取的 Connection 在正常传播异常之前会被显式关闭。 - [sql] [bug]
将 BINARY、VARBINARY 添加到 types.all 中。
引用:#2474
postgresql
- [postgresql] [feature]
为 PostgreSQL 添加了新的 for_update/with_lockmode() 选项:for_update=”read”/ with_lockmode(“read”),for_update=”read_nowait”/ with_lockmode(“read_nowait”)。这些分别发出“FOR SHARE”和“FOR SHARE NOWAIT”。感谢 Diana Clarke
引用:#2445 - [postgresql] [bug]
在反射域时删除了不必要的表子句。
引用:#2473
mysql
- [mysql] [bug]
修复了在 InnoDB 中自动增量复合列的“KEY”子句中的列名会双引号保留字的错误。感谢 Jeff Dairiki。
引用:#2460 - [mysql] [bug]
修复了对“information_schema”模式的 get_view_names() 无法检索标记为“SYSTEM VIEW”的视图的 bug。感谢 Matthew Turland. - [mysql] [bug]
修复了如果在不支持 cast() 的 SQL 表达式上使用 cast() 并且因此方言未呈现 CAST,则评估顺序可能会更改的 bug;现在对这些表达式应用分组。
引用:#2467
sqlite
- [sqlite] [feature]
添加了 SQLite 执行选项“sqlite_raw_colnames=True”,将绕过 SQLite cursor.description 返回的列名中的“.” 的尝试删除。
引用:#2475 - [sqlite] [bug]
当 Table 的主键列被替换时,例如通过 extend_existing,由 insert()构造使用的“自动增量”列将被重置。以前它会继续引用先前的主键列。
参考:#2525
mssql
- [mssql] [feature]
向 PyODBC 方言添加了临时 create_engine 标志 supports_unicode_binds,以强制方言是否将 Python unicode 文字传递给 PyODBC。 - [mssql] [bug]
修复了在使用 pyodbc 方言时使用 use_scope_identity create_engine()标志的 bug。以前,如果设置为 False,此标志将被忽略。当设置为 False 时,每次 INSERT 后都会得到“SELECT @@identity”,以获取最后插入的 ID,对于那些“implicit_returning”设置为 False 的表。 - [mssql] [bug]
使用 SQL Server 的 UPDATE…FROM 语法要求在 FROM 子句中存在更新的表,当表的别名也存在于 FROM 子句中时。现在,当 FROM 存在时,更新的表总��存在于 FROM 中。感谢 sayap。
参考:#2468
0.7.6
发布日期:2012 年 3 月 14 日
orm
- [orm] [feature]
向 Session 添加了“no_autoflush”上下文管理器,与 with 一起使用:将暂时禁用自动刷新。 - [orm] [feature]
在 Query 中添加了 cte()方法,调用 Core 中的公共表达式支持(见下文)。
参考:#1859 - [orm] [feature]
添加了在使用 query(sometable).filter_by(colname=value)时查询绑定到表的列名的能力。
参考:#2400 - [orm] [bug]
修复了事件注册 bug,主要表现为在事件与创建事件之后与 Session 类关联的 sessionmaker()实例未注册的情况。
参考:#2424 - [orm] [bug]
修复了一个 bug,即在具有“literal”的 primaryjoin 条件中,当需要多次呈现相同绑定参数名称的某些类型的深度嵌套表达式上编译时会引发错误。
参考:#2425 - [orm] [bug]
在对映对象进行多行删除时,移除了对受影响行数的检查。如果两行之间存在 ON DELETE CASCADE,我们无法从 DBAPI 中获得准确的行数;在大多数 DBAPI 中,这种特定计数在任何情况下都不受支持,MySQLdb 是一个明显的例外。
参考:#2403 - [orm] [bug]
修复了使用 attribute_mapped_collection 或 column_mapped_collection 的对象无法被 pickle 的 bug。
参考:#2409 - [orm] [bug]
修复了 MappedCollection 在仅在使用了 @collection.internally_instrumented 的自定义子类中使用时无法获得适当的集合仪器的错误。
参考:#2406 - [orm] [bug]
修复了 SQL 适配机制在涉及联合继承、joinedload()、limit() 和列子句中的衍生函数的非常嵌套的情况下会失败的 bug。
参考:#2419 - [orm] [bug]
修复了 CascadeOptions 的 repr() 以包括 refresh-expire。还重新设计了 CascadeOptions 以成为 。
参考:#2417 - [orm] [bug]
改进了“声明式反射”示例,以支持单表继承,多次调用 prepare(),在替代模式下存在的表,仅将一部分类作为反射。 - [orm] [bug]
缩小了 flush() 中应用的测试范围,以检查表内部分 NULL PK 的 UPDATE,只有在真正需要进行 UPDATE 时才会发生。
参考:#2390 - [orm] [bug]
修复了一个 bug,即如果方法名与列名冲突,则当 mapper 尝试检查方法对象上的 get() 方法时会引发 TypeError。
参考:#2352
示例
- [examples] [bug]
修改了 Beaker 示例中的 _params_from_query() 函数,以从完全编译的语句中获取 bindparams,作为获取包括子查询在内的所有内容(列子句中等等)的快速方法。
engine
- [engine] [feature]
添加了 “no_parameters=True” 执行选项用于连接。如果没有参数存在,则会将语句传递给 cursor.execute(statement),从而调用 DBAPI 在不存在参数集合时的行为;对于 psycopg2 和 mysql-python,这意味着不会解释字符串中的 % 符号。只有在此选项下才会发生这种情况,并且不仅仅是如果参数列表为空,否则这将产生通常会转义百分号的 SQL 表达式的不一致行为(并且在编译时,无法提前知道在某些情况下是否会存在参数)。
参考:#2407 - [engine] [feature]
添加了 pool_reset_on_return 参数到 create_engine,允许控制“连接返回”行为。还向 pool.reset_on_return 添加了新参数 ‘rollback’、‘commit’、None,以允许更多控制连接返回活动。
参考:#2378 - [engine] [feature]
向 Engine、Connection 添加了一些不错的上下文管理器:
with engine.begin() as conn: # <work with conn in a transaction> ...
- 并且:
with engine.connect() as conn: # <work with conn> ...
- 当完成时,都会关闭连接,并在 engine.begin() 时提交或回滚事务中的错误。
- [engine] [bug]
向 MockConnection(即与 strategy=”mock” 一起使用的)添加了 execution_options() 调用,该调用作为参数的传递。
sql
- [sql] [feature]
添加了对 SQL 标准通用表达式(CTE)的支持,允许将 SELECT 对象作为 CTE 源(尚不支持 DML)。这通过在任何 select()构造上调用 cte()方法来调用。
参考:#1859 - [sql] [bug]
修复了核心中的内存泄漏问题,当使用特定类型的结果获取时会发生,特别是在调用 orm query.count()时。
参考:#2427 - [sql] [bug]
修复了在行上基于属性的列访问会引发 AttributeError(对于非 C 版本)或 NoSuchColumnError(对于 C 版本)的问题。现在在两种情况下都引发 AttributeError。
参考:#2398 - [sql] [bug]
添加了对使用列的.key 作为结果集行中的字符串标识符的支持。.key 目前被列为列的“备用”名称,并且被具有该键值作为其常规名称的列所取代。对于 SQLAlchemy 的下一个主要版本,我们可能会颠倒这种优先顺序,使.key 优先,但目前尚未决定。
参考:#2392 - [sql] [bug]
当在 insert()或 update()构造的 values()子句中声明不存在的列时,会发出警告。将在 0.8 版本中转为异常。
参考:#2413 - [sql] [bug]
在 SELECT 语句中应用标签的方式发生了重大变化,允许“截断”标签,即在 Python 中生成的标签名称超过最大标识符长度时(请注意,这可以通过 create_engine()上的 label_length 进行配置),在子查询中正确引用,并且在结果集行中使用它们的原始 Python 名称。
参考:#2396 - [sql] [bug]
修复了新“autoload_replace”标志中的错误,该错误会导致无法保留反射表的主键约束。
参考:#2402 - [sql] [bug]
当传递的参数无法解释为列或表达式时,Index 将引发异常。当创建 Index 时没有任何列时将发出警告。
参考:#2380
mysql
- [mysql] [feature]
通过 Index 和 PrimaryKeyConstraint 的新 mysql_using 参数,添加了对 MySQL 索引和主键约束类型(即 USING)的支持,感谢 Diana Clarke。
参考:#2386 - [mysql] [feature]
为所有 MySQL 方言添加了对“isolation_level”参数的支持。感谢 mu_mind 在这里的补丁。
参考:#2394
sqlite
- [sqlite] [bug]
修复了 C 扩展中的错误,其中字符串格式不会应用于作为整数返回的 Numeric 值;这主要影响 SQLite,因为它不维护数字比例设置。
参考:#2432
mssql
- [mssql] [功能]
添加了对 MSSQL INSERT、UPDATE 和 DELETE 表提示的支持,使用 UpdateBase 上的新 with_hint()方法。
参考:#2430
oracle
- [oracle] [功能]
添加了一个新的 create_engine()标志 coerce_to_decimal=False,禁用了精度数字处理,可以通过将所有数字值转换为 Decimal 来增加大量开销。
参考:#2399 - [oracle] [错误]
为 LONG 添加了缺失的编译支持
参考:#2401 - [oracle] [错误]
将“LEVEL”添加到 Oracle 的保留字列表中。
参考:#2435
0.7.5
发布日期:2012 年 1 月 28 日
orm
- [orm] [功能]
添加了“class_registry”参数到 declarative_base()。允许两个或更多声明基类共享相同的类名注册表。 - [orm] [功能]
query.filter()接受多个条件,这些条件将通过 AND 连接,即 query.filter(x==y, z>q, …) - [orm] [功能]
添加了新的关系加载器选项功能,允许“默认”加载器策略。将‘*’传递给 joinedload()、lazyload()、subqueryload()或 noload()中的任何一个,这将成为用于所有关系的加载器策略,除了在查询中明确声明的关系。感谢新兴贡献者 Kent Bower 提供了详尽而写得很好的测试套件!
参考:#2351 - [orm] [功能]
添加了新的声明性反射示例,说明了如何最好地将表反射与声明性混合使用,并使用了一些新功能。
参考:#2356 - [orm] [错误]
修复了在失败的 flush 后建立的修改会作为随后由手动调用 rollback()自动开始的事务的一部分提交的问题。在 rollback()中检查会话的状态,如果存在新状态,则发出警告并第二次调用 restore_snapshot(),丢弃这些更改。
参考:#2389 - [orm] [错误]
修复了从 0.7.4 中的回归,其中使用已经被超类作为“polymorphic_on”的列无法解析基础列的问题。
参考:#2345 - [orm] [错误]
如果两个未连接的关系不当地使用 xyzload_all(),则引发异常。
参考:#2370 - [orm] [错误]
修复了一个 bug,其中 event.listen(SomeClass)强制进行了一个完全不必要的 mapper 编译,使得在模块导入时设置事件非常困难(没人注意到这个问题吗?)
参考:#2367 - [orm] [bug]
修复了一个 bug,其中 hybrid_property 在 any()、has()中作为 kw 参数时无法正常工作。 - [orm] [bug]
确保所有 ORM 异常都可以 pickle 化,以实现多进程兼容性。
参考:#2371 - [orm] [bug]
当在一个混合属性上使用 setattr/delattr 时,如果混合属性没有定义 fset 或 fdel,实现了标准的“无法设置属性”/“无法删除属性”AttributeError。
参考:#2353 - [orm] [bug]
修复了一个 bug,即未 pickle 化的对象在 mutable 对象扩展建立的 unpickle()事件中没有设置足够的状态以在 eq()或类似方法中正确工作,如果对象需要在 eq()或类似方法中访问 ORM 属性。
参考:#2362 - [orm] [bug]
修复了一个 bug,当使用 relationship()的 load_on_pending 标志时,“merge”级联可能会错误地解释未加载的属性。感谢 Kent Bower 提供的测试。
参考:#2374 - [orm]
从 0.6 版本中修复了一个回归问题,即如果在一个待处理对象上需要发出非“get()”懒惰子句的情况下使用了“load_on_pending”relationship()标志,它将无法加载。
示例
- [examples] [feature]
简化了版本示例,使用了声明性 mixin 以及事件监听器,而不是元类+SessionExtension。
参考:#2313 - [examples] [bug]
修复了 large_collection.py 在删除表之前关闭会话的问题。
参考:#2346
engine
- [engine] [bug]
为 StatementError、DBAPIError、列错误添加了 reduce,以便异常在使用多进程时可 pickle 化。但是,目前并非所有的 DBAPI 都支持这一点,比如 psycopg2。
参考:#2371 - [engine] [bug]
当将非字符串或无效字符串传递给 SQLite 使用的任何日期/时间处理器之一时,包括 C 和 Python 版本时,改进了错误消息。
参考:#2382 - [engine] [bug]
修复了一个 bug,其中一个与表绑定的名为“”的 Column 对象与标记为“”的列匹配时,可能会在结果集行中不当地匹配。
参考:#2377 - [engine] [bug]
修复了“mock”策略中的 bug,其中未调用正确的 DDL 访问方法,导致“CREATE/DROP SEQUENCE”语句重复。
参考:#2384
sql
- [sql] [feature]
新的反射功能“autoload_replace”;在表上设置为 False 时,可以加载表而不替换现有列。允许构建更灵活的表构造/反射链,包括它有助于将声明性与表反射结合起来。请参阅维基上的新示例。
引用:#2356 - [sql] [feature]
在 sqlalchemy.sql 命名空间中添加了“false()”和“true()”表达式构造,尽管目前还不是 all 的一部分。 - [sql] [feature]
特定于方言的编译器现在对所有类型/语句编译问题引发 CompileError,而不是 InvalidRequestError 或 ArgumentError。对于有问题的列,CREATE TABLE 的 DDL 将重新引发 CompileError 以包含表/列信息。
引用:#2361 - [sql] [bug]
改进了 add_column()的 API,如果将相同的列添加到其自身的表中,则不会引发错误,并且约束不会被重复。还有助于一些反射/声明性模式。
引用:#2356 - [sql] [bug]
修复了一个问题,即当bindparam()
中required=True
时,如果语句没有给出任何参数,则不会引发“required”异常。
引用:#2381
mysql
- [mysql] [bug]
修复了一个正则表达式,过滤掉非反射“PARTITION”指令的警告,感谢 George Reilly
引用:#2376
sqlite
- [sqlite] [bug]
在 SQLite 中,FK 约束的“name”反映为“None”,而不是“0”或其他整数值。SQLite 似乎在任何情况下都不支持约束命名。
引用:#2364 - [sqlite] [bug]
sql.false()和 sql.true()在 sqlite 中分别编译为 0 和 1
引用:#2368 - [sqlite] [bug]
在获取表名和视图名时,删除了 SQLite 方言中的一个错误的“raise”,其中逻辑设置为退回到没有“sqlite_temp_master”表的旧版本的 SQLite。
mssql
- [mssql] [bug]
调整了在 mssql.TIME 类型中使用的正则表达式,以确保仅接收六位数字作为值的“microseconds”部分,这是 Python 的 datetime.time()所期望的。请注意,至少在 pyodbc 中似乎尚不支持发送微秒。
引用:#2340 - [mssql] [bug]
根据有关 pymssql 做得更好的报告,取消了对 pymssql 的“30 char”限制。pymssql 尚未经过充分测试,由于 DBAPI 正在变化,目前还不清楚该驱动程序的状态以及 SQLAlchemy 的实现应该如何适应。
引用:#2347
oracle
- [oracle] [bug]
将 ORA-03135 添加到永无止境的 Oracle “连接丢失”错误列表中
参考:#2388
杂项
- [bug] [core]
将用于缓存 INSERT/UPDATE/DELETE 语句的映射器的 LRUCache 更改为使用递增计数器而不是时间戳来跟踪条目,以提高可靠性,而不是使用 time.time(),后者可能会导致某些平台上的测试失败。
参考:#2379 - [bug] [core]
在调用池连接代理的弱引用回调函数之前,为“finalize”函数添加了一个布尔检查,以避免在应用程序退出时发出警告,当应用程序退出并且 gc 在调用弱引用回调之前从模块中删除函数时,不会发出此函数为 None 的警告。
参考:#2383 - [bug] [py3k]
修复了对 util.py3k 标志的不当使用,并将其重命名为 util.py3k_warning,因为此标志仅用于检测 -3 标志系列的导入限制。
参考:#2348
0.7.4
发布日期:2011 年 12 月 09 日星期五
orm
- [orm] [feature]
polymorphic_on 现在接受许多新类型的值:
- 否则未映射的独立表达式
- column_property() 对象
- 任何 column_property() 的字符串名称或映射列的属性名称
- 文档包含了一个使用 case() 构造的示例,这很可能是一个常见的构造用法,并且是
polymorphic_on 中的独立表达式传播到单表继承子类,以便它们在 WHERE / JOIN 子句中用于限制行到该子类,这是通常的行为。
参考:#2238, #2345 - [orm] [feature]
IdentitySet 支持 - 运算符,与 difference() 相同,处理 Session.dirty 等时非常方便。
参考:#2301 - [orm] [feature]
为 Column 的 autoincrement 添加了一个名为“ignore_fk”的新值,可用于强制在仍然属于 ForeignKeyConstraint 的列上自动增量。关系文档中的新示例说明了其用法。 - [orm] [bug]
修复了在从陈旧的一对多中删除值时“弹出”值时的 backref 行为 - 该操作被跳过,因为一对多已经被更新。
参考:#2315 - [orm] [bug]
在多年不这样做之后,对“X 是否为 Y 的父级”功能增加了更多细分,这在确定“Y”上的 FK 是否也需要“被置空”以及是否应该使用 delete-orphan 级联删除时使用。测试现在考虑了父级的 Python 标识以及其标识键,以查看 Y 的最后已知父级是否确实为 X。如果无法做出决定,则会引发 StaleDataError。引发此错误的条件非常罕见,要求以前的父级已被垃圾回收,并且以前可能会不适当地更新/删除已经移至新父级的记录,尽管以前可能会在面对模棱两可时产生“静默成功”的情况,但现在会引发错误。过期“Y”会重置“父级”跟踪器,这意味着 X.remove(Y)可能会删除 Y,即使 X 已过期,但这与以前的行为相同;建议在这种情况下也过期 X。
参考:#2264 - [orm] [bug]
修复了在 query.get()中对用户映射对象在布尔上下文中的不适当评估。也在 0.6.9 中。
参考:#2310 - [orm] [bug]
添加了缺失的逗号到 PASSIVE_RETURN_NEVER_SET 符号
参考:#2304 - [orm] [bug]
Cls.column.collate(“some collation”)现在可以工作。也在 0.6.9 中
参考:#1776 - [orm] [bug]
现在,在插入或更新操作后,复合属性的值会过期,而不是在原地重新生成。这确保了在刷新时过期的列值将首先被加载,然后再使用该值重新生成复合值。
参考:#2309 - [orm] [bug]
修复了当访问加载复合值时,即使所有列值已经存在,也会发出“refresh”事件的问题,这是合适的。这修复了依赖于“load”事件确保 _parents 字典是最新的“mutable”扩展。感谢 Scott Torborg 在这里提供的测试用例。
参考:#2308,#2309 - [orm] [bug]
修复了一个 bug,即使用具体继承与新的 ConcreteBase 或 AbstractConcreteBase 结合使用的子类的子类无法将超过一级的子类应用于每个基类的“多态加载器”。
参考:#2312 - [orm] [bug]
修复了一个 bug,即使用新的 AbstractConcreteBase 的子类的子类在生成“base”映射器时无法获取正确的“base_mapper”属性,从而导致后续失败。
参考:#2312 - [orm] [bug]
修复了对 ORM 级列创建的 column_property() 在生成某些类型的 joined-inh 连接时可能被视为一个不同的实体的 bug。
参考:#2316 - [orm] [bug]
修复了当意外传递元组给 session.query() 时引发的错误格式化。同时适用于 0.6.9 版本。
参考:#2297 - [orm] [bug]
跟踪对单表继承子类的 query.join() 调用,并用它们来消除通常附加到单表继承的额外 WHERE… IN 条件,因为 join 应该适应它。这允许 OUTER JOIN 到单表子类产生正确的结果,并且在处理单表继承连接时将产生较少的 WHERE 条件。
参考:#2328 - [orm] [bug]
table_args 现在可以传递为空元组或空字典。感谢 Fayaz Yusuf Khan 提交的补丁。
参考:#2339 - [orm] [bug]
当设置 delete-orphan 而没有删除时,更新警告消息不再引用 0.6 版本,因为我们从未升级为异常处理。理想情况下,这可能更好地作为一个异常,但无论如何都不是关键的。
参考:#2325 - [orm] [bug]
在引用没有值的复合属性时修复了 get_history() 中的错误;增加了对 composites 的 get_history() 的覆盖,否则这只是一个用户级功能。
示例
- [examples] [bug]
修复了 history_meta.py 示例中的 bug,在其中“unique”标志未从生成列放在基类上的单表继承子类中移除。
engine
- [engine] [bug]
修复了 transaction.rollback() 在事务是两阶段或保存点事务时在无效连接上抛出错误的 bug。对于普通事务,如果连接无效,rollback() 是一个空操作,所以虽然不清楚它是否应该是一个空操作,但至少现在接口是一致的。
参考:#2317
sql
- [sql] [feature]
update() 构造现在可以在 WHERE 子句中容纳多个表,这将生成一个“UPDATE…FROM”构造,由 PostgreSQL 和 MSSQL 识别。在 MySQL 上编译时,将生成“UPDATE t1, t2, …”。此外,如果“values”参数或生成方法中使用 Column 对象作为键,则 MySQL 还可以在 SET 子句中渲染对多个表的更新。
参考:#1944, #2166 - [sql] [feature]
添加了名为“python_type”的类型访问器,返回特定 TypeEngine 实例的基本 Python 类型对象,如果已知,否则引发 NotImplementedError。
参考:#77 - [SQL] [错误]
关于,对于关于 select()中“from”列表的更改进行了一些调整。_froms 集合不再被记忆,因为这简化了各种用例,并消除了在表在表达式中使用之后附加列时需要“警告”的需要 - select()构造现在将始终生成正确的表达式。这里可能没有真实世界的性能损失;select()对象几乎总是临时制作的,希望优化 select()的重用的系统将使用“compiled_cache”功能。调用 select.bind 时会减少一个命中,但绝大多数用户不应该使用“bound metadata”:)。
参考:#2261, #2316 - [SQL] [错误]
进一步调整了来自的修复,以便生成方法在克隆后更好地工作(尽管这几乎是一个不常见的用例)。特别是这允许 with_only_columns()更一致地行为。添加了额外的文档以澄清 with_only_columns()的预期行为,这是由于结果而改变的。
参考:#2261, #2319
模式
- [模式] [特性]
添加了对���程“模式”的新支持: - [模式] [特性]
Table 上的“extend_existing”标志现在允许反射过程对已经定义的 Table 对象生效;当 autoload=True 和 extend_existing=True 都设置时,将从 Table 中反射出完整的列集,然后将覆盖已经存在的列,而不是不发生任何活动。然而,直接在 autoload 运行中存在的列将像往常一样使用。
参考:#1410 - [模式] [错误]
修复了 TypeDecorator 在使用“切换”类型的 TypeDecorator 时会返回过时值的错误,例如 CHAR/UUID 类型。 - [模式] [错误]
修复了 Inspector.get_table_names 中“order_by=‘foreign_key’”选项未正确实现排序的错误,替换为现有的排序算法 - [模式] [错误]
如果存在列级 CHECK 约束的“name”,现在在 CREATE TABLE 语句中使用“CONSTRAINT CHECK ”进行呈现。
参考:#2305 - [模式]
MetaData()接受“schema”和“quote_schema”参数,这些参数将应用于同名参数的 Table 或 Sequence,这些参数保持默认值为None
。 - [模式]
Sequence 接受“quote_schema”参数 - [模式]
对于 Table,如果 schema 参数明确为“None”,tometadata()将使用传入的 MetaData 的“schema”来创建新的 Table - [模式]
添加了 CreateSchema 和 DropSchema DDL 构造 - 这些仅接受模式的字符串名称和一个“quote”标志。 - [schema]
当在 MetaData 中使用默认“schema”时,ForeignKey 在定位远程表时也会假定“default”模式。这允许将 MetaData 上的“schema”参数应用于任何一组否则没有“schema”的 Table 对象。 - [schema]
在方言上实现了一个“has_schema”方法,但目前只在 PostgreSQL 上有效。感谢 Manlio Perillo。
参考:#1679
postgresql
- [postgresql] [feature]
添加了 create_type 构造函数参数到 pg.ENUM。当为 False 时,在表创建/删除事件中不会执行 CREATE/DROP 或检查类型;只有直接调用 create()/drop()方法时才会执行此操作。有助于 Alembic 的“离线”脚本。 - [postgresql] [bug]
PostgreSQL 方言会记忆一个特定名称的 ENUM 在创建/删除序列期间已被处理。这使得在不需要任何“checkfirst”调用的情况下,创建/删除序列可以正常工作,并且在打开“checkfirst”时,只需要检查 ENUM 一次。
参考:#2311
mysql
- [mysql] [bug]
Unicode 调整允许最新的 pymysql(0.4 之后)在 Python 2 上通过 100%。
mssql
- [mssql] [feature]
解除了对 SQL Server 的 SAVEPOINT 限制。所有测试都通过了,但不清楚是否存在更深层次的问题。
参考:#822 - [mssql] [bug]
修复了在 MSSQL 上未正确实现的 with_hint()功能 - 通常用于“WITH (NOLOCK)”提示(你不应该使用!应该使用快照隔离 😃 )
参考:#2336 - [mssql] [bug]
使用新的 pyodbc 版本检测选项来修复 _need_decimal_fix。
参考:#2318 - [mssql] [bug]
不要在 SQL Server 2000 上将“表名”转换为 NVARCHAR。然而,目前仍不清楚如何使 PyODBC 与 FreeTDS 0.91 完全配合。
参考:#2343 - [mssql] [bug]
解码传入值以检索索引名称列表和这些索引中列的名称。
参考:#2269
杂项
- [feature] [ext]
在混合文档中添加了一个“transformer”的示例 - 一个返回查询转换可调用对象的混合,与自定义比较器结合使用。使用 Query 上的新方法 with_transformation()。这里的用例相当实验性,但只需在 Query 中添加一行代码。 - [bug] [pyodbc]
基于 pyodbc 的方言现在可以准确解析 pyodbc 字符串,包括“py3-3.0.1-beta4”等珍贵内容。
参考:#2318 - [bug] [ext]
当没有“默认”编译处理程序时,@compiles 装饰器会引发一个信息性错误消息,而不是 KeyError。
0.7.3
发布日期:2011 年 10 月 16 日(星期日)
通用
- [通用]
调整了“importlater”机制,该机制在内部用于解析导入循环,使得在导入 sqlalchemy 或 sqlalchemy.orm 之后完成了对 import 的使用,从而避免在应用程序启动新线程后使用 import。修复。也适用于 0.6.9 版本。
参考:#2279
ORM
- [ORM]
改进了 query.join(),使得“左”侧可以更灵活地是非 ORM 可选择的,例如一个子查询。现在放置在 select_from()中的可选择项将被用作左侧,并优先于隐式使用映射的实体。如果基于外键缺失仍然失败,错误消息将包含此细节。感谢 IRC 上的 brianrhude 提供的测试用例。
参考:#2298 - [ORM]
添加了 after_soft_rollback() Session 事件。无论是否发生实际的 DBAPI 级别回滚,此事件都会在调用 rollback()时无条件触发。该事件专门设计用于在回滚后,当 Session.is_active 为 True 时,允许对 Session 进行操作。
参考:#2241 - [ORM]
向 orm.aliased()构造添加了“adapt_on_names”布尔标志。允许一个 aliased()构造将 ORM 实体链接到一个包含聚合或其他派生形式特定属性的可选择项,前提是名称与实体映射列的名称相同。 - [ORM]
向 column_property()添加了新标志 expire_on_flush=False,将那些本来被视为“只读”的属性标记为,在刷新发生后保留它们的值,即使父对象本身参与了更新。 - [ORM]
增强了 ORM 中的仪器支持 Py3K 的新参数样式“必需的 kw 参数”,即 fn(a, b, *, c, d),fn(a, b, *args, c, d)。映射对象的 init 方法的参数签名将被保留,包括必需的 kw 规则。
参考:#2237 - [ORM]
修复了单位工作中的错误,即在高度相互链接的模式中的类之间检测“循环”时不会产生确定性结果;因此有时会漏掉一些应该被认为是循环的节点,并在后续出现问题。请注意,此错误也存在于 0.6 版本中;目前未进行回溯。
参考文献:#2282 - [ORM]
从 0.6 版本中修复了各种与 synonym()相关的回归问题:
- 现在允许对同义词进行同义词操作。
- 对 relationship()创建的同义词可以传递给 query.join()、传递给 query.options()的选项,以及通过名称传递给 query.with_parent()。
- [ORM]
修复了一个 bug,其中 mapper.order_by 属性在子查询急加载中的“内部”查询中会被忽略。同时也在 0.6.9 版本中修复。
参考:#2287 - [orm]
Identity map .discard()在内部使用 dict.pop(,None)而不是“del”来避免在非确定性 gc 拆除期间出现 KeyError/警告。
参考:#2267 - [orm]
修复了新的 composite 重写中的回归,由于缺少导入而导致 deferred=True 选项失败。
参考:#2253 - [orm]
重新引入了“comparator_factory”参数到 composite(),在 0.7 发布时被移除。
参考:#2248 - [orm]
修复了在 query.join()中出现的 bug,在复杂的多重重叠路径场景中会发生,同一张表可能会被连接两次。特别感谢 Dave Vitek 在这里的出色修复。
参考:#2247 - [orm]
Query 将把 OFFSET 为零的切片转换为 None,以避免不必要的 OFFSET 子句被调用。 - [orm]
修复了一个边缘情况,其中当新映射上的关系在第一个映射上建立一个 backref 时,mapper 会无法完全更新内部状态。 - [orm]
修复了一个 bug,即如果重新定义了 eq(),一个关系多对一的 lazyload 会触发 eq()并失败。不适用于 0.6.9 版本。
参考:#2260 - [orm]
调用 class_mapper()并传入一个不是“类型”的对象(即可能被映射的类)现在会引发一个信息性的 ArgumentError,而不是 UnmappedClassError。
参考:#2196 - [orm]
新的事件钩子,MapperEvents.after_configured()。在 configure()步骤完成并且映射实际受到影响后调用。理论上,该事件在应用程序中只调用一次,除非在已经使用现有映射之后构建新映射。 - [orm]
当一个打开的 Session 被垃圾回收时,其中保留的对象再次被认为是分离的,当它们被 add()-ed 到一个新的 Session 时。这是通过额外检查前一个“session_key”是否实际存在于 Sessions 池中来实现的。
参考:#2281 - [orm]
新的声明性特性:
- declare_last()方法,为类方法建立一个事件监听器,当映射完成最终的“configure”步骤时将被调用。
- abstract 标志。当该标志存在于类上时,该类将不会被映射。
- 新的辅助类 ConcreteBase,AbstractConcreteBase。允许使用声明性进行具体映射,当“configure”映射步骤被调用时自动设置“polymorphic_union”。
- 映射器本身有半私有方法,允许在配置完成后将“with_polymorphic”可选分配给映射器。
- 参考:#2239
- [orm]
当子类的基类使用 @declared_attr 来定义常规列时,声明性将发出警告——此属性不会传播到子类。
参考:#2283 - [orm]
用于将映射实例与其所属会话链接的整数“id”现在由序列生成函数生成,而不是 id(Session),以消除回收的 id() 值可能导致不正确结果的可能性,无需检查对象实际是否在会话中。
参考:#2280 - [orm]
行为改进:空的连接词,如 and_() 和 or_(),在包含连接词的上下文中将被展开,即 and_(x, or_()) 将产生 ‘X’ 而不是 ‘X AND ()’。
参考:#2257 - [orm]
修复了有关选择器的“from”列表计算的错误。现在,“from”计算被延迟,所以如果构造使用尚未附加到表的列对象,但稍后与表关联,则会使用该表生成 SQL 作为 FROM。这个更改对“froms”列表以及“correlates”集合的计算机制产生了相当深远的影响,因为一些“clause adaption”方案(这些方案在 ORM 中被大量使用)依赖于“froms”集合通常在适应完成之前会被缓存的事实。重写允许在任何时候清除并重新生成“froms”集合。
参考:#2261 - [orm]
修复了 Select 的 with_only_columns() 方法如果传递了可选择对象,则会失败的错误。还包括在 0.6.9 版本中。
参考:#2270
examples
- [examples]
调整了 dictlike-polymorphic.py 示例以应用 CAST,使其在 PG 和其他数据库上运行。还包括在 0.6.9 版本中。
参考:#2266
engine
- [engine]
所有池类中的 recreate() 方法都使用 self.class 来获取要生成的池类型,以支持子类化的情况。请注意,通常不需要对池进行子类化。
参考:#2254 - [engine]
对于多参数语句记录的改进,长列表的绑定参数集将使用信息性指示器进行压缩。异常消息使用相同的改进格式。
参考:#2243 - [engine]
在 pool.manage(dbapi).connect() 中添加了可选的“sa_pool_key”参数,因此不需要对参数进行序列化。 - [engine]
create_engine() 支持的入口点解析现在支持在内置或入口点解析的方言之上解析单独的 DBAPI 驱动程序,使用标准的‘+’符号 - 在解析为入口点之前会将其转换为‘.’。
参考:#2286 - [引擎]
在连接中为“返回 unicode 检测”步骤添加了异常捕获和警告,允许在 NVARCHAR 上崩溃的数据库继续初始化,假设没有实现 NVARCHAR 类型。
参考:#2299
模式
- [模式]
修改了 Column.copy() 使用 _constructor(),默认为 self.class,以创建新对象。这样可以更容易地支持 Column 的子类化。
参考:#2284 - [模式]
为 SchemaItem 类添加了稍微更好的 repr()。请注意,这里的 repr 无法完全支持“repr 是构造函数”的想法,因为模式项可以非常深度嵌套/循环,某些内容的初始化较晚,等等。
参考:#2223
postgresql
- [postgresql]
在 Index() 中添加了“postgresql_using”参数,生成 USING 子句以指定 PG 的索引实现。感谢 Ryan P. Kelly 提供的补丁。
参考:#2290 - [postgresql]
在使用 postgresql+psycopg2 方言时,为 create_engine() 添加了 client_encoding 参数;在连接时使用值调用 psycopg2 的 set_client_encoding() 方法。
参考:#1839 - [postgresql]
修复了一个与 PG 9 中修改的相同索引行为相关的错误,影响了重命名列上的主键反射。也适用于 0.6.9 版本。
参考:#2141, #2291 - [postgresql]
Table、Sequence 的反射函数不再区分大小写。名称只能在大小写上有区别,并且将被正确区分。
参考:#2256 - [postgresql]
使用原子计数器作为服务器端游标名称的“随机数”来源;在极少数情况下已报告冲突。 - [postgresql]
缩小了在反射具有当前搜索路径中模式的外键引用表时所做的假设;仅当显式模式与引用表的模式匹配时,才会将显式模式应用于引用表。以前假定“当前”模式与完整搜索路径是同义词。
参考:#2249
mysql
- [mysql]
CREATE TABLE 将在 CHARSET 之后放置 COLLATE 选项,这似乎是 MySQL 关于其是否实际工作的任意规则的一部分。也适用于 0.6.9 版本。
参考:#2225 - [mysql]
向 Index 构造添加了 mysql_length 参数,指定索引的“长度”。
参考:#2293
sqlite
- [sqlite]
确保无论是否使用 C 扩展,从数据库解析的非法日期/时间/日期时间字符串都会引发相同的 ValueError。
mssql
- [mssql]
尝试支持 FreeTDS 0.91 与 Pyodbc 的结合。这包括当检测到 FreeTDS 0.91 时,将字符串绑定发送为 Python unicode 对象,并在检测到表时使用 CAST(? AS NVARCHAR)。然而,我会继续将 Pyodbc + FreeTDS 0.91 的行为描述为相当糟糕,仍然有许多查询(例如在反射中使用的查询)在 Linux 上导致核心转储,在 OSX 上根本无法使用,MemoryErrors 随处可见,而且对 Unicode 的支持完全有问题。
参考:#2273 - [mssql]
当将标量选择与值进行比较时,= /!=的行为将不再产生 IN / NOT IN,从 0.8 版本开始;这种行为有点过于武断(如果要发出 IN,请使用in_()
),现在会发出弃用警告。要立即获得 0.8 版本的行为并消除警告,可以在www.sqlalchemy.org/docs/07/dialects/mssql.html#scalar-select-comparisons
给出一个编译器配方来覆盖 visit_binary()的行为。
参考:#2277 - [mssql]
“0”被接受为 limit()的参数,将生成“TOP 0”。
参考:#2222
oracle
- [oracle]
修复了 zxjdbc 方言的 ReturningResultProxy。从 0.6 版本开始的回归。
参考:#2272 - [oracle]
现在 String 类型在 Oracle 上生成 VARCHAR2,这是推荐的默认 VARCHAR。在 Oracle 方言中还添加了显式的 VARCHAR2 和 NVARCHAR2。使用 NVARCHAR 仍然生成“NVARCHAR2” - 在 Oracle 上没有“NVARCHAR” - 这仍然是“大写类型始终给出完全相同结果”政策的轻微破坏。VARCHAR 仍然生成“VARCHAR”,遵循该政策。如果 Oracle 曾经定义“VARCHAR”为他们声称的不同内容(在我看来永远不会发生),该类型将可用。
参考:#2252
杂项
- [types]
在“精度”和“asdecimal”之外的基本 Float 类型的额外关键字参数将被忽略;这里添加了一个弃用警告和额外的文档,相关于
参考:#2258 - [ext]
SQLSoup 将不包含在 SQLAlchemy 的 0.8 版本中;虽然很有用,但我们希望将 SQLAlchemy 本身专注于一种 ORM 使用范式。SQLSoup 很快将被第三方项目取代。
参考:#2262 - [ext]
为 AssociationProxy 添加了 local_attr、remote_attr 和 attr 访问器,提供了在类级别快速访问代理属性的能力。
参考:#2236 - [ext]
更改了关联代理字典上的 update() 方法,采用了鸭子类型方法,即检查“键”,以区分 update({}) 和 update((a, b))。以前,传递具有元组作为键的字典将被误解为序列。
参考:#2275
0.7.2
发布日期:2011 年 7 月 31 日(星期日)
orm
- [orm]
功能增强:现在,对已存在的相关对象和集合进行连接和子查询加载将会在已定义的急加载范围内遍历,以查找未填充的属性,从而使通过映射或查询选项指定的急加载无条件地进行到底,填充尚未填充的内容。此前,如果已存在相关对象或集合,则此遍历将停止,导致不一致的行为(尽管对于已加载的图表可以节省加载/循环)。对于子查询加载,这意味着子查询加载发出的额外的 SELECT 语句将无条件地调用,无论现有图表的多少(因此引起了争议)。当查询是由属性发起的延迟加载的结果时,之前的“停止”行为仍然有效,否则当重复遇到相同的相关对象时,“N+1”风格的集合迭代会变得不必要昂贵。还有一个尚未公开的生成式 Query 方法 _with_invoke_all_eagers(),它选择了旧/新的行为。
参考:#2213 - [orm]
在 ORM 中对“替换遍历”进行了重新设计,因为它改变了可选择的内容以针对事物的别名(即子句调整),包括针对联接表结构的多重嵌套 any()/has() 构造的修复。
参考:#2195 - [orm]
修复了在具有 join 条件的关系的 join() + aliased=True 从联接继承结构到自身的 query.join() 时,不适当地将主要实体转换为联接实体的错误。同样适用于 0.6.9 版本。
参考:#2234 - [orm]
修复了从 0.6 版本中的回归,其中对包含集合中的 None 的对象执行 Session.add() 将引发内部异常。将此回滚到 0.6 版本的行为,即接受 None,但显然不会持久化任何内容。理想情况下,存在 None 的集合或在 append() 上的集合至少应该发出警告,这将在 0.8 版本中考虑。
参考:#2205 - [orm]
在无法定位行的对象上加载了延迟属性引发 ObjectDeletedError,而不是稍后失败;改进了 ObjectDeletedError 中的消息,以包括除简单的“删除”外的其他条件。
参考:#2191 - [orm]
修复了从 0.6 版本中出现的回归,当某些基于 relationship() 的属性上的 get history 操作失败时,当懒加载发出时;在某些条件下,这可能会在 flush() 中触发。感谢提交了这个出色测试的用户。
参考:#2224 - [orm]
修复了在 Python 3 中显现的错误,即在 flush 期间对持久化 + 待定对象进行排序将产生非法比较,如果持久化对象的主键不是单个整数。也在 0.6.9 版中。
参考:#2228 - [orm]
修复了一个错误,即如果 query.join() 针对将多个实体组合在一起的列表达式,那么所使用的源子句将不一致。也在 0.6.9 版中。
参考:#2197 - [orm]
修复了一个错误,即如果映射类重新定义了 hash() 或 eq() 为非标准内容,这是一个受支持的用例,因为 SQLA 不应该查阅这些内容,那么如果该类是“复合”(即非单实体)结果集的一部分,则方法将被查阅。也在 0.6.9 版中。
参考:#2215 - [orm]
向 Mapper 添加了公共属性“.validators”,这是所有已用@validates 装饰器装饰过的属性的不可变字典视图。由 Stefano Fontanelli 提供。
参考:#2240 - [orm]
修复了一个微妙的错误,如果:针对子查询的 column_property() + joinedload + LIMIT + 按列属性排序,会导致 SQL 出现问题。也在 0.6.9 版中。
参考:#2188 - [orm]
与 with_parent 生成的连接条件以及针对父级使用“动态”关系时将生成唯一的 bindparams,而不是错误地重复相同的 bindparam。也在 0.6.9 版中。
参考:#2207 - [orm]
向 mapper.polymorphic_on 添加了与接收到的用户参数到 relationship.order_by、foreign_keys、remote_side 等时使用的“仅列”检查相同的检查。 - [orm]
修复了一个错误,即对比列表达式和 Query() 时不会调用底层 SELECT 语句的 as_scalar() 来生成标量子查询,方式与调用 Query().subquery() 时发生的方式相同。
参考:#2190 - [orm]
修复了声明性错误,其中从相同名称的超类继承的类会由于在 _decl_class_registry 中进行不必要的查找而失败。
参考:#2194 - [orm]
修复了 Query 中“无语句条件”断言的 bug,如果在调用 from_statement()之后调用生成方法,则会尝试引发异常。也在 0.6.9 版本中。
参考:#2199
示例
- [examples]
修复了示例/versioning 测试运行程序,不再依赖 SQLAlchemy 测试库,必须从 examples/versioning 中运行 nosetests 以避免 setup.cfg 破坏它。 - [examples]
调整示例/versioning 以在多级继承情况下选择正确的外键。 - [examples]
修复了属性 shard 示例,在 0.7 风格中正确检查绑定参数可调用的问题。
engine
- [engine]
Connection.begin()提供的上下文管理器如果提交失败将发出 rollback(),不仅在发生异常时。 - [engine]
在 Python 2.6 及以上版本中使用 urllib.parse_qsl(),不会有关于 cgi.parse_qsl()的弃用警告。
参考:#1682 - [engine]
添加了混合类 sqlalchemy.ext.DontWrapMixin。当用户定义的此类型异常在语句执行上下文中发生时,永远不会被包装在 StatementException 中。 - [engine]
StatementException 包装将在消息中显示原始异常类。 - [engine]
连接失败引发 dbapi.Error 的情况将将错误转发给 dialect.is_disconnect(),如果方言知道这是一个可能的“可重试”条件,则设置“connection_invalidated”标志。目前只实现了 Oracle ORA-01033。
参考:#2201
sql
- [sql]
修复了在 selectable 中涉及列对应的两个微妙 bug,一个是重复使用相同标记的子查询,另一个是当标记被“分组”并丢失时。影响。
参考:#2188
schema
- [schema]
新功能:所有类型上的 with_variant()方法。生成 Variant()的实例,一个特殊的 TypeDecorator,根据使用的方言选择不同类型的用法。
参考:#2187 - [schema]
当 ForeignKeyConstraint 引用父级中不存在的列名时,添加了一个信息丰富的错误消息。也在 0.6.9 版本中。 - [schema]
修复了旧的 append_ddl_listener()函数适配的 bug,将意外的**kw 传递给 Table 事件。Table 不接受 kw 参数,0.6 中的 MetaData 事件将获得“tables=somecollection”,此行为得以保留。
参考:#2206 - [schema]
修复了 Table 上“autoincrement”检测失败的 bug,如果类型没有“affinity”值,则会发生这种情况,特别是在使用 TypeEngine 作为“impl”的站点上使用 UUID 示例时会发生这种情况。 - [schema]
为 TypeEngine 对象添加了改进的 repr(),只显示构造函数参数中的位置参数或与默认值不同的 kwargs。
参考:#2209
postgresql
- [postgresql]
为 Index 添加了新的“postgresql_ops”参数,允许为索引列指定 PostgreSQL 操作符类。感谢 Filip Zyzniewski。
参考:#2198
mysql
- [mysql]
修复了 OurSQL 方言在 XA 命令中使用 ansi-neutral 引号符“’”而不是‘”’的问题。也在 0.6.9 版本中。
参考:#2186
sqlite
- [sqlite]
SQLite 方言不再剥离反射默认值的引号,允许往返 CREATE TABLE 正常工作。这与其他方言一致,它们也保持默认值的确切形式。
参考:#2189
mssql
- [mssql]
调整了 pyodbc 方言,如果检测到“Easysoft” unix 驱动程序,则绑定值将作为字节而不是 Unicode 传递。这与 FreeTDS 发生的行为相同。在某些情况下,Easysoft 似乎会在传递 Python Unicode 时崩溃。
oracle
- [oracle]
将 ORA-00028 添加到断开代码中,使用 cx_oracle _Error.code 来获取代码。也在 0.6.9 版本中。
参考:#2200 - [oracle]
添加了 ORA-01033 到断开代码中,可以在连接事件中捕获。
参考:#2201 - [oracle]
修复了 oracle.RAW 类型未生成正确 DDL 的问题。也在 0.6.9 版本中。
参考:#2220 - [oracle]
将 CURRENT 添加到保留字列表中。也在 0.6.9 版本中。
参考:#2212 - [oracle]
修复了可变扩展中的一个错误,即如果在一个映射中两次使用相同类型,则第一个之后的属性不会被检测。 - [oracle]
修复了可变扩展中的一个错误,即如果设置为 None 或非对应类型,则会引发错误。现在接受 None,将 None 分配给所有属性,非法值会引发 ValueError。
0.7.1
发布日期:2011 年 6 月 5 日 星期日
通用
- [general]
为 Python bug 7511 添加了一个解决方法,在 Windows 64 位+ VC express 上,C 扩展构建失败不会引发适当的异常。
参考:#2184
orm
- [orm]
现在允许在自引用关系上使用“delete-orphan”级联 - 这是因为 SQLA 0.7 不再在 ORM 级别强制执行“父项没有子项”的检查;此检查留给外键的可空性。相关链接
参考:#1912 - [orm]
修复了新的“mutable”扩展以正确传播事件到子类;也不要为子类创建多个事件监听器。
参考:#2180 - [orm]
修改了在刷新时未检测到“identity”键时出现的消息文本,以包括列未正确设置以正确检测自增的常见原因;也在 0.6.8 版本中。
参考:#2170 - [orm]
修复了事务级别“deleted”集合不会清除已删除状态的 bug,如果它们后来变为瞬态,则会引发错误。也在 0.6.8 版本中。
参考:#2182
engine
- [engine]
废弃 Connection/Engine 上从未被广泛知晓且多余的 schema/SQL 导向方法:reflecttable()、create()、drop()、text()、engine.func - [engine]
调整了 RowProxy 结果行的 contains() 方法,使其在内部不会生成异常抛出;无论列构造是否可以强制转换为字符串,NoSuchColumnError() 也将生成其消息。也在 0.6.8 版本中。
参考:#2178
sql
- [sql]
修复了 metadata.reflect(bind) 会关闭传递为绑定参数的 Connection 的 bug。从 0.6 版本中的回归。 - [sql]
简化了 Select 确定其‘.c’集合中内容的过程。行为完全相同,只是现在传递给 select([]) 的原始 ClauseList()(这本来就不是一个文档化的情况)将被扩展为其各个列元素,而不是被忽略。
postgresql
- [postgresql]
修复了关于数字数组、MATCH 运算符的一些单元测试问题。修复了潜在的浮点精度问题,并且目前仅在 EN 本地环境中执行 MATCH 运算符的某些测试。也在 0.6.8 版本中。
参考:#2175
mysql
- [mysql]
单元测试在安装在 Windows 上的 MySQL 上通过率达到 100%。 - [mysql]
移除了在反射具有混合大小写名称的 MySQL 表时在 Windows 上“调整大小写”步骤。经过一些对 Windows MySQL 服务器的实验后,确定这一步骤实际上并没有帮助太多;MySQL 在非 Windows 平台上也不会返回正确大小写的 FK 名称,移除这一步骤至少使反射更像在其他操作系统上的行为。考虑过在此处发出警告,但很难确定在什么条件下可以引发这样的警告,因此暂时搁置 - 而是添加了一些文档。
参考:#2181 - [mysql]
如果使用 MySQLdb 并且 DBAPI 不提供 constants.CLIENT 模块,则 supports_sane_rowcount 将设置为 False。
sqlite
- [sqlite]
在调用“PRAGMA read_uncommitted”以确定连接时的当前隔离模式并默认为 SERIALIZABLE 时,接受来自 cursor.fetchone() 的 None;这是为了支持 SQLite 3.3.0 之前的版本,这些版本没有这个功能。
参考:#2173
SqlAlchemy 2.0 中文文档(六十六)(2)https://developer.aliyun.com/article/1560806