SQLAlchemy 2.0 文档
变更和迁移
- SQLAlchemy 2.0 - 主要迁移指南
- SQLAlchemy 2.0 的新特性?
- 2.0 版本更新日志
- 1.4 版本更新日志
- 1.3 版本更新日志
- 1.2 版本更新日志
- 1.1 版本更新日志
- 1.0 版本更新日志
- 0.9 版本更新日志
- 0.8 版本更新日志
- 0.7 版本更新日志
- 0.6 版本更新日志
- 0.5 版本更新日志¶
- 0.4 版本更新日志
- 0.3 版本更新日志
- 0.2 版本更新日志
- 0.1 版本更新日志
- SQLAlchemy 1.4 的新特性?
- SQLAlchemy 1.3 的新特性?
- SQLAlchemy 1.2 的新特性?
- SQLAlchemy 1.1 的新特性?
- SQLAlchemy 1.0 的新特性?
- SQLAlchemy 0.9 的新特性?
- SQLAlchemy 0.8 的新特性?
- SQLAlchemy 0.7 的新特性?
- SQLAlchemy 0.6 的新特性?
- SQLAlchemy 0.5 的新特性?
- SQLAlchemy 0.4 的新特性?
项目版本
- 上一篇: 0.6 版本更新日志
- 下一篇: 0.4 版本更新日志
- 上级: 首页
- 在此页上
0.5 版本更新日志¶
0.5.9¶
无发布日期sql¶
0.5.8¶
发布日期: 2010年1月16日 星期六sql¶
[sql] ¶
Column 上的 copy() 方法现在支持未初始化、未命名的 Column 对象。这允许轻松创建声明式助手,在多个子类上放置通用列。
[sql] ¶
像 Sequence() 这样的默认生成器在 copy() 操作中可以正确转换。
[sql] ¶
Sequence() 和其他 DefaultGenerator 对象被接受为 Column 的 “default” 和 “onupdate” 关键字参数的值,除了位置参数外,也被接受。
[sql] ¶
修复了列算术错误,该错误影响了克隆的可选对象(包含独立的列表达式)的列对应关系。此错误通常只有在使用较新的 ORM 行为(仅在 0.6 中通过可用)时才会注意到,但在 SQL 表达式级别也更正确。
postgresql¶
misc¶
0.5.7¶
发布日期: 2009年12月26日 星期六orm¶
[orm] ¶
contains_eager() 现在可以与自动生成的子查询一起使用,当您说 “query(Parent).join(Parent.somejoinedsubclass)” 时,即当 Parent 连接到连接表继承子类时。以前 contains_eager() 会错误地将子类表单独添加到查询中,从而产生笛卡尔积。票证描述中有一个示例。
参考: #1543
[orm] ¶
query.options() 现在仅将选项传播到加载的对象,以进行潜在的进一步子加载,仅适用于此类行为相关的选项,使各种不可序列化的选项(如 contains_eager() 生成的选项)远离单个实例状态。
参考: #1553
[orm] ¶
Session.execute() 现在根据传入的表达式(即 insert()/update()/delete() 构造)定位特定于表和映射器的绑定。
参考: #1054
[orm] ¶
Session.merge() 现在可以正确地将多对一或 uselist=False 属性覆盖为 None,如果该属性在要合并的给定对象中也为 None。
[orm] ¶
修复了在合并包含空主键标识符的瞬态对象时会发生的不必要的选择。
参考: #1618
[orm] ¶
传递给 relation(),“extension” 属性的可变集合,column_property() 等,不会在多个 instrumentation 调用之间发生突变或共享,从而防止重复的扩展(例如 backref populators)被插入到列表中。
参考: #1585
[orm] ¶
修复了对 CompositeProperty 的 get_committed_value() 的调用。
参考: #1504
[orm] ¶
修复了当列列表中出现非映射列实体时,调用没有明确 “left” 侧的 join() 会导致 Query 崩溃的错误。
参考: #1602
[orm] ¶
修复了复合列在连接表子类上配置时无法正确加载的错误,这是版本 0.5.6 中为修复而引入的。感谢 Scott Torborg。
[orm] ¶
多对一关系的 “use get” 行为,即延迟加载将回退到可能缓存的 query.get() 值,现在可以在连接条件中工作,其中两个比较的类型不是完全相同的类,但共享相同的 “affinity” - 即 Integer 和 SmallInteger。还允许反射和非反射类型的组合与 0.5 风格的类型反射一起工作,例如 PGText/Text(注意 0.6 将类型反射为其通用版本)。
参考: #1556
[orm] ¶
修复了在值字典中传递 Cls.attribute 作为键并使用 synchronize_session=’expire’ (‘fetch’ 在 0.6 中) 时 query.update() 中的错误。
参考: #1436
sql¶
[sql] ¶
修复了两阶段事务中的错误,其中 commit() 方法未设置完整状态,导致后续 close() 调用失败。
参考: #1603
[sql] ¶
修复了 “numeric” paramstyle,这显然是 Informixdb 使用的默认 paramstyle。
[sql] ¶
select 的列子句中的重复表达式基于每个子句元素的标识而不是实际字符串进行去重。这允许位置元素正确呈现,即使它们都呈现相同,例如 “qmark” 样式绑定参数。
参考: #1574
[sql] ¶
与连接池连接关联的游标(即 _CursorFairy)现在正确地将 __iter__() 代理到基础游标。
参考: #1632
[sql] ¶
类型现在支持 “affinity comparison” 操作,即 Integer/SmallInteger 是 “兼容的”,或者 Text/String,PickleType/Binary 等。部分。
参考: #1556
[sql] ¶
修复了阻止 alias() 的 alias() 被克隆或适配的错误(在 ORM 操作中经常发生)。
参考: #1641
postgresql¶
[postgresql] ¶
添加了对反射 DOUBLE PRECISION 类型的支持,通过一个新的 postgres.PGDoublePrecision 对象。这是 0.6 中的 postgresql.DOUBLE_PRECISION。
参考: #1085
[postgresql] ¶
添加了对反射 INTERVAL 类型的 INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND 语法的支持。
参考: #460
[postgresql] ¶
更正了 “has_sequence” 查询以考虑当前模式或显式声明的序列模式。
参考: #1576
[postgresql] ¶
修复了 extract() 的行为,以在应用 “timestamp” 强制转换时将运算符优先级规则应用于 “::” 运算符 - 确保正确的括号。
参考: #1611
sqlite¶
mssql¶
oracle¶
misc¶
0.5.6¶
发布日期: 2009年9月12日 星期六orm¶
[orm] ¶
修复了复合主键的继承鉴别器部分在更新时会失败的错误。延续自。
参考: #1300
[orm] ¶
修复了不允许多对多双向引用的单方面声明自身为 “viewonly” 的错误
参考: #1507
[orm] ¶
添加了一个断言,防止 @validates 函数或其他 AttributeExtension 加载未加载的集合,从而可能损坏内部状态。
参考: #1526
[orm] ¶
修复了阻止两个实体在单个 flush() 中相互替换彼此的主键值的错误,对于某些操作顺序。
参考: #1519
[orm] ¶
修复了一个晦涩的问题,其中基类上具有自引用急切加载的连接表子类会将相关对象的 “子类” 表填充来自父级的 “子类” 表的数据。
参考: #1485
[orm] ¶
relations() 现在具有更大的 “覆盖” 能力,这意味着显式指定 relation() 覆盖父类的 relation() 的子类将在 flush 期间被尊重。目前这是为了支持来自具体继承设置的多对多关系。在该用例之外,YMMV。
参考: #1477
[orm] ¶
从 relation() 中挤出了一些更多不必要的 “延迟加载”。当集合发生突变时,另一侧的多对一反向引用不会触发加载 “旧” 值,除非设置了 “single_parent=True”。多对一的直接赋值仍然加载 “旧” 值,以便更新该值上的反向引用集合,这些集合可能已存在于会话中,从而保持 0.5 行为合同。
参考: #1483
[orm] ¶
修复了基于 column_property() 或类似属性的连接表继承属性的加载/刷新会失败评估的错误。
参考: #1480
[orm] ¶
改进了 MapperProperty 对象覆盖非具体继承设置的继承映射器的支持 - 属性扩展不会随机相互冲突。
参考: #1488
[orm] ¶
UPDATE 和 DELETE 在标准 SQL 中不支持 ORDER BY,LIMIT,OFFSET 等。如果调用了 limit(),offset(),order_by(),group_by() 或 distinct() 中的任何一个,Query.update() 和 Query.delete() 现在会引发异常。
参考: #1487
[orm] ¶
将 AttributeExtension 添加到 sqlalchemy.orm.__all__
[orm] ¶
改进了使用非 SQL /实体表达式调用 query() 时的错误消息。
参考: #1476
[orm] ¶
使用 False 或 0 作为多态鉴别器现在在基类以及子类上都有效。
参考: #1440
[orm] ¶
向 Query 添加了 enable_assertions(False),禁用通常的预期状态断言 - 由 Query 子类用于设计自定义状态。有关示例,请参见 https://sqlalchemy.org.cn/trac/wiki/UsageRecipes/PreFilteredQuery。
参考: #1424
[orm] ¶
修复了如果映射对象的 __len__() 或 __nonzero__() 方法导致状态更改时发生的递归问题。
参考: #1501
[orm] ¶
修复了 Weak/StrongIdentityMap.add() 中不正确的异常引发
参考: #1506
[orm] ¶
修复了 query.join() 中 “找不到 FROM 子句” 的错误消息,如果查询是针对纯 SQL 构造,则该错误消息将无法正确发出。
参考: #1522
[orm] ¶
修复了一个有点假设性的问题,该问题会导致使用旧的 polymorphic_union 函数的映射器计算错误的主键 - 但这是旧的东西。
参考: #1486
sql¶
oracle¶
misc¶
[ext] ¶
associationproxy 生成的集合代理现在是可 pickle 的。但是,用户定义的 proxy_factory 仍然不可 pickle,除非它定义了 __getstate__ 和 __setstate__。
参考: #1446
[ext] ¶
如果 __table_args__ 作为没有 dict 参数的元组传递,Declarative 将引发信息丰富的异常。改进了文档。
参考: #1468
[ext] ¶
在 MetaData 中声明的 Table 对象现在可以在发送到 primaryjoin/secondaryjoin/ secondary 的字符串表达式中使用 - 名称从声明性基类的 MetaData 中提取。
参考: #1527
[ext] ¶
在构建类之后(即通过类级别属性赋值),可以将列添加到连接表子类。该列像往常一样添加到基础 Table,但现在映射器将重建其 “join” 以包含新列,而不是引发关于 “没有这样的列,请改用 column_property()” 的错误。
参考: #1523
[test] ¶
将示例添加到测试套件中,以便定期执行它们,并清理了一些弃用警告。
0.5.5¶
发布日期: 2009年7月13日 星期一general¶
orm¶
[orm] ¶
relation() 的 “foreign_keys” 参数现在将以与 primaryjoin 和 secondaryjoin 相同的方式自动传播到 backref。对于关系() 的 backref 有意配置了不同的 “foreign_keys” 的极其罕见的用例,现在需要显式配置两侧(如果它们确实需要此设置,请参阅下一条注释...)。
[orm] ¶
...唯一已知的(并且非常非常罕见的)用例,其中在 forwards/backwards 侧使用了不同的 foreign_keys 设置,一个部分指向自身列的复合外键,已经得到增强,使得关系的 fk->自身方面不会用于确定关系方向。
[orm] ¶
Session.mapper 现在是已弃用。
如果您希望自由对象成为会话的一部分,请调用 session.add()。否则,Session.mapper 的 DIY 版本现在记录在 https://sqlalchemy.org.cn/trac/wiki/UsageRecipes/SessionAwareMapper 该方法将在整个 0.6 中保持弃用状态。
[orm] ¶
修复了 Query 能够从连接表子类实体的单个列中 join() 的问题,例如 query(SubClass.foo, SubClass.bar).join(<anything>)。在大多数情况下,会引发错误 “找不到要从中连接的 FROM 子句”。在少数其他情况下,结果将以基类而不是子类的形式返回 - 因此依赖于此错误结果的应用程序需要进行调整。
参考: #1431
[orm] ¶
修复了涉及 contains_eager() 的错误,该错误会在特定罕见情况下将自身应用于二级(即延迟)加载,从而产生笛卡尔积。改进了 query.options() 对二级加载的总体定位。
参考: #1461
[orm] ¶
修复了 0.5.4 中引入的错误,其中在刷新默认保持列时 Composite 类型失败。
[orm] ¶
修复了另一个 0.5.4 错误,其中当整个对象被序列化时,可变属性(即 PickleType)无法正确反序列化。
参考: #1426
[orm] ¶
修复了如果使用了任何同义词,session.is_modified() 会引发异常的错误。
[orm] ¶
修复了潜在的内存泄漏,其中先前 pickle 的对象放回会话中,除非显式关闭会话,否则不会被完全垃圾回收。
[orm] ¶
修复了基于列表的属性(如 pickletype 和 PGArray)无法正确 merge() 的错误。
[orm] ¶
修复了无法工作的 attributes.set_committed_value 函数。
[orm] ¶
修剪了 InstanceState 的 pickle 格式,这应进一步减少 pickle 实例的内存占用。该格式应向后兼容 0.5.4 和之前的版本。
[orm] ¶
sqlalchemy.orm.join 和 sqlalchemy.orm.outerjoin 现在已添加到 sqlalchemy.orm.* 中的 __all__。
参考: #1463
[orm] ¶
修复了当传递给 get() 的复合主键值过短时,Query 异常抛出将失败的错误。
参考:#1458
sql¶
[sql] ¶
移除了一个 execute() (包括 connection, engine, Session) 的晦涩特性,该特性允许将 bindparam() 构造作为键发送到 params 字典中。此用法未被文档记录,并且是一个问题的核心,该问题指出由 text() 构造隐式创建的 bindparam() 对象可能与 params 字典中放置的字符串具有相同的哈希值,并且在计算最终绑定参数时可能导致不适当的匹配。对此情况的内部检查将给参数渲染的关键任务增加显著的延迟,因此移除了此行为。对于任何可能一直在使用此特性的应用程序来说,这是一个向后不兼容的更改,但是该特性从未被文档记录。
misc¶
[engine/pool] ¶
为 StaticPool 实现了 recreate() 方法。
0.5.4p2¶
发布日期:2009 年 5 月 26 日星期二sql¶
[sql] ¶
修复了打印非基于参数或非 executemany() 样式的 SQL 异常的问题。
postgresql¶
[postgresql] ¶
弃用了硬编码的 TIMESTAMP 函数,当用作 func.TIMESTAMP(value) 时,会渲染为 “TIMESTAMP value”。这在某些平台上会中断,因为 PostgreSQL 不允许在此上下文中使用绑定参数。硬编码的大写字母也是不合适的,并且我们还需要支持许多其他的 PG 类型转换。因此,请改用文本构造,例如 select([“timestamp ‘12/05/09’”])。
0.5.4p1¶
发布日期:2009 年 5 月 18 日星期一orm¶
[orm] ¶
修复了 0.5.4 中引入的属性错误,该错误在使用带有不完整对象的 merge() 时会发生。
0.5.4¶
发布日期:2009 年 5 月 17 日星期日orm¶
[orm] ¶
显著提升了 Session/flush() 在处理大型映射器图和大量对象时的性能。
移除了 flush() 进程中的所有 *O(N)* 扫描行为,即扫描完整会话的操作,包括一个极其昂贵的操作,该操作错误地假设主键值正在更改,而实际上并非如此。
仍然存在一个边缘情况可能会调用完整扫描:如果现有的主键属性被修改为新值。
Session 的 “弱引用” 行为现在是 *完全的* - 在其 __dict__ 中,完全不会对映射对象或相关项/集合进行强引用。对象中的反向引用和其他循环不再影响 Session 丢失对未修改对象的所有引用的能力。具有待处理更改的对象仍然会被强引用,直到刷新。
该实现还通过将垃圾回收项的 “复活” 过程转移到仅与映射 “可变” 属性(即 PickleType,复合属性)的映射相关来提高性能。这减少了垃圾回收过程的开销,并简化了内部行为。
如果 “可变” 属性更改是对象上唯一的更改,然后取消引用该对象,则映射器在发出 UPDATE 时将无法访问其他属性状态。这可能会以不同的方式呈现给某些 MapperExtensions。
此更改还会影响内部属性 API,但不影响 AttributeExtension 接口或任何公开文档记录的属性函数。
工作单元不再为 flush() 期间的完整映射器图生成 “依赖” 处理器图,而是仅为那些表示具有待处理更改的对象的映射器创建此类处理器。这在大型互连映射器图的上下文中节省了大量方法调用。
缓存了一个浪费的 “表排序” 操作,该操作以前在每次 flush 中多次发生,这也从 flush() 中移除了大量方法调用计数。
在 mapper._save_obj() 中简化了其他冗余行为。
参考:#1398
[orm] ¶
修改了 DynamicAttributeImpl 上的 query_cls 以接受 AppenderQuery 的完整 mixin 版本,这允许子类化 AppenderMixin。
[orm] ¶
“多态鉴别器” 列可以是主键的一部分,并且它将被填充正确的鉴别器值。
参考: #1300
[orm] ¶
修复了评估器无法评估 IS NULL 子句的问题。
[orm] ¶
修复了 “动态” 关系上的 “设置集合” 功能以正确启动事件的问题。以前,集合只能分配给待处理的父实例,否则修改后的事件将无法正确触发。“设置集合” 现在与 merge() 兼容,已修复。
参考:#1352
[orm] ¶
允许序列化使用工具化描述符构造的 PropertyOption 对象;以前,当序列化使用基于描述符的选项加载的对象(例如 query.options(eagerload(MyClass.foo)))时,会发生序列化错误。
[orm] ¶
如果 “惰性加载” SQL 子句与 get() 使用的子句匹配,但包含一些硬编码的参数,则惰性加载器将不会使用 get()。以前,惰性策略会因 get() 而失败。理想情况下,get() 将与硬编码参数一起使用,但这需要进一步开发。
参考:#1357
[orm] ¶
与 query.options() 关联的 MapperOptions 和其他状态不再捆绑在与每个惰性/延迟加载属性关联的可调用对象中。这些选项现在仅在实例的状态对象填充时与该对象关联一次。这在大多数情况下消除了对每个实例/属性加载器对象的需求,从而提高了单个实例的加载速度和内存开销。
参考:#1391
[orm] ¶
修复了另一个 autoflush 干扰 session.merge() 的位置。现在在 merge() 的持续时间内完全禁用 autoflush。
参考:#1360
[orm] ¶
修复了阻止 “可变主键” 依赖逻辑在一对一 relation() 上正常运行的错误。
参考:#1406
[orm] ¶
修复了在 0.5.3 中引入的 relation() 中的错误,该错误导致从基类到连接表子类的自引用关系无法正确配置。
[orm] ¶
修复了当使用继承映射器时,可能导致未初始化属性的晦涩映射器编译问题。
[orm] ¶
修复了会话 weak_identity_map 的文档 - 默认值为 True,表示正在使用弱引用映射。
[orm] ¶
修复了一个工作单元问题,如果 relation() 是自引用的,则在删除对象拥有的集合中包含的项的外键属性不会设置为 None。
参考:#1376
[orm] ¶
修复了带有急切加载关系的 Query.update() 和 Query.delete() 失败的问题。
参考:#1378
[orm] ¶
现在,在 foreign_keys 或 remote_side 集合中同时指定二进制 primaryjoin 条件的两个列是一个错误。而以前这只是无意义的,但会以不确定的方式成功。
sql¶
[sql] ¶
从 SQLA 0.6 反向移植了 “compiler” 扩展。这是一个标准化的接口,允许创建自定义的 ClauseElement 子类和编译器。特别是,当您想要构建具有数据库特定编译的构造时,它作为 text() 的替代方案非常方便。有关详细信息,请参阅扩展文档。
[sql] ¶
当绑定参数列表大于 10 时,异常消息将被截断,以防止巨大的多页异常填满屏幕和大型 executemany() 语句的日志文件。
参考:#1413
[sql] ¶
sqlalchemy.extract()
现在对数据库方言敏感,并且可以跨支持的数据库(包括 SQLite)以惯用的方式提取时间戳的组件。[sql] ¶
修复了从 __clause_element__() 样式构造(即声明式列)构造的 ForeignKey 上的 __repr__() 和其他 _get_colspec() 方法。
参考:#1353
schema¶
[schema] [1341] [ticket: 594] ¶
向 IdentifierPreparer 类添加了 quote_schema() 方法,以便数据库方言可以覆盖模式的处理方式。这使 MSSQL 数据库方言能够将模式视为多部分标识符,例如 ‘database.owner’。
extensions¶
mysql¶
sqlite¶
mssql¶
0.5.3¶
发布日期:2009 年 3 月 24 日星期二orm¶
[orm] ¶
session.flush() 的 “objects” 参数已弃用。表示父对象和子对象之间链接的状态不支持链接一侧的 “已刷新” 状态,而不支持另一侧的 “已刷新” 状态,因此支持此操作会导致误导性结果。
参考:#1315
[orm] ¶
Query 现在实现了 __clause_element__(),它生成其 selectable,这意味着 Query 实例可以在许多 SQL 表达式中被接受,包括 col.in_(query)、union(query1, query2)、select([foo]).select_from(query) 等。
[orm] ¶
Query.join() 现在可以构造多个 FROM 子句,如果需要。例如,query(A, B).join(A.x).join(B.y) 可能会说 SELECT A.*, B.* FROM A JOIN X, B JOIN Y。急切加载也可以将其连接添加到这些多个 FROM 子句中。
参考:#1337
[orm] ¶
修复了 dynamic_loader() 中的错误,该错误导致构造时间之后的 append/remove 事件未传播到 UOW 以在 flush() 时拾取。
参考:#1347
[orm] ¶
修复了在不映射已存在类级别名称的属性之前未检查 column_prefix 的错误。
[orm] ¶
在特定集合属性上执行 session.expire() 也将清除任何待处理的反向引用添加,以便下次访问时正确返回数据库中存在的内容。为 flush([objects]) 功能提供了一定程度的解决方法,尽管我们正在考虑完全删除该功能。
参考:#1315
[orm] ¶
Session.scalar() 现在以与 Session.execute() 相同的方式将原始 SQL 字符串转换为 text(),并接受相同的备选 **kw 参数。
[orm] ¶
改进了 relation() 的 “确定方向” 逻辑,以便可以确定 mapper(A.join(B)) -> relation-> mapper(B) 等棘手情况的方向。
[orm] ¶
当使用 session.flush([somelist]) 刷新部分对象集时,操作后仍处于待处理状态的待处理对象不会被意外地添加为持久对象。
参考:#1306
[orm] ¶
向 InstrumentationManager 添加了 “post_configure_attribute” 方法,以便 “listen_for_events.py” 示例再次工作。
参考:#1314
[orm] ¶
现在检测到方向相同的前向和补充后向引用(即 ONETOMANY 或 MANYTOONE),并引发错误消息。稍后可以避免疯狂的 CircularDependencyErrors。
[orm] ¶
修复了 Query 中同时选择具有公共基类的多个连接表继承实体时的错误
以前,应用于 “A JOIN B” 上的 “B” 的适配会错误地部分应用于 “A”。
关系比较(即 A.related==someb)在应该适配时没有被适配。
其他过滤,例如 query(A).join(A.bs).filter(B.foo==’bar’),错误地将 “B.foo” 适配为好像它是 “A”。
[orm] ¶
修复了通过 any()、has() 等结合左侧的别名对象和右侧的 of_type() 对 EXISTS 子句的适配。
参考:#1325
[orm] ¶
在 sqlalchemy.orm.attributes 中添加了一个属性帮助方法
set_committed_value
。给定一个对象、属性名称和值,将在对象上设置该值作为其 “已提交” 状态的一部分,即被理解为已从数据库加载的状态。有助于创建自制集合加载器等。[orm] ¶
当传递非映射器/类工具化描述符时,Query 不会因 weakref 错误而失败,而是引发 “Invalid column expression”。
[orm] ¶
Query.group_by() 正确考虑了应用于 FROM 子句的别名,例如使用 select_from()、使用 with_polymorphic() 或使用 from_self()。
sql¶
[sql] ¶
select() 的 alias() 在用于不明确的标量上下文(即在比较操作中使用)时,将转换为 “标量子查询”。当使用 query.subquery() 时,这也适用于 ORM。
[sql] ¶
修复了 Function 对象上缺少 _label 属性,以及在 select() 中与 use_labels 一起使用时(例如在 ORM column_property() 中使用时)的其他对象。
参考:#1302
[sql] ¶
匿名别名名称现在会截断到数据库方言允许的最大长度。在 Oracle 等字符限制非常小的数据库上更为重要。
参考: #1309
[sql] ¶
__selectable__() 接口已完全被 __clause_element__() 替换。
[sql] ¶
TypeEngine 用于缓存数据库方言特定类型的每数据库方言缓存现在是 WeakKeyDictionary。这是为了防止数据库方言对象被应用程序永久引用,该应用程序创建了任意数量的引擎或数据库方言。存在小的性能损失,这将在 0.6 中解决。
参考:#1299
extensions¶
[extensions] ¶
修复了序列化程序中的递归序列化问题,该问题由 EXISTS 或其他嵌入式 FROM 构造触发。
[extensions] ¶
声明式通过搜索 __bases__ 来定位 “inherits” 类,以跳过子类本地的 mixin。
[extensions] ¶
即使显式给出了 “inherits” 映射器参数,声明式也会找出连接表继承主连接条件。
[extensions] ¶
如果 backref() 上的 “foreign_keys” 参数是字符串,声明式将正确解释它。
[extensions] ¶
当与 __table__ 结合使用时,如果列已存在于 __table__ 中,则声明式将接受表绑定的列作为属性。该列将以与添加到 mapper() 属性字典时相同的方式重新映射到给定的键。
postgresql¶
sqlite¶
[sqlite] ¶
修复了 SQLite 反射方法,以便可以检测到不存在的 cursor.description(它会触发自动游标关闭),从而在最近版本的 pysqlite 上不会因在没有行存在的情况下调用 fetchone() 而失败(这些版本会在没有行存在的情况下调用 fetchone() 时引发错误)。
mssql¶
0.5.2¶
发布日期:2009 年 1 月 24 日星期六orm¶
[orm] ¶
进一步改进了 0.5.1 中关于放置在多对多关系上的 delete-orphan 级联的警告。首先,坏消息:警告将适用于多对多关系以及多对一关系。这是必要的,因为在这两种情况下,SQLA 在确定 “孤儿” 状态时都不会扫描所有潜在的父对象 - 对于持久对象,它仅检测到 Python 中的取消关联事件以将对象建立为 “孤儿”。接下来,好消息:为了通过外键或关联表支持一对一关系,或通过关联表支持一对多关系,可以设置一个新的标志 single_parent=True,该标志指示链接到关系的对象仅应具有单个父对象。如果在 Python 中发生多个父关联事件,该关系将引发错误。
[orm] ¶
调整了 0.5.1 中的属性工具化更改,以完全建立子类的工具化,其中映射器是在超类已被完全工具化之后创建的。
参考:#1292
[orm] ¶
修复了 delete-orphan 级联中的错误,该错误导致从两个不同的父类到同一目标类的两个一对一关系会过早地 expunge 实例。
[orm] ¶
修复了一个急切加载错误,该错误导致自引用急切加载会阻止其他急切加载(无论是否自引用)正确连接到父 JOIN。
[orm] ¶
session.expire() 和相关方法不会 expire() 未加载的延迟属性。这可以防止在刷新实例时不必要地加载它们。
[orm] ¶
query.join()/outerjoin() 现在会将 aliased() 构造正确地连接到现有的左侧,即使已调用 query.from_self() 或 query.select_from(someselectable)。
参考:#1293
sql¶
mssql¶
0.5.1¶
发布日期:2009 年 1 月 17 日星期六orm¶
[orm] ¶
移除了一个内部连接缓存,该缓存在重复向临时 selectable 发出 query.join() 时可能会导致内存泄漏。
[orm] ¶
Session 方法 “clear()”、“save()”、“update()”、“save_or_update()” 已被弃用,并由 “expunge_all()” 和 “add()” 替代。“expunge_all()” 也已添加到 ScopedSession。
[orm] ¶
现代化了 “no mapped table” 异常,并在 declarative 中添加了更明确的 __table__/__tablename__ 异常。
[orm] ¶
具体继承的映射器现在会检测从超类继承但未为具体映射器本身定义的属性,使用 InstrumentedAttribute,当访问这些属性时会发出描述性错误。
参考: #1237
[orm] ¶
添加了一个新的 relation() 关键字 back_populates。这允许使用显式关系配置反向引用。当在具体映射器的层次结构和另一个类之间创建双向关系时,这是必需的。
[orm] ¶
为在具体映射器上指定的 relation() 对象添加了测试覆盖率。
参考: #1237
[orm] ¶
Query.from_self() 以及 query.subquery() 都禁用了在生成的子查询内部渲染 eager joins。“禁用所有 eager joins” 功能通过新的 query.enable_eagerloads() 生成器公开提供。
参考: #1276
[orm] ¶
向 Query 添加了一系列基本的集合操作,这些操作接收 Query 对象作为参数,包括 union()、union_all()、intersect()、except_()、intersect_all()、except_all()。有关示例,请参阅 Query.union() 的 API 文档。
[orm] ¶
修复了阻止 Query.join() 和 eagerloads 连接到从 union 或 aliased union 中选择的查询的错误。
[orm] ¶
为在具体映射器上指定的双向关系添加了一个简短的文档示例。
参考: #1237
[orm] ¶
映射器现在在构造时使用最终的 InstrumentedAttribute 对象检测类属性,该对象保持持久性。_CompileOnAttr/__getattribute__() 方法已被移除。最终效果是,基于 Column 的映射类属性现在可以在类级别完全使用,而无需调用映射器编译操作,从而大大简化了 declarative 中的典型用法模式。
参考: #1269
[orm] ¶
ColumnProperty(以及前端助手,如
deferred
)不再忽略未知的 **keyword 参数。[orm] ¶
修复了 unitofwork 的 “row switch” 机制(即将 INSERT/DELETE 转换为 UPDATE)中的一个错误,当与 joined-table inheritance 以及一个对象组合使用时,该对象在其子表中不包含已定义的值,其中将渲染没有 SET 子句的 UPDATE。
[orm] ¶
在多对多关系中使用 delete-orphan 已被弃用。由于 SQLA 不会检索 m2m 的完整 “parents” 列表,因此这会产生误导性或错误的结果。要在 m2m 表中获得 delete-orphan 行为,请使用显式关联类,以便将各个关联行视为父项。
参考: #1281
[orm] ¶
delete-orphan 级联始终需要 delete 级联。在没有 delete 的情况下指定 delete-orphan 现在会引发弃用警告。
参考: #1281
sql¶
schema¶
mysql¶
[mysql] ¶
添加了 MySQL 4.1 中缺少的关键字,以便它们得到正确转义。
mssql¶
misc¶
[declarative] ¶
现在可以在没有自己表的子类上指定 Column 对象(即使用 single table inheritance)。这些列将附加到基表,但仅由子类映射。
[declarative] ¶
对于 joined 和 single inheriting 子类,子类将仅映射已在超类上映射的列以及子类上显式的列。Table 上存在的其他列将默认从映射中排除,这可以通过将空白的 exclude_properties 集合传递给 __mapper_args__ 来禁用。这是为了使 single-inheriting 类(定义了自己的列的类)成为唯一映射这些列的类。除非您显式设置 exclude_properties 参数,否则效果实际上是比您通常通过显式 mapper() 调用获得的映射更组织化的映射。
[declarative] ¶
向使用 __table__ 指定现有表的 declarative 类添加新的 Column 对象是错误的。
0.5.0¶
发布日期:2009 年 1 月 6 日星期二general¶
[general] ¶
文档已转换为 Sphinx。特别是,生成的 API 文档已构建为一个完整的 “API 参考” 部分,该部分组织了编辑文档并结合了生成的文档字符串。节和 API 文档之间的交叉链接得到了极大的改进,提供了由 javascript 驱动的搜索功能,并提供了所有类、函数和成员的完整索引。
[general] ¶
setup.py 现在仅可选地导入 setuptools。如果不存在,则使用 distutils。建议使用新的 “pip” 安装程序而不是 easy_install,因为它以更简化的方式安装。
[general] ¶
在 examples 文件夹中添加了 PostGIS 集成的极其基本的示例。
orm¶
[orm] ¶
Query.with_polymorphic() 现在接受第三个参数 “discriminator”,它将替换该查询的 mapper.polymorphic_on 的值。即使映射器具有 polymorphic_identity,映射器本身也不再需要设置 polymorphic_on。如果未设置,映射器将默认以非多态方式加载。这两个功能共同允许非多态的具体继承设置在每个查询的基础上使用多态加载,因为在所有情况下都以多态方式使用具体设置容易出现许多问题。
[orm] ¶
dynamic_loader 接受 query_class= 以自定义用于动态集合和从中构建的查询的 Query 类。
[orm] ¶
query.order_by() 接受 None,这将从查询中删除任何挂起的 order_by 状态,并取消任何映射器/关系配置的排序。这主要用于覆盖在 dynamic_loader() 上指定的排序。
参考: #1079
[orm] ¶
在 compile_mappers() 期间引发的异常现在被保留以提供 “sticky behavior” - 如果对预编译映射属性的 hasattr() 调用触发失败编译并抑制异常,则后续编译将被阻止,并且异常将在下一次 compile() 调用时重复。
[orm] ¶
property.of_type() 现在在单表继承目标上被识别,当在 prop.of_type(..).any()/has() 以及 query.join(prop.of_type(…)) 的上下文中使用时。
[orm] ¶
当 join 的目标与基于属性的属性不匹配时,query.join() 会引发错误 - 虽然不太可能有人这样做,但 SQLAlchemy 作者对此特定的 loosey-goosey 行为负有责任。
[orm] ¶
修复了使用 weak_instance_map=False 时,修改后的事件不会被 flush() 拦截的错误。
参考: #1272
[orm] ¶
修复了一些深层 “column correspondence” 问题,这些问题可能会影响针对包含同一表的多个版本的 selectable 以及 union 和类似的 selectable(在不同级别的不同列位置包含相同的表列)进行的 Query。
参考: #1268
[orm] ¶
与 column_property()、relation() 等结合使用的自定义 comparator 类可以在 Comparator 上定义新的比较方法,这些方法将通过 InstrumentedAttribute 上的 __getattr__() 提供。在 synonym() 或 comparable_property() 的情况下,属性首先在用户定义的描述符上解析,然后在用户定义的 comparator 上解析。
[orm] ¶
添加了 ScopedSession.is_active 访问器。
参考: #976
[orm] ¶
可以将映射属性和列对象作为键传递给 query.update({})。
参考: #1262
[orm] ¶
传递给表达式级别 insert() 或 update() 的 values() 的映射属性将使用映射列的键,而不是映射属性的键。
[orm] ¶
修正了 Query.delete() 和 Query.update() 无法与绑定参数正确配合使用的问题。
参考: #1242
[orm] ¶
Query.select_from()、from_statement() 确保给定的参数分别是 FromClause 或 Text/Select/Union。
[orm] ¶
Query() 可以将 “composite” 属性作为列表达式传递,它将被展开。与此有些相关。
参考: #1253
[orm] ¶
当传递各种列表达式(如字符串、clauselist、text() 构造)时,Query() 会更加健壮(这可能意味着它只是更友好地引发错误)。
[orm] ¶
first() 可以与 Query.from_statement() 一起正常工作。
[orm] ¶
修复了 0.5rc4 中引入的错误,该错误涉及 eager loading 对于使用 add_property() 或等效方法在编译后添加到映射器的属性不起作用。
[orm] ¶
修复了 viewonly=True 的多对多 relation() 未正确引用 secondary->remote 之间的链接的错误。
[orm] ¶
当向多对多关系中的 “secondary” 表发出 INSERT 时,将维护基于列表的集合中的重复项。假设 m2m 表对其具有唯一或主键约束,这将引发预期的约束冲突,而不是静默地删除重复条目。请注意,旧行为对于一对多关系仍然存在,因为在这种情况下,集合条目不会导致 INSERT 语句,并且 SQLA 不会手动管理集合。
参考: #1232
[orm] ¶
Query.add_column() 可以像 session.query() 一样接受 FromClause 对象。
[orm] ¶
多对一关系与 NULL 的比较已基于 not_() 正确转换为 IS NOT NULL。
[orm] ¶
添加了额外的检查以确保显式 primaryjoin/secondaryjoin 是 ClauseElement 实例,以防止稍后出现更令人困惑的错误。
参考: #1087
[orm] ¶
改进了 mapper() 对非类类的检查。
参考: #1236
[orm] ¶
comparator_factory 参数现在已记录在案,并受所有 MapperProperty 类型支持,包括 column_property()、relation()、backref() 和 synonym()。
参考: #5051
[orm] ¶
将 PropertyLoader 的名称更改为 RelationProperty,以与其他所有名称保持一致。PropertyLoader 仍然作为同义词存在。
[orm] ¶
修复了 “double iter()” 调用导致 shard API 中的总线错误,移除了 0.4 版本中遗留的错误 result.close()。
[orm] ¶
使 Session.merge 级联不触发 autoflush。修复了合并的实例在缺少值的情况下过早插入的问题。
[orm] ¶
两个修复程序,以帮助防止带外列在 polymorphic_union 继承场景中呈现(这会导致额外的表在 FROM 子句中呈现,从而导致笛卡尔积)
改进了 a->b->c 继承情况的 “column adaption”,以更好地定位通过多个级别的间接相关的列,而不是呈现未适应的列。
“polymorphic discriminator” 列仅针对正在查询的实际映射器呈现。该列不会从子类或超类映射器 “拉入”,因为它是不需要的。
[orm] ¶
修复了 ShardedSession.execute() 上的 shard_id 参数。
参考: #1072
sql¶
[sql] ¶
RowProxy 对象可以代替发送到 connection.execute() 及其朋友的字典参数使用。
参考: #935
[sql] ¶
列名可以再次包含百分号。
参考: #1256
[sql] ¶
sqlalchemy.sql.expression.Function 现在是一个公共类。它可以被子类化,以命令式风格提供用户定义的 SQL 函数,包括预先建立的行为。postgis.py 示例说明了这种用法。
[sql] ¶
PickleType 现在默认倾向于 == 比较,如果传入的对象(如字典)实现了 __eq__()。如果对象未实现 __eq__() 且 mutable=True,则会引发弃用警告。
[sql] ¶
修复了 sqlalchemy.sql 中不导出 __names__ 的导入怪异问题。
参考: #1215
[sql] ¶
重复使用相同的 ForeignKey 对象会引发错误,而不是稍后静默失败。
参考: #1238
[sql] ¶
为 Insert/Update/Delete 构造上的 params() 方法添加了 NotImplementedError。这些项当前不支持此功能,与 values() 相比,这也会有点误导。
[sql] ¶
反射外键将正确地定位其引用的列,即使该列被赋予了与反射名称不同的 “key” 属性。这是通过 ForeignKey/ForeignKeyConstraint 上的一个名为 “link_to_name” 的新标志实现的,如果为 True,则表示给定的名称是引用的列的名称,而不是其分配的键。
参考: #650
[sql] ¶
select() 可以接受 ClauseList 作为列,就像 Table 或其他 selectable 一样,并且内部表达式将用作列元素。
参考: #1253
[sql] ¶
session.is_modified() 上的 “passive” 标志已正确传播到属性管理器。
[sql] ¶
union() 和 union_all() 不会破坏已应用于内部 select() 的任何 order_by()。如果您 union() 一个带有 order_by() 的 select()(可能是为了支持 LIMIT/OFFSET),您还应该对其调用 self_group() 以应用括号。
mysql¶
sqlite¶
mssql¶
[mssql] ¶
添加了一个新的 MSGenericBinary 类型。它映射到 Binary 类型,因此它可以实现将指定长度的类型视为固定宽度 Binary 类型,并将非长度类型视为无界可变长度 Binary 类型的特殊行为。
[mssql] ¶
添加了新类型:MSVarBinary 和 MSImage。
参考: #1249
[mssql] ¶
添加了 MSReal、MSNText、MSSmallDateTime、MSTime、MSDateTimeOffset 和 MSDateTime2 类型
[mssql] ¶
重构了 Date/Time 类型。
smalldatetime
数据类型不再截断为仅日期,现在将映射到 MSSmallDateTime 类型。参考: #1254
[mssql] ¶
修正了 Numerics 接受 int 的问题。
[mssql] ¶
将
char_length
映射到LEN()
函数。[mssql] ¶
如果
INSERT
包含子查询,则INSERT
将从INSERT INTO VALUES
构造转换为INSERT INTO SELECT
构造。[mssql] ¶
如果列是
primary_key
的一部分,则它将是NOT NULL
,因为 MSSQL 不允许NULL
在 primary_key 列中。[mssql] ¶
MSBinary
现在返回BINARY
而不是IMAGE
。这是一个向后不兼容的更改,因为BINARY
是固定长度数据类型,而IMAGE
是可变长度数据类型。参考: #1249
[mssql] ¶
get_default_schema_name
现在基于用户的默认 schema 从数据库中反射出来。这仅适用于 MSSQL 2005 及更高版本。参考: #1258
[mssql] ¶
通过使用新的 collation 参数添加了排序规则支持。以下类型支持此功能:char、nchar、varchar、nvarchar、text、ntext。
参考: #1248
[mssql] ¶
连接字符串参数的更改倾向于将 DSN 作为 pyodbc 的默认规范。有关详细用法说明,请参阅 mssql.py 文档字符串。
[mssql] ¶
添加了 savepoints 的实验性支持。它目前不能与会话完全配合使用。
[mssql] ¶
支持三个级别的列可空性:NULL、NOT NULL 和数据库配置的默认值。默认 Column 配置 (nullable=True) 现在将在 DDL 中生成 NULL。以前没有发出规范,数据库默认值将生效(通常为 NULL,但并非总是如此)。要显式请求数据库默认值,请将列配置为 nullable=None,并且不会在 DDL 中发出任何规范。这是向后不兼容的行为。
参考: #1243
oracle¶
[oracle] ¶
调整了 create_xid() 的格式以修复两阶段提交。我们现在收到了有关 Oracle 两阶段提交在此更改后正常工作的现场报告。
[oracle] ¶
添加了 OracleNVarchar 类型,生成 NVARCHAR2,并且还子类化了 Unicode,以便默认情况下 convert_unicode=True。NVARCHAR2 会自动反射到此类型,因此这些列在反射表上无需显式的 convert_unicode=True 标志即可传递 unicode。
参考: #1233
[oracle] ¶
修复了阻止接收某些类型的 out 参数的错误;非常感谢 wwu.edu 的 huddlej!
参考: #1265
misc¶
[dialect] ¶
在 dialect 上添加了一个新的 description_encoding 属性,用于在处理元数据时编码列名。这通常默认为 utf-8。
[engine/pool] ¶
Connection.invalidate() 检查关闭状态以避免属性错误。
参考: #1246
[engine/pool] ¶
NullPool 支持失败时重新连接行为。
参考: #1094
[engine/pool] ¶
在使用 pool.manage(dbapi) 时,为初始池创建添加了互斥锁。这可以防止在重负载启动时发生的轻微 “dogpile” 行为。
参考: #799
[engine/pool] ¶
_execute_clauseelement() 恢复为私有方法。现在可以使用 ConnectionProxy,因此不再需要子类化 Connection。
[documentation] ¶
票据。
[documentation] ¶
添加了关于 create_session() 默认值的注释。
[documentation] ¶
添加了关于 metadata.reflect() 的部分。
[documentation] ¶
更新了 TypeDecorator 部分。
[documentation] ¶
由于最近对该功能的困惑,重写了文档的 “threadlocal” 策略部分。
[documentation] ¶
从继承中删除了严重过时的 ‘polymorphic_fetch’ 和 ‘select_table’ 文档,并重写了 “joined table inheritance” 的后半部分。
[documentation] ¶
记录了 comparator_factory kwarg,添加了新的文档部分 “Custom Comparators”。
[postgres] ¶
text() 构造中的 “%” 符号会自动转义为 “%%”。由于此更改向后不兼容,如果在字符串中检测到 ‘%%’,则会发出警告。
参考链接: #1267
[postgres] ¶
结合 server_side_cursors 调用 alias.execute() 不会再引发 AttributeError 错误。
[postgres] ¶
为 PostgreSQL 添加了索引反射支持,使用了 Ken Kuhlman 提交的非常棒的补丁,我们长期以来忽略了这个补丁。
参考链接: #714
[associationproxy] ¶
关联代理属性现在可以在类级别使用,例如 MyClass.aproxy。 之前这会评估为 None。
[declarative] ¶
backref() 接受作为字符串的完整参数列表,包括 ‘primaryjoin’、‘secondaryjoin’、‘secondary’、‘foreign_keys’、‘remote_side’、‘order_by’。
0.5.0rc4¶
发布日期:2008 年 11 月 14 日 星期五通用¶
[general] ¶
全局 “propigate”->”propagate” 更改。
ORM¶
[orm] ¶
Query.count() 已得到增强,可以在更广泛的情况下执行“正确的操作”。 它现在可以计算多实体查询以及基于列的查询。 请注意,这意味着如果您在没有任何连接条件的情况下说 query(A, B).count(),它将计算 A*B 的笛卡尔积。 任何针对基于列的实体的查询都将自动发出 “SELECT count(1) FROM (SELECT…)”,以便返回真实的行数,这意味着诸如 query(func.count(A.name)).count() 之类的查询将返回一个值 1,因为该查询将返回一行。
[orm] ¶
大量的性能调整。 对各种 ORM 操作的粗略估计表明,它比 0.5.0rc3 快 10%,比 0.4.8 快 25-30%。
[orm] ¶
错误修复和行为更改
[orm] ¶
调整了 InstanceState 上增强的垃圾回收,以更好地防止因状态丢失而导致的错误。
[orm] ¶
当针对多个实体执行时,Query.get() 返回更具信息性的错误消息。
参考链接: #1220
[orm] ¶
在 Cls.relation.in_() 上恢复 NotImplementedError。
[orm] ¶
修复了 relation() 上 order_by 参数相关的 PendingDeprecationWarning。
参考链接: #1226
SQL¶
MSSQL¶
其他¶
0.5.0rc3¶
发布日期:2008 年 11 月 07 日 星期五ORM¶
[orm] ¶
为 SessionExtension 添加了两个新的钩子:after_bulk_delete() 和 after_bulk_update()。 after_bulk_delete() 在查询上执行批量 delete() 操作后调用。 after_bulk_update() 在查询上执行批量 update() 操作后调用。
[orm] ¶
简单多对一关系与实例的“不等于”比较将不会落入 EXISTS 子句,而是会比较外键列。
[orm] ¶
移除了将集合与可迭代对象进行比较的非真正工作用例。 使用 contains() 来测试集合成员资格。
[orm] ¶
改进了 aliased() 对象的行为,使其更准确地适应生成的表达式,这尤其有助于自引用比较。
参考链接: #1171
[orm] ¶
修复了涉及从类绑定属性(通常在使用声明式时发生)构造的 primaryjoin/secondaryjoin 条件的错误,这些条件稍后将被 Query 不恰当地别名化,特别是对于各种基于 EXISTS 的比较器。
[orm] ¶
修复了将多个 query.join() 与别名绑定的描述符一起使用时会丢失左别名的错误。
[orm] ¶
改进了 weakref 身份映射内存管理,不再需要互斥,为一个具有待处理更改的 InstanceState 惰性复活垃圾回收的实例。
[orm] ¶
InstanceState 对象现在在处置时移除对自身的循环引用,以使其保持在循环垃圾回收之外。
[orm] ¶
relation() 在确定连接条件时,不会在 “请指定 primaryjoin” 消息中隐藏不相关的 ForeignKey 错误。
[orm] ¶
修复了 Query 中涉及 order_by() 与同一类的多个别名结合使用的错误(将在其中添加测试)
参考链接: #1218
[orm] ¶
当使用 Query.join() 显式子句作为 ON 子句时,该子句将根据连接的左侧进行别名化,从而允许诸如 query(Source).from_self().join((Dest, Source.id==Dest.source_id)) 之类的场景正常工作。
[orm] ¶
polymorphic_union() 函数尊重每个 Column 的 “key”,如果它们与列的名称不同。
[orm] ¶
修复了在具有 “delete” 级联的 多对一 relation() 上的 “passive-deletes” 支持。
参考链接: #1183
[orm] ¶
修复了阻止主键复合类型被修改的复合类型错误。
参考链接: #1213
[orm] ¶
为内部属性访问添加了更多粒度,以便级联和刷新操作不会初始化未加载的属性和集合,从而将它们完整地保留以供稍后延迟加载。 Backref 事件仍然为待处理的实例初始化属性和集合。
参考链接: #1202
SQL¶
[sql] ¶
SQL 编译器优化和复杂性降低。 与 0.5.0rc2 相比,编译典型 select() 构造的调用次数减少了 20%。
[sql] ¶
方言现在可以生成可调整长度的标签名称。 传入参数 “label_length=<value>” 到 create_engine() 以调整动态生成的列标签中将存在的最大字符数,即 “somecolumn AS somelabel”。 任何小于 6 的值都将导致最小尺寸的标签,该标签由下划线和数字计数器组成。 编译器使用 dialect.max_identifier_length 的值作为默认值。
参考链接: #1211
[sql] ¶
简化了 ResultProxy “自动关闭而没有结果” 的检查,使其仅基于 cursor.description 的存在。 所有关于语句返回行的基于 regexp 的猜测都已移除。
参考链接: #1212
[sql] ¶
直接执行 union() 构造将正确设置结果行处理。
参考链接: #1194
[sql] ¶
内部的 “OID” 或 “ROWID” 列的概念已被移除。 它基本上没有被任何方言使用,并且现在 INSERT..RETURNING 可用,它与 psycopg2 的 cursor.lastrowid 一起使用的可能性基本上消失了。
[sql] ¶
移除了所有 FromClause 对象上的 “default_order_by()” 方法。
[sql] ¶
修复了 table.tometadata() 方法,以便将传入的 schema 参数传播到 ForeignKey 构造。
[sql] ¶
略微更改了 IN 运算符用于与空集合比较的行为。 现在导致针对自身的非等式比较。 更具可移植性,但会破坏非纯函数的存储过程。
MySQL¶
Oracle¶
其他¶
[ext] ¶
添加了一个新的扩展 sqlalchemy.ext.serializer。 提供 Serializer/Deserializer “类”,它们镜像 Pickle/Unpickle,以及 dumps() 和 loads()。 此序列化器实现了一个 “外部对象” pickler,它将关键的上下文敏感对象(包括引擎、会话、元数据、表/列和映射器)保留在 pickle 流之外,并且稍后可以使用任何引擎/元数据/会话提供程序恢复 pickle。 这不用于 pickle 常规对象实例,这些实例无需任何特殊逻辑即可 pickle,而是用于 pickle 表达式对象和完整的 Query 对象,以便可以在 unpickle 时恢复所有映射器/引擎/会话依赖项。
[ext] ¶
修复了阻止声明式绑定的 “column” 对象在 column_mapped_collection() 中使用的错误。
参考链接: #1174
[misc] ¶
util.flatten_iterator() 函数不会将具有 __iter__() 方法的字符串解释为迭代器,例如在 pypy 中。
参考链接: #1077
0.5.0rc2¶
发布日期:2008 年 10 月 12 日 星期日ORM¶
[orm] ¶
修复了涉及读/写 relation() 的错误,这些 relation() 在其 primaryjoin 条件中包含文字或其他非列表达式,并等于外键列。
[orm] ¶
mapper() 中的 “非批量” 模式(一种允许在每个实例更新/插入时调用映射器扩展方法的功能)现在遵循给定对象的插入顺序。
[orm] ¶
修复了映射器中与 RLock 相关的错误,该错误可能在重新进入 mapper compile() 调用时死锁,这种情况在使用 ForeignKey 对象内部的声明式构造时会发生。
[orm] ¶
ScopedSession.query_property 现在接受 query_cls 工厂,覆盖会话配置的 query_cls。
[orm] ¶
修复了共享状态错误,该错误干扰了 ScopedSession.mapper 在对象子类上应用默认 __init__ 实现的能力。
[orm] ¶
修复了 Query 上的切片(即 query[x:y]),使其可以正确地处理零长度切片、两端都为 None 的切片。
参考链接: #1177
[orm] ¶
添加了一个示例,说明 Celko 的 “嵌套集” 作为 SQLA 映射。
[orm] ¶
即使别名嵌入在 SELECT 中(例如当通过 query.select_from() 发送到 Query 时),带有别名参数的 contains_eager() 也能工作。
[orm] ¶
contains_eager() 用法现在与也包含常规 eager load 和 limit/offset 的 Query 兼容,因为这些列已添加到 Query 生成的子查询中。
参考链接: #1180
[orm] ¶
session.execute() 将执行传递给它的 Sequence 对象(从 0.4 回归)。
[orm] ¶
从 object_mapper() 和 class_mapper() 中移除了 “raiseerror” 关键字参数。 如果给定的类/实例未映射,这些函数在所有情况下都会引发异常。
[orm] ¶
修复了 autocommit=False 会话上的 session.transaction.commit() 未启动新事务的问题。
[orm] ¶
对 Session.identity_map 的弱引用行为进行了一些调整,以减少异步 GC 副作用。
[orm] ¶
调整了 Session 的刷新后新 “clean” 对象的记帐,以更好地防止在异步 gc’ed 时对对象进行操作。
参考链接: #1182
SQL¶
MySQL¶
[mysql] ¶
临时表现在是可反射的。
SQLite¶
[sqlite] ¶
改进了 SQLite 日期/时间绑定/结果处理,以使用正则表达式和格式字符串,而不是 strptime/strftime,以通用地支持 1900 年之前的日期、带有微秒的日期。
参考链接: #968
[sqlite] ¶
在 sqlite 方言中禁用了 String(和 Unicode、UnicodeText 等)的 convert_unicode 逻辑,以适应 pysqlite 2.5.0 的新要求,即仅接受 Python unicode 对象; http://web.archive.org/web/20090614054912/https://itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html
Oracle¶
0.5.0rc1¶
发布日期:2008 年 9 月 11 日 星期四ORM¶
[orm] ¶
Query 现在具有 delete() 和 update(values) 方法。 这允许使用 Query 对象执行批量删除/更新。
[orm] ¶
由 Query(*cols) 返回的 RowTuple 对象现在具有键名,这些键名优先于映射的属性名称,列键优先于列名,例如 Query(Class.foo, Class.bar) 将具有名称 “foo” 和 “bar”,即使这些不是底层 Column 对象的名称。 诸如 Query(table.c.col) 之类的直接 Column 对象将返回 Column 的 “key” 属性。
[orm] ¶
为 Query 添加了 scalar() 和 value() 方法,每个方法都返回单个标量值。 scalar() 不带参数,大致等效于 first()[0],value() 接受单个列表达式,大致等效于 values(expr).next()[0]。
[orm] ¶
改进了在 query() 实体列表中放置 SQL 表达式时 FROM 子句的确定。 特别是,标量子查询不应将其内部 FROM 对象 “泄漏” 到封闭查询中。
[orm] ¶
沿着从映射类到映射子类的 relation() 的连接,其中映射子类配置为单表继承,将在连接的 ON 子句中包含一个 IN 子句,该子句将连接类的子类型限制为那些请求的子类型。 这对 eager load 连接以及 query.join() 都有效。 请注意,在某些情况下,IN 子句也会出现在查询的 WHERE 子句中,因为此区分具有多个触发点。
[orm] ¶
AttributeExtension 已得到改进,使得事件在实际发生突变之前触发。 此外,append() 和 set() 方法现在必须返回给定的值,该值用作突变操作中使用的值。 这允许创建在操作实际发生之前引发异常的验证 AttributeListeners,并且可以在使用之前将给定值更改为其他值。
[orm] ¶
column_property()、composite_property() 和 relation() 现在可以使用 “extension” 关键字参数接受单个或 AttributeExtensions 列表。
[orm] ¶
query.order_by().get() 静默地从 GET 发出的查询中删除 “ORDER BY”,但不会引发异常。
[orm] ¶
添加了 Validator AttributeExtension,以及 @validates 装饰器,其使用方式与 @reconstructor 类似,并将方法标记为验证一个或多个映射的属性。
[orm] ¶
class.someprop.in_() 引发 NotImplementedError,等待 relation 的 “in_” 实现
参考链接: #1140
[orm] ¶
修复了多对多集合的主键更新,其中集合尚未加载
参考链接: #1127
[orm] ¶
修复了延迟() 列与组结合使用,并与另一个不相关的 synonym() 结合使用时,会在延迟加载期间产生 AttributeError 的错误。
[orm] ¶
SessionExtension 上的 before_flush() 钩子发生在最后一次计算 new/dirty/deleted 列表之前,允许 before_flush() 中的例程在刷新继续之前进一步更改 Session 的状态。
参考链接: #1128
[orm] ¶
Session 和其他对象的 “extension” 参数现在可以选择是列表,支持发送到多个 SessionExtension 实例的事件。 Session 将 SessionExtensions 放置在 Session.extensions 中。
[orm] ¶
对 flush() 的重入调用会引发错误。 这也可以作为对 Session.flush() 的并发调用的基本但并非万无一失的检查。
[orm] ¶
改进了 query.join() 在连接到使用显式连接条件(即不在 relation 上)的连接表继承子类时的行为。
[orm] ¶
@orm.attributes.reconstitute 和 MapperExtension.reconstitute 已重命名为 @orm.reconstructor 和 MapperExtension.reconstruct_instance
[orm] ¶
修复了从基类继承的子类的 @reconstructor 钩子。
参考链接: #1129
[orm] ¶
composite() 属性类型现在支持复合类上的 __set_composite_values__() 方法,如果该类使用列键名以外的属性名称来表示状态,则需要该方法; 现在在刷新时正确填充默认生成的值。 此外,属性设置为 None 的复合类型可以正确比较。
参考链接: #1132
[orm] ¶
attributes.get_history() 返回的 3 元组可迭代对象现在可以是列表和元组的混合。(以前成员始终是列表。)
[orm] ¶
修复了当实体上的主键属性的先前值已过期时,在 flush() 时更改主键属性会产生错误的问题。
参考链接: #1151
[orm] ¶
修复了自定义检测错误,其中对于未由 ORM 加载的新构造的实例未调用 get_instance_dict()。
[orm] ¶
Session.delete() 如果给定对象尚不存在,则将其添加到会话中。 这是 0.4 中的回归错误。
参考链接: #1150
[orm] ¶
Session 上的 echo_uow 标志已弃用,并且 unit-of-work 日志记录现在仅为应用程序级别,而不是每个会话级别。
[orm] ¶
从 InstrumentedAttribute 中移除了冲突的 contains() 运算符,该运算符不接受 escape kwaarg。
参考链接: #1153
SQL¶
[sql] ¶
暂时回滚了来自的 “ORDER BY” 增强功能。 此功能正在搁置中,等待进一步开发。
参考链接: #1068
[sql] ¶
exists() 构造不会 “导出” 其包含的元素列表作为 FROM 子句,从而允许它们更有效地用于 SELECT 的 columns 子句中。
[sql] ¶
and_() 和 or_() 现在生成 ColumnElement,允许布尔表达式作为结果列,例如 select([and_(1, 0)])。
参考链接: #798
[sql] ¶
Bind params now subclass ColumnElement which allows them to be selectable by orm.query (they already had most ColumnElement semantics)。
[sql] ¶
为 exists() 构造添加了 select_from() 方法,使其与常规的 select() 越来越兼容。
[sql] ¶
添加了 func.min()、func.max()、func.sum() 作为“通用函数”,这基本上允许自动确定它们的返回类型。 有助于处理 SQLite 上的日期、decimal 类型以及其他类型。
参考: #1160
[sql] ¶
添加了 decimal.Decimal 作为“自动检测”类型;当使用 Decimal 时,绑定参数和通用函数会将其类型设置为 Numeric。
schema¶
[schema] ¶
为 MetaData 添加了 “sorted_tables” 访问器,它返回 Table 对象列表,这些对象按照依赖关系排序。 这取代了 MetaData.table_iterator() 方法。 “reverse=False” 关键字参数也已从 util.sort_tables() 中移除;使用 Python 的 ‘reversed’ 函数来反转结果。
参考: #1033
[schema] ¶
所有 Numeric 类型的 ‘length’ 参数已重命名为 ‘scale’。 ‘length’ 已弃用,但仍被接受,并会发出警告。
[schema] ¶
为用户自定义类型(convert_result_value,convert_bind_param)移除了 0.3 兼容性。
mysql¶
oracle¶
misc¶
0.5.0beta3¶
发布日期:2008 年 8 月 4 日 星期一orm¶
[orm] ¶
已移除 SQLAlchemy mapper 的 “entity_name” 功能。 有关理由,请参阅 https://tinyurl.com/6nm2ne
[orm] ¶
Session、sessionmaker() 和 scoped_session() 上的 “autoexpire” 标志已重命名为 “expire_on_commit”。 它不影响 rollback() 的过期行为。
[orm] ¶
修复了在 mapper 延迟加载继承属性时可能发生的无限循环错误。
[orm] ¶
为 Session 添加了一个旧版支持标志 “_enable_transaction_accounting”,当设置为 False 时,它会禁用所有事务级别的对象记账,包括回滚时过期、提交时过期、新建/删除列表维护以及开始时自动刷新。
[orm] ¶
relation() 的 ‘cascade’ 参数接受 None 值,这等同于不级联。
[orm] ¶
对动态关系的重大修复允许在 flush() 后正确清除 “modified” 历史记录。
[orm] ¶
在 mapper 初始化期间,类上用户定义的 @properties 会被检测到并保留。 这意味着,如果 @property 存在(并且列未重映射到其他名称),则同名的表绑定列将根本不会被映射,也不会应用来自继承类的检测属性。 相同的规则适用于使用 include_properties/exclude_properties 集合排除的名称。
[orm] ¶
添加了一个新的 SessionExtension 钩子,名为 after_attach()。 这在通过 add()、add_all()、delete() 和 merge() 添加对象时调用。
[orm] ¶
从另一个 mapper 继承的 mapper,当继承其继承的 mapper 的列时,将使用该继承的 mapper 中指定的任何重新分配的属性名称。 以前,如果 “Base” 将 “base_id” 重新分配为名称 “id”,则 “SubBase(Base)” 仍然会获得一个名为 “base_id” 的属性。 可以通过在每个子 mapper 中显式声明列来解决此问题,但这相当不可行,并且在使用声明式时也是不可能的。
参考: #1111
[orm] ¶
修复了 Session 中的一系列潜在竞争条件,其中异步 GC 可能会从会话中删除未修改的、不再引用的项目,因为它们存在于要处理的项目列表中,通常在 session.expunge_all() 和依赖方法期间。
[orm] ¶
对 _CompileOnAttr 机制的一些改进应减少 “Attribute x was not replaced during compile” 警告的可能性。 (这通常适用于 SQLA 黑客,例如 Elixir 开发人员)。
[orm] ¶
修复了为待处理孤立项引发的 “unsaved, pending instance” FlushError 在生成导致错误的关联列表时未考虑超类 mapper 的错误。
sql¶
mysql¶
misc¶
0.5.0beta2¶
发布日期:2008 年 7 月 14 日 星期一orm¶
[orm] ¶
除了过期的属性外,如果结果集中存在数据,延迟属性也会加载。
参考: #870
[orm] ¶
如果属性列表不包含任何基于列的属性,session.refresh() 会引发信息性错误消息。
[orm] ¶
如果未指定列或 mapper,query() 会引发信息性错误消息。
[orm] ¶
延迟加载器现在在继续之前触发自动刷新。 这允许 collection 或标量关系的 expire() 在自动刷新的上下文中正常工作。
[orm] ¶
表示 SQL 表达式或映射表中不存在的列(例如来自视图的列)的 column_property() 属性在 INSERT 或 UPDATE 后会自动过期,假设它们尚未在本地修改,以便在访问时使用最新数据刷新它们。
参考: #887
[orm] ¶
修复了在使用 query.join(cls, aliased=True) 时,两个连接表继承 mapper 之间的显式自引用连接。
参考: #1082
[orm] ¶
修复了 query.join() 在与仅限列的子句和 join 中的 SQL 表达式 ON 子句结合使用时的问题。
[orm] ¶
已移除 mapper() 中的 “allow_column_override” 标志。 此标志几乎总是被误解。 其特定功能可通过 include_properties/exclude_properties mapper 参数获得。
[orm] ¶
修复了 Query 上的 __str__() 方法。
参考: #1066
[orm] ¶
即使定义了特定于表/mapper 的绑定,Session.bind 也被用作默认值。
sql¶
[sql] ¶
添加了新的 match() 运算符,用于执行全文搜索。 PostgreSQL、SQLite、MySQL、MS-SQL 和 Oracle 后端均支持此运算符。
schema¶
extensions¶
sqlite¶
[sqlite] ¶
修改了 SQLite 的 “microseconds” 表示形式,以匹配 str(somedatetime) 的输出,即微秒以字符串格式表示为小数秒。 这使得 SQLA 的 SQLite 日期类型与直接使用 Pysqlite 保存的日期时间兼容(Pysqlite 仅调用 str())。 请注意,这与 SQLA 0.4 生成的 SQLite 数据库文件中现有的微秒值不兼容。
要全局获取旧的行为
from sqlalchemy.databases.sqlite import DateTimeMixin DateTimeMixin.__legacy_microseconds__ = True
要获取单个 DateTime 类型上的行为
t = sqlite.SLDateTime() t.__legacy_microseconds__ = True
然后使用 “t” 作为 Column 上的类型。
参考: #1090
[sqlite] ¶
SQLite Date、DateTime 和 Time 类型现在仅接受 Python datetime 对象,而不接受字符串。 如果您想自己使用 SQLite 将日期格式化为字符串,请使用 String 类型。 如果您希望它们返回 datetime 对象,即使它们接受字符串作为输入,请在 String 周围创建一个 TypeDecorator - SQLA 不鼓励这种模式。
0.5.0beta1¶
发布日期:2008 年 6 月 12 日 星期四general¶
[general] ¶
全局 “propigate”->”propagate” 更改。
orm¶
[orm] ¶
polymorphic_union() 函数尊重每个 Column 的 “key”,如果它们与列的名称不同。
[orm] ¶
修复了仅限 0.4 版本的错误,该错误阻止复合列与继承 mapper 正确配合使用
参考: #1199
[orm] ¶
修复了 mapper 中与 RLock 相关的错误,该错误可能在重新进入 mapper compile() 调用时导致死锁,这种情况在使用 ForeignKey 对象内部的声明式构造时会发生。 从 0.5 移植。
[orm] ¶
修复了阻止主键复合类型被修改的复合类型错误。
参考链接: #1213
[orm] ¶
添加了 ScopedSession.is_active 访问器。
参考: #976
[orm] ¶
类绑定访问器可以用作 relation() order_by 的参数。
参考: #939
[orm] ¶
修复了 ShardedSession.execute() 上的 shard_id 参数。
参考: #1072
sql¶
[sql] ¶
Connection.invalidate() 检查关闭状态以避免属性错误。
参考: #1246
[sql] ¶
NullPool 支持失败时重新连接行为。
参考: #1094
[sql] ¶
TypeEngine 用于缓存数据库方言特定类型的每数据库方言缓存现在是 WeakKeyDictionary。这是为了防止数据库方言对象被应用程序永久引用,该应用程序创建了任意数量的引擎或数据库方言。存在小的性能损失,这将在 0.6 中解决。
参考:#1299
[sql] ¶
修复了 SQLite 反射方法,以便可以检测到不存在的 cursor.description(它会触发自动游标关闭),从而在最近版本的 pysqlite 上不会因在没有行存在的情况下调用 fetchone() 而失败(这些版本会在没有行存在的情况下调用 fetchone() 时引发错误)。
mysql¶
oracle¶
misc¶
[no_tags] ¶
mapper 添加的 “__init__” 触发器/装饰器现在尝试精确地镜像原始 __init__ 的参数签名。 ‘_sa_session’ 的传递不再是隐式的 - 您必须在构造函数中允许此关键字参数。
[no_tags] ¶
ClassState 已重命名为 ClassManager。
[no_tags] ¶
类可以通过提供 __sa_instrumentation_manager__ 属性来提供自己的 InstrumentationManager。
[no_tags] ¶
自定义检测可以使用任何机制将 ClassManager 与类关联,并将 InstanceState 与实例关联。 这些对象上的属性仍然是 SQLAlchemy 本机检测使用的默认关联机制。
[no_tags] ¶
将 entity_name、_sa_session_id 和 _instance_key 从实例对象移动到实例状态。 这些值仍然以旧方式提供,现在已弃用,使用附加到类的描述符。 访问时将发出弃用警告。
[no_tags] ¶
已移除 prepare_instrumentation 的别名 _prepare_instrumentation。
[no_tags] ¶
sqlalchemy.exceptions 已重命名为 sqlalchemy.exc。 该模块可以使用任一名称导入。
[no_tags] ¶
ORM 相关的异常现在在 sqlalchemy.orm.exc 中定义。 ConcurrentModificationError、FlushError 和 UnmappedColumnError 兼容性别名在导入 sqlalchemy.orm 期间安装在 sqlalchemy.exc 中。
[no_tags] ¶
sqlalchemy.logging 已重命名为 sqlalchemy.log。
[no_tags] ¶
已移除 sqlalchemy.exc 中警告定义的过渡性 sqlalchemy.log.SADeprecationWarning 别名。
[no_tags] ¶
exc.AssertionError 已移除,用法已替换为 Python 内置的 AssertionError。
[no_tags] ¶
已更改附加到单个类的多个 entity_name= 主 mapper 的 MapperExtensions 的行为。 为类定义的第一个 mapper() 是唯一有资格获得 MapperExtension ‘instrument_class’、‘init_instance’ 和 ‘init_failed’ 事件的 mapper。 这是向后不兼容的; 以前,最后定义的 mapper 的扩展会接收这些事件。
[firebird] ¶
添加了对从插入(仅限 2.0+)、更新和删除(仅限 2.1+)返回值功能的支持。
[postgres] ¶
为 Postgres 添加了索引反射支持,使用了我们长期忽略的、由 Ken Kuhlman 提交的优秀补丁。
参考链接: #714
flambé! 龙和 The Alchemist 图像设计由 Rotem Yaari 创作并慷慨捐赠。
使用 Sphinx 7.2.6 创建。 文档最后生成时间:2025 年 3 月 11 日星期二下午 02:40:17 EDT