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.5 更新日志
- 下一篇: 0.3 更新日志
- 向上: 首页
- 本页目录
0.4 更新日志¶
0.4.8¶
发布日期: 2008年10月12日 星期日orm¶
sql¶
mysql¶
sqlite¶
[sqlite] ¶
提供了一个自定义的 strftime() 函数,用于处理 1900 年之前的日期。
参考: #968
[sqlite] ¶
在 sqlite 方言中禁用了 String (以及 Unicode、UnicodeText 等) 的 convert_unicode 逻辑,以适应 pysqlite 2.5.0 的新要求,即只接受 Python unicode 对象; https://web.archive.org/web/20090614054912/https://itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html
oracle¶
0.4.7p1¶
发布日期: 2008年7月31日 星期四orm¶
0.4.7¶
发布日期: 2008年7月26日 星期六orm¶
[orm] ¶
当与多对多关系一起使用时,contains() 运算符将别名化 (alias()) 关联表,以便多个 contains() 调用不会相互冲突
参考: #1058
[orm] ¶
修复了阻止 merge() 与 comparable_property() 结合使用的错误
[orm] ¶
relation() 上的 enable_typechecks=False 设置现在仅允许具有继承映射器的子类型。完全不相关的类型,或未针对目标映射器设置映射器继承的子类型仍然不允许。
[orm] ¶
向 Sessions 添加了 is_active 标志,以检测事务何时正在进行中。对于 “transactional” (在 0.5 中为非 “autocommit”) Session,此标志始终为 True。
参考: #976
sql¶
[sql] ¶
修复了调用 select([literal(‘foo’)]) 或 select([bindparam(‘foo’)]) 时的错误。
schema¶
mysql¶
[mysql] ¶
将 “CALL” 添加到返回结果行的 SQL 关键字列表中。
oracle¶
[oracle] ¶
Oracle get_default_schema_name() 在返回之前 “规范化” 名称,这意味着当标识符被检测为不区分大小写时,它会返回小写名称。
[oracle] ¶
创建/删除表时,在搜索现有表时会考虑模式名称,以便其他所有者命名空间中具有相同名称的表不会冲突
参考: #709
[oracle] ¶
Cursors 现在默认将 “arraysize” 设置为 50,该值可以使用 Oracle 方言的 create_engine() 的 “arraysize” 参数进行配置。这是为了考虑 cx_oracle 的默认设置 “1”,这会导致向 Oracle 发送多次往返。这实际上与 BLOB/CLOB 绑定游标配合良好,其中有任意数量的游标可用,但仅在行请求的生命周期内 (因此仍然需要 BufferedColumnRow,但程度较低)。
参考: #1062
[oracle] ¶
- sqlite
添加 SLFloat 类型,该类型与 SQLite REAL 类型 affinity 匹配。以前,仅提供满足 NUMERIC affinity 的 SLNumeric,但这与 REAL 不同。
misc¶
0.4.6¶
发布日期: 2008年5月10日 星期六orm¶
[orm] ¶
修复了最近 relation() 重构中的一个问题,该问题修复了在本地表和远程表之间多次连接的 exotic viewonly 关系,连接之间共享一个公共列。
[orm] ¶
还重新建立了跨多个表连接的 viewonly relation() 配置。
[orm] ¶
添加了实验性的 relation() 标志,以帮助跨函数等的 primaryjoins,_local_remote_pairs=[tuples]。这补充了复杂的 primaryjoin 条件,允许您提供构成关系本地和远程侧的单个列对。还改进了延迟加载 SQL 生成,以处理将绑定参数放置在函数和其他表达式内部。(部分进展 towards)
参考: #610
[orm] ¶
修复了单表继承,这样您可以从连接表继承映射器进行单表继承,而不会出现问题。
参考: #1036
[orm] ¶
修复了如果发生子句适配,则可能在 Query.order_by() 中发生的 “连接元组” 错误。
参考: #1027
[orm] ¶
删除了关于映射的可选对象需要 “别名名称” 的旧断言 - 如果不存在别名,映射器现在会创建自己的别名。虽然在这种情况下,您需要使用类,而不是映射的可选对象,作为列属性的来源 - 因此仍然会发出警告。
[orm] ¶
修复了涉及继承的 “exists” 函数 (any()、has()、~contains());完整的目标连接将呈现到 EXISTS 子句中,用于链接到子类的关系。
[orm] ¶
当扩展存在且仅返回单个实体结果时,恢复了对主查询行的 append_result() 扩展方法的使用。
[orm] ¶
还重新建立了跨多个表连接的 viewonly relation() 配置。
[orm] ¶
删除了关于映射的可选对象需要 “别名名称” 的旧断言 - 如果不存在别名,映射器现在会创建自己的别名。虽然在这种情况下,您需要使用类,而不是映射的可选对象,作为列属性的来源 - 因此仍然会发出警告。
[orm] ¶
改进了 mapper._save_obj(),它在 flush 期间不必要地调用了标量值上的 __ne__()
参考: #1015
[orm] ¶
向 eager loading 添加了一个功能,即当实例是 eager join 的一部分时,将设置为具有显式标签名称 (这不是必要的,顺便说一句) 的 column_property() 的子查询的标签匿名化,以防止与父对象上同名的子查询或列冲突。
参考: #1019
[orm] ¶
基于集合的集合 |=、-=、^= 和 &= 对其操作数更加严格,并且仅对集合、冻结集合或集合类型的子类进行操作。以前,它们会接受任何鸭子类型的集合。
[orm] ¶
添加了一个示例 dynamic_dict/dynamic_dict.py,说明了一种在 dynamic_loader 之上放置字典行为的简单方法。
sql¶
mssql¶
这应该消除将来添加大量 ODBC 选项的需求。
misc¶
[declarative] [extension] ¶
连接表继承映射器使用略微宽松的函数来创建到父表的 “继承条件”,以便到尚未声明的 Table 对象的其他外键不会触发错误。
[declarative] [extension] ¶
修复了在 ForeignKey 中使用声明的属性时 (即 ForeignKey(MyOtherClass.someattribute)),重入映射器编译挂起的问题
[engines] ¶
Pool 监听器现在可以作为可调用对象的字典或 PoolListener 的 (可能是部分的) 鸭子类型提供,您可以选择。
[engines] ¶
向 Pool 添加了 “rollback_returned” 选项,该选项将在连接返回时禁用发出的 rollback()。此标志仅在不支持事务的数据库 (即 MySQL/MyISAM) 中使用才是安全的。
[ext] ¶
基于集合的关联代理 |=、-=、^= 和 &= 对其操作数更加严格,并且仅对集合、冻结集合或其他关联代理进行操作。以前,它们会接受任何鸭子类型的集合。
[firebird] ¶
处理 “SUBSTRING(:string FROM :start FOR :length)” 内置函数。
0.4.5¶发布日期: 2008年4月4日 星期五
orm¶
[orm] ¶
session.merge() 行为的一个小变化 - 基于主键属性 (不一定是 _instance_key) 检查现有对象。因此,广泛要求的功能,即
x = MyObject(id=1) x = sess.merge(x)
如果存在,实际上将从数据库加载 id 为 #1 的 MyObject,现在可用。 merge() 仍然将给定对象的状态复制到持久对象,因此像上面这样的示例通常会将 “None” 从 “x” 的所有属性复制到持久副本。这些可以使用 session.expire(x) 恢复。
[orm] ¶
还修复了 merge() 中的行为,其中目标上存在但合并集合中不存在的集合元素未从目标中删除。
[orm] ¶
为 “未编译的映射器” 添加了更积极的检查,特别有助于声明层
参考: #995
[orm] ¶
“primaryjoin”/“secondaryjoin” 背后的方法已被重构。行为应该稍微更智能一些,主要是在错误消息方面,错误消息已被简化为更易于阅读。在少数情况下,它可以比以前更好地解析正确的外键。
[orm] ¶
添加了 comparable_property(),为常规的、未管理的 Python 属性添加了查询 Comparator 行为
[orm] [‘machines’] [Company.employees.of_type(Engineer)] ¶
- query.with_polymorphic() 的功能已作为配置选项添加到 mapper() 中。
它通过几种形式设置
with_polymorphic=’*’ with_polymorphic=[mappers] with_polymorphic=(‘*’, selectable) with_polymorphic=([mappers], selectable)
这控制了继承映射器的默认多态加载策略。当未给出 selectable 时,将为请求的所有连接表继承映射器创建外连接。请注意,join 的自动创建与具体表继承不兼容。
mapper() 上的现有 select_table 标志现在已弃用,并且与 with_polymorphic(‘*’, select_table) 同义。请注意,select_table 的底层 “内部结构” 已被完全删除,并替换为更新、更灵活的方法。
sess.query(Company).options(eagerload_all())
新方法还自动允许 eager load 用于子类 (如果存在),例如
加载 Company 对象、其 employees 以及恰好是 Engineer 的 employees 的 ‘machines’ 集合。很快也将引入 “with_polymorphic” Query 选项,这将允许对关系上的 with_polymorphic() 进行按查询控制。
[orm] ¶
向 Query 添加了两个 “实验性” 功能,“实验性” 在于它们的具体名称/行为尚未最终确定: _values() 和 _from_self()。我们希望收到关于这些的反馈。
_values(*columns) 接收列表达式列表,并返回一个新的 Query,该 Query 仅返回这些列。评估后,返回值是一个元组列表,就像使用 add_column() 或 add_entity() 时一样,唯一的区别是 “实体零”,即映射的类,不包含在结果中。这意味着最终可以使用 Query 上的 group_by() 和 having(),它们到现在为止一直无用。
此方法的未来更改可能包括删除其连接、筛选和允许其他与 “resultset” 无关的选项的功能,因此我们正在寻求的反馈是人们希望如何使用 _values()…即在最后,还是人们更喜欢在调用它之后继续生成。
_from_self() 编译 Query 的 SELECT 语句 (减去任何 eager loader),并返回一个新的 Query,该 Query 从该 SELECT 中选择。因此,基本上您可以从 Query 查询,而无需手动提取 SELECT 语句。这为诸如 query[3:5]._from_self().filter(some criterion) 之类的操作赋予了意义。这里没有太多争议,除了您可以快速创建效率较低的高度嵌套查询之外,我们希望获得关于命名选择的反馈。
[orm] ¶
query.order_by() 和 query.group_by() 将接受使用 *args 的多个参数 (就像 select() 已经做的那样)。
[orm] ¶
向 Query 添加了一些方便的描述符: query.statement 返回完整的 SELECT 构造,query.whereclause 仅返回 SELECT 构造的 WHERE 部分。
[orm] ¶
修复/覆盖了使用 False/0 值作为多态鉴别器的情况。
[orm] ¶
修复了阻止 synonym() 属性与继承一起使用的错误
[orm] ¶
修复了 SQL 函数截断尾随下划线的问题
参考: #996
[orm] ¶
当挂起实例上的属性过期时,如果触发 “刷新” 操作但未找到结果,则不会引发错误。
[orm] ¶
Session.execute 现在可以从元数据中找到 binds
[orm] ¶
调整了 “自引用” 的定义,使其成为具有共同父级的任何两个映射器 (这会影响在使用 Query 连接时是否需要 aliased=True)。
[orm] ¶
对 query.join() 的 “from_joinpoint” 参数进行了一些修复,以便如果之前的 join 是别名化的,而这个不是,则 join 仍然成功发生。
- [orm] ¶
各种 “级联删除” 修复
修复了动态关系的 “级联删除” 操作,该操作仅在 0.4.2 中为外键空值行为实现,而不是实际的级联删除
在父项上调用 session.delete() 之前,从父项断开连接的孤立项,在多对一关系上进行不带 delete-orphan 级联的删除级联将不会删除孤立项 (一对一关系已经具有此功能)。
带有 delete-orphan 的删除级联将删除孤立项,无论它是否仍然附加到其也已删除的父项。
当在继承中使用时,在超类上存在的关系上正确检测到 delete-orphan 级联。
参考: #895
[orm] ¶
修复了 Query 中的 order_by 计算,以便在使用 select_from() 时正确别名化 mapper-config’ed order_by
[orm] ¶
将替换一个集合与另一个集合时的 diffing 逻辑重构为 collections.bulk_replace,这对任何构建多级集合的人都很有用。
[orm] ¶
级联遍历算法从递归转换为迭代,以支持深度对象图。
sql¶
[sql] ¶
schema 限定的表现在所有列表达式中以及生成列标签时,都将模式名称放在表名称之前。这可以防止所有情况下的跨模式名称冲突
参考: #999
[sql] ¶
现在可以允许关联所有 FROM 子句且自身没有 FROM 的 select。这些通常在标量上下文中使用,即 SELECT x, (SELECT x WHERE y) FROM table。需要显式的 correlate() 调用。
[sql] ¶
’name’ 不再是 Column() 的必需构造函数参数。它 (和 .key) 现在可以推迟到将列添加到 Table 时。
[sql] ¶
like()、ilike()、contains()、startswith()、endswith() 接受可选的关键字参数 “escape=<somestring>”,该参数使用语法 “x LIKE y ESCAPE ‘<somestring>’” 设置为转义字符。
[sql] ¶
random() 现在是一个通用的 sql 函数,如果存在,它将编译为数据库的随机实现。
[sql] ¶
update().values() 和 insert().values() 接受关键字参数。
[sql] ¶
[sql] ¶
现在 case() 函数也接受字典作为其 whens 参数。它还将 “THEN” 表达式默认解释为值,这意味着 case([(x==y, “foo”)]) 会将 “foo” 解释为绑定值,而不是 SQL 表达式。在这种情况下,对于字面 SQL 表达式,请使用 text(expr)。对于标准本身,只有在存在 “value” 关键字时,这些才能是字面字符串,否则 SA 将强制显式使用 text() 或 literal()。
mysql¶
[mysql] ¶
连接的 connection.info 键,方言用于缓存服务器设置,已更改,现在使用命名空间。
mssql¶
[mssql] ¶
反射表现在将自动加载由自动加载表中的外键引用的其他表。
参考: #979
[mssql] ¶
添加了 executemany 检查以跳过身份获取。
参考: #916
[mssql] ¶
为 small date 类型添加了存根。
参考: #884
[mssql] ¶
为 pyodbc 方言添加了一个新的 ‘driver’ 关键字参数。如果给定,将替换到 ODBC 连接字符串中,默认为 ‘SQL Server’。
[mssql] ¶
为 pyodbc 方言添加了一个新的 ‘max_identifier_length’ 关键字参数。
[mssql] ¶
改进了 pyodbc + Unix 的兼容性。如果您之前无法使该组合正常工作,请再次尝试。
oracle¶
[oracle] ¶
Table 上的 “owner” 关键字现已弃用,并且与 “schema” 关键字完全同义。现在可以使用备用 “owner” 属性反射表,无论是否在 Table 对象上显式声明,或者是否使用 “schema”。
[oracle] ¶
默认情况下,表反射期间对同义词、DBLINK 等的所有 “魔法” 搜索都已禁用,除非您在 Table 对象上指定 “oracle_resolve_synonyms=True”。解析同义词必然会导致一些混乱的猜测,我们宁愿默认关闭它。当设置此标志时,表和相关表将在所有情况下针对同义词进行解析,这意味着如果特定表存在同义词,则反射将在反射相关表时使用它。这比以前的行为更具粘性,这就是为什么默认情况下它是关闭的。
misc¶
[declarative] [extension] ¶
“synonym” 函数现在可以直接与 “declarative” 一起使用。使用 “descriptor” 关键字参数传入修饰的属性,例如:somekey = synonym(‘_somekey’, descriptor=property(g, s))
[declarative] [extension] ¶
“deferred” 函数可与 “declarative” 一起使用。最简单的用法是将 deferred 和 Column 一起声明,例如:data = deferred(Column(Text))
[declarative] [extension] ¶
Declarative 还获得了 @synonym_for(…) 和 @comparable_using(…),分别是 synonym 和 comparable_property 的前端。
[declarative] [extension] ¶
改进了使用 declarative 时映射器编译;已编译的映射器在使用时仍会触发其他未编译映射器的编译
为 “未编译的映射器” 添加了更积极的检查,特别有助于声明层
[declarative] [extension] ¶
Declarative 将完成对缺少名称的 Column 的设置,从而允许更 DRY 的语法。
- class Foo(Base)
__tablename__ = ‘foos’ id = Column(Integer, primary_key=True)
[declarative] [extension] ¶
当向 __mapper_args__ 发送 “inherits=None” 时,可以禁用 declarative 中的继承。
[declarative] [extension] ¶
declarative_base() 接受可选的 kwarg “mapper”,它可以是任何可调用对象/类/方法,用于生成映射器,例如 declarative_base(mapper=scopedsession.mapper)。此属性也可以使用 “__mapper_cls__” 属性在各个 declarative 类上设置。
[postgres] ¶
使 PG 服务器端游标恢复正常,作为默认测试套件的一部分添加了固定的单元测试。为游标 ID 添加了更好的唯一性
参考: #1001
0.4.4¶
发布日期:2008 年 3 月 12 日星期三orm¶
[orm] ¶
any()、has()、contains()、~contains()、属性级别的 == 和 != 现在可以与自引用关系正确地工作 - EXISTS 内部的子句在 “remote” 端被别名,以将其与父表区分开来。这适用于单表自引用以及基于继承的自引用。
[orm] ¶
修复了针对一对一关系与 NULL 进行比较时,relation() 级别的 == 和 != 运算符的行为
参考: #985
[orm] ¶
修复了 session.expire() 属性未在由 select_table 映射器映射的多态映射实例上加载的错误。
[orm] ¶
添加了 query.with_polymorphic() - 指定从基类派生的类列表,这些类将被添加到查询的 FROM 子句中。允许在 filter() 标准中使用子类,并急切加载这些子类的属性。
[orm] ¶
您们的呼声已被听到:从具有 delete-orphan 的属性或集合中删除挂起项会将该项从会话中清除;不会引发 FlushError。请注意,如果您显式地 session.save() 了挂起项,则属性/集合删除仍然会将其删除。
[orm] ¶
当在会话中不是持久实例上调用 session.refresh() 和 session.expire() 时,会引发错误
[orm] ¶
修复了当使用相同的 Query 来生成多个使用 join() 的 Query 对象时,可能存在的生成错误。
[orm] ¶
修复了 0.4.3 中引入的错误,即当使用默认的 “select” polymorphic_fetch 时,加载使用连接表继承映射的已持久实例会触发从其连接表的无用 “secondary” 加载。这是由于属性在其第一次加载期间被标记为已过期,并且没有从之前的 “secondary” 加载中取消标记。现在,在任何加载或提交操作成功后,属性都会根据 __dict__ 中的存在情况取消过期。
[orm] ¶
弃用了 Query 方法 apply_sum()、apply_max()、apply_min()、apply_avg()。更好的方法即将到来……
[orm] ¶
relation() 可以接受一个可调用对象作为其第一个参数,该对象返回要关联的类。这是为了帮助声明式包在类尚未就位的情况下定义关系。
[orm] ¶
添加了一个新的 “更高层次” 的运算符,称为 “of_type()”:在 join() 以及 any() 和 has() 中使用,用于限定将在 filter 标准中使用的子类,例如
- query.filter(Company.employees.of_type(Engineer).
any(Engineer.name==’foo’))
或
- query.join(Company.employees.of_type(Engineer)).
filter(Engineer.name==’foo’)
[orm] ¶
防止 flush() 中潜在的引用丢失错误的预防性代码。
[orm] ¶
在 filter()、filter_by() 和其他函数中使用的表达式,当它们使用从关系生成的子句并使用子对象的标识时(例如,filter(Parent.child==<somechild>)),会在执行时评估 <somechild> 的实际主键值,以便 Query 的 autoflush 步骤可以完成,从而在 <somechild> 挂起的情况下填充 <somechild> 的 PK 值。
[orm] ¶
将 relation() 级别的 order by 设置为多对多 “secondary” 表中的列现在可以与急切加载一起使用,以前 “order by” 没有针对 secondary 表的别名。
[orm] ¶
位于现有描述符之上的同义词现在是这些描述符的完整代理。
sql¶
[sql] ¶
可以再次针对文本 FROM 子句创建 select 的别名。
参考: #975
[sql] ¶
bindparam() 的值可以是可调用对象,在这种情况下,它会在语句执行时进行评估以获取该值。
[sql] ¶
为结果集获取添加了异常包装/重新连接支持。重新连接适用于在结果期间引发可捕获数据错误的数据库(即,不适用于 MySQL)
参考: #978
[sql] ¶
为 “threadlocal” 引擎实现了两阶段 API,通过 engine.begin_twophase()、engine.prepare()
参考: #936
[sql] ¶
修复了阻止 UNIONS 被克隆的错误。
参考: #986
[sql] ¶
为 insert()、update()、delete() 和 DDL() 添加了 “bind” 关键字参数。 .bind 属性现在可以在这些语句以及 select() 上分配。
[sql] ¶
现在可以使用 INSERT 和 INTO 之间的额外 “prefix” 单词编译 Insert 语句,用于供应商扩展,例如 MySQL 的 INSERT IGNORE INTO table。
extensions¶
[extensions] ¶
添加了一个新的超小 “declarative” 扩展,它允许在类声明下内联进行 Table 和 mapper() 配置。此扩展与 ActiveMapper 和 Elixir 的不同之处在于,它根本不重新定义任何 SQLAlchemy 语义;字面 Column、Table 和 relation() 构造用于定义类行为和表定义。
misc¶
0.4.3¶
发布日期:2008 年 2 月 14 日星期四general¶
orm¶
[orm] ¶
每个 Session.begin() 现在都必须伴随相应的 commit() 或 rollback(),除非会话使用 Session.close() 关闭。 这也包括隐式于以 transactional=True 创建的会话的 begin()。 这里引入的最大变化是,当以 transactional=True 创建的 Session 在 flush() 期间引发异常时,您必须调用 Session.rollback() 或 Session.close(),以便该 Session 在异常后继续运行。
[orm] ¶
修复了当合并具有反向引用集合的瞬态实体时,merge() 集合加倍错误。
参考: #961
[orm] ¶
merge(dont_load=True) 不接受瞬态实体,这与 merge(dont_load=True) 也不接受任何 “dirty” 对象的事实相符。
[orm] ¶
添加了由 scoped_session 生成的独立 “query” 类属性。这提供了 MyClass.query 而无需使用 Session.mapper。通过以下方式使用
MyClass.query = Session.query_property()
[orm] ¶
当尝试访问不存在会话的过期实例属性时,会引发正确的错误消息
[orm] ¶
dynamic_loader() / lazy=”dynamic” 现在接受并使用 order_by 参数,其方式与 relation() 中的工作方式相同。
[orm] ¶
向 Session 添加了 expire_all() 方法。为所有持久实例调用 expire()。这与……结合使用很方便
[orm] ¶
已部分或完全过期的实例将在影响这些对象的常规 Query 操作期间填充其过期的属性,从而防止每个实例的不必要的第二个 SQL 语句。
[orm] ¶
动态关系在被引用时,会创建对父对象的强引用,以便即使父对象仅在单个表达式的范围内创建(并在其他情况下取消引用),查询仍然有一个父对象可以调用。
参考: #938
[orm] ¶
添加了 mapper() 标志 “eager_defaults”。当设置为 True 时,在 INSERT 或 UPDATE 操作期间生成的默认值会立即进行后获取,而不是延迟到以后。这模仿了旧的 0.3 行为。
[orm] ¶
query.join() 现在可以接受类映射属性作为参数。这些可以代替字符串或与字符串组合使用。特别是,这允许构建连接到多态关系上的子类,即
query(Company).join([‘employees’, Engineer.name])
[orm] [(‘employees’] [Engineer.name] [people.join(engineer))] ¶
query.join() 也可以接受属性名称/某些可选择对象的元组作为参数。这允许从多态关系的子类构建连接,即
query(Company).join(
)
[orm] ¶
总体改进了 join() 与多态映射器结合使用时的行为,即从/到多态映射器进行连接并正确应用别名。
[orm] ¶
修复/改进了当映射器确定映射连接的自然 “主键” 时的行为,它将更有效地减少通过外键关系等效的列。这影响了需要发送到 query.get() 的参数数量,以及其他方面。
参考: #933
[orm] ¶
惰性加载器现在可以处理连接条件,其中 “绑定” 列(即,获取作为绑定参数发送的父 ID 的列)在连接条件中出现多次。特别是,这允许包含父相关子查询的 relation() 的常见任务,例如 “仅选择最新的子项”。
参考: #946
[orm] ¶
修复了多态继承中的错误,即当基本 polymorphic_on 列与继承映射器(深度超过一层)的本地可选择项中的任何列都不对应时,会引发不正确的异常
[orm] ¶
修复了多态继承中的错误,该错误使在多态映射器上设置有效的 “order_by” 变得困难。
[orm] ¶
修复了 Query 中一个相当昂贵的调用,该调用减慢了多态查询的速度。
[orm] ¶
“被动默认值” 和其他 “内联” 默认值现在可以在 flush() 调用期间根据需要加载;特别是,这允许构建 relation(),其中外键列引用服务器端生成的非主键列。
参考: #954
[orm] ¶
- 其他 Session 事务修复/更改
修复了会话事务管理中的错误:当向嵌套事务添加连接时,父事务未在连接上启动。
session.transaction 现在始终引用最内层的活动事务,即使直接在会话事务对象上调用 commit/rollback 也是如此。
两阶段事务现在可以准备。
当准备两阶段事务在一个连接上失败时,所有连接都将被回滚。
当使用嵌套事务时,session.close() 未关闭所有事务。
rollback() 之前错误地将当前事务直接设置为可以回滚到的事务的父级。现在,它会回滚下一个可以处理它的事务,但会将当前事务设置为其父级并使中间的事务无效。无效事务只能回滚或关闭,任何其他调用都会导致错误。
commit() 的 autoflush 没有为简单的子事务刷新。
当会话不在事务中且提交事务失败时,unitofwork flush 没有关闭失败的事务。
[orm] ¶
其他问题
sql¶
[sql] ¶
添加了 “schema.DDL”,一个可执行的自由格式 DDL 语句。 DDL 可以隔离执行,也可以附加到 Table 或 MetaData 实例,并在创建和/或删除这些对象时自动执行。
[sql] ¶
可以使用 ‘useexisting=True’ 标志在现有表(例如已反射的表)上覆盖表列和约束,现在它会考虑随之传递的参数。
[sql] ¶
添加了基于可调用对象的 DDL 事件接口,在 Tables 和 MetaData 创建和删除之前和之后添加了钩子。
[sql] ¶
为 delete() 和 update() 构造添加了生成式的 where(<criterion>) 方法,该方法返回一个新对象,其标准通过 AND 连接到现有标准,就像 select().where() 一样。
[sql] ¶
为列操作添加了 “ilike()” 运算符。在 postgres 上编译为 ILIKE,在所有其他数据库上编译为 lower(x) LIKE lower(y)。
参考: #727
[sql] ¶
添加了 “now()” 作为通用函数;在 SQLite、Oracle 和 MSSQL 上编译为 “CURRENT_TIMESTAMP”;在所有其他数据库上编译为 “now()”。
参考: #943
[sql] ¶
startswith()、endswith() 和 contains() 运算符现在将通配符运算符与 SQL 中给定的操作数连接起来,即在所有情况下都是 “’%’ || <bindparam>”,并正确接受 text(‘something’) 操作数
参考: #962
[sql] ¶
cast() 正确接受 text(‘something’) 和其他非字面操作数
参考: #962
[sql] ¶
修复了结果代理中的错误,其中匿名生成的列标签无法使用其直接字符串名称访问
[sql] ¶
现在可以定义可延迟约束。
[sql] ¶
为 select() 和 text() 添加了 “autocommit=True” 关键字参数,以及 select() 上的生成式 autocommit() 方法;用于通过一些用户定义的方式(而不是通常的 INSERT/UPDATE/DELETE 等)修改数据库的语句。如果未进行事务处理,则此标志将在执行期间启用 “autocommit” 行为。
参考: #915
[sql] ¶
可选择项上的 ‘.c.’ 属性现在为其列子句中的每个列表达式获取一个条目。以前,“未命名” 列(如函数和 CASE 语句)未放置在那里。现在它们将被放置在那里,如果名称不可用,则使用其完整的字符串表示形式。
[sql] ¶
CompositeSelect,即任何 union()、union_all()、intersect() 等,现在断言每个可选择项都包含相同数量的列。这符合相应的 SQL 要求。
[sql] ¶
为原本未标记的函数和表达式生成的匿名 ‘label’ 现在会在编译时向外传播,用于诸如 select([select([func.foo()])]) 之类的表达式。
[sql] ¶
在上述想法的基础上,CompositeSelect 现在仅基于第一个可选择项中存在的名称构建其 “.c.” 集合; corresponding_column() 现在完全适用于所有嵌入的可选择项。
[sql] ¶
Oracle 和其他数据库正确编码用于默认值(如序列等)的 SQL,即使未使用 Unicode 标识符,因为标识符准备器可能会返回缓存的 Unicode 标识符。
[sql] ¶
列和子句与表达式左侧的 datetime 对象进行比较现在可以工作 (d < table.c.col)。 (RHS 上的 datetime 一直可以工作,LHS 异常是 datetime 实现的怪癖。)
misc¶
[dialects] ¶
更好地支持 SQLite 中的模式(通过 ATTACH DATABASE … AS name 链接)。在过去的一些情况下,SQLite 生成的 SQL 中省略了模式名称。这种情况不再存在。
[dialects] ¶
SQLite 上的 table_names 现在也拾取临时表。
[dialects] ¶
自动检测反射操作期间未指定的 MySQL ANSI_QUOTES 模式,支持在中间流更改模式。如果未使用反射,仍然需要手动模式设置。
[dialects] ¶
修复了 SQLite 上 TIME 列的反射。
[dialects] ¶
最终将 PGMacAddr 类型添加到 postgres
参考: #580
[dialects] ¶
在 Firebird 下反射与 PK 字段关联的序列(通常带有 BEFORE INSERT 触发器)
[dialects] ¶
当生成 LIMIT/OFFSET 子查询时,Oracle 在结果集列映射中组装正确的列,即使长名称截断生效,也允许列正确映射到结果集
参考: #941
[dialects] ¶
MSSQL 现在在 _is_select regexp 中包含 EXEC,这应该允许使用返回行的存储过程。
[dialects] ¶
MSSQL 现在包含使用 ANSI SQL row_number() 函数的 LIMIT/OFFSET 的实验性实现,因此它需要 MSSQL-2005 或更高版本。要启用此功能,请将 “has_window_funcs” 添加到 connect 的关键字参数,或将 “?has_window_funcs=1” 添加到您的 dburi 查询参数。
[ext] ¶
更改了 ext.activemapper 以对 objectstore 使用非事务性会话。
[ext] ¶
修复了关联代理列表上 “[‘a’] + obj.proxied” 二进制操作的输出顺序。
0.4.2p3¶
发布日期:2008 年 1 月 9 日星期三general¶
[general] ¶
子版本编号方案已更改以适应 setuptools 版本号规则; easy_install -u 现在应该获得此版本而不是 0.4.2。
orm¶
[orm] ¶
修复了使用 “mutable scalars”(例如 PickleTypes)时 session.dirty 的错误
[orm] ¶
当在 relation() 上刷新时添加了更具描述性的错误消息,该 relation() 在其主连接或辅助连接条件中具有非本地映射的列
[orm] ¶
现在禁止在
InstanceState.__cleanup()
中显示所有错误。[orm] ¶
修复了一个属性历史错误,当将新集合分配给已存在待处理更改的基于集合的属性时,会导致生成不正确的历史记录
参考: #922
[orm] ¶
修复了
delete-orphan
级联错误,即当对标量属性重复设置同一对象两次时,可能将其记录为孤立对象参考: #925
[orm] ¶
修复了对基于列表的关系执行
+=
赋值时的级联操作。[orm] ¶
现在可以针对尚不存在的属性创建同义词,这些属性稍后通过
add_property()
添加。这通常包括反向引用。(即,您可以为反向引用创建同义词,而无需担心操作顺序)参考: #919
[orm] ¶
修复了多态 “union” 映射器可能出现的错误,该映射器会回退到继承表的 “deferred” 加载
[orm] ¶
在多态 “union” 加载的情况下,映射器/映射类上的 “columns” 集合 (即 ‘c’) 针对的是映射表,而不是
select_table
(这应该是不明显的)。[orm] ¶
修复了一个相当严重的错误,即同一个实例可能在
unitofwork.new
集合中列出多次;最常见的情况是在结合使用继承映射器和ScopedSession.mapper
时重现,因为每个实例的多个__init__
调用可能会使用不同的_state
对象save()
该对象[orm] ¶
为
Query
添加了非常基本的屈服迭代器行为。调用query.yield_per(
并在迭代上下文中评估) Query
;每 N 行的集合将被打包并屈服。极其谨慎地使用此方法,因为它不会尝试协调跨结果批次边界急切加载的集合,如果同一个实例出现在多个批次中,它的行为也不会很好。这意味着,如果急切加载的集合在多个批次中被引用,它将被清除,并且在所有情况下,属性将被覆盖在多个批次中出现的实例上。[orm] ¶
修复了集合集合和关联代理集合的就地集合突变运算符。
参考: #920
sql¶
[sql] ¶
Text
类型现在已正确导出,并且在 DDL 创建时不会引发警告;没有长度的String
类型仅在CREATE TABLE
期间引发警告参考: #912
[sql] ¶
添加了新的
UnicodeText
类型,用于指定编码的、无长度的Text
类型[sql] ¶
修复了
union()
中的错误,以便可以联合不从FromClause
对象派生的select()
语句[sql] ¶
将
TEXT
的名称更改为Text
,因为它是 “通用” 类型;在 0.5 版本之前,TEXT
名称已弃用。在 0.5 版本之前,当不存在长度时,将String
“升级” 为Text
的行为也被弃用;当用于CREATE TABLE
语句时,将发出警告(对于 SQL 表达式用途,没有长度的String
仍然可以)参考: #912
[sql] ¶
生成式
select.order_by(None)
/group_by(None)
未能重置 order by/group by 条件,已修复参考: #924
misc¶
0.4.2¶
发布日期:2008 年 1 月 2 日星期三orm¶
[orm] ¶
对基于集合的反向引用进行了重大行为更改:它们不再触发延迟加载! “反向” 添加和删除操作被排队,并在实际读取和加载集合时与集合合并;但不会提前触发加载。对于已经注意到此行为的用户,这应该比在某些情况下使用动态关系更方便;对于那些没有注意到的用户,您可能会注意到您的应用程序在某些情况下使用的查询要少得多。
参考: #871
[orm] ¶
添加了可变主键支持。主键列可以自由更改,实例的标识将在刷新时更改。此外,还支持沿关系的外部键引用(主键或非主键)的更新级联,可以与数据库的
ON UPDATE CASCADE
(Postgres 等数据库需要)结合使用,也可以通过 ORM 直接以UPDATE
语句的形式发出,通过设置标志passive_cascades=False
。[orm] ¶
继承映射器现在直接继承其父映射器的
MapperExtensions
,以便也为子类调用特定MapperExtension
的所有方法。与往常一样,任何MapperExtension
都可以返回EXT_CONTINUE
以继续扩展处理,或返回EXT_STOP
以停止处理。映射器解析的顺序是:
。<全局声明的扩展> 请注意,如果您分别实例化同一个扩展类,然后将其单独应用于同一继承链中的两个映射器,则该扩展将应用于继承类两次,并且每个方法将被调用两次。
要将映射器扩展显式应用于每个继承类,但每个操作仅调用每个方法一次,请对两个映射器使用相同的扩展实例。
参考: #490
[orm] ¶
MapperExtension.before_update()
和after_update()
现在对称调用;以前,没有修改的列属性的实例(但具有relation()
修改)可能会使用before_update()
调用,但不会使用after_update()
调用参考: #907
[orm] ¶
从
Query
的select
语句中缺少的列现在在加载期间会自动延迟。[orm] ¶
扩展 “object” 且不提供
__init__()
方法的映射类,如果在实例构造时存在非空的*args
或**kwargs
(并且未被任何扩展(例如scoped_session
映射器)使用),则现在将引发TypeError
,这与普通 Python 类的行为一致参考: #908
[orm] ¶
修复了当
filter_by()
将关系与None
进行比较时的Query
错误参考: #899
[orm] ¶
改进了映射实体的 pickle 支持。每个实例的延迟/延迟/过期可调用对象现在是可序列化的,以便它们与
_state
一起序列化和反序列化。[orm] ¶
新的
synonym()
行为:如果映射类上尚不存在属性,则在所有情况下都会放置属性。如果类上已存在属性,则同义词将使用适当的比较运算符修饰该属性,以便它可以像任何其他映射属性一样在列表达式中使用(即可在filter()
等中使用)。proxy=True
标志已弃用,不再有任何意义。此外,标志map_column=True
将自动生成与同义词名称对应的ColumnProperty
,例如:'somename':synonym('_somename', map_column=True)
将列名为'somename'
的列映射到属性'_somename'
。请参阅映射器文档中的示例。参考: #801
[orm] ¶
Query.select_from()
现在将所有现有的FROM
条件替换为给定的参数;以前构造FROM
子句列表的行为通常没有用,因为需要filter()
调用来创建 join 条件,并且在filter()
中引入的新表已经将自己添加到FROM
子句。新行为不仅允许从主表进行连接,还允许从 select 语句进行连接。Filter 条件、order bys、急切加载子句将针对给定的语句进行 “别名化”。[orm] ¶
本月对属性检测的重构更改了自 0.3 中期以来我们拥有的 “加载时复制” 行为,在大多数情况下变为 “修改时复制”。这从加载操作中消除了一大块延迟,并且总体上减少了工作量,因为只有实际修改的属性才会复制其 “已提交状态”。只有 “可变标量” 属性(即可序列化的对象或其他可变项),这是最初进行加载时复制更改的原因,才保留旧行为。
[orm] [attrname] ¶
对属性的一个小的行为更改是,
del
属性不会再次触发该属性的延迟加载器;“del” 使属性的有效值为 “None”。要重新触发属性的 “加载器”,请使用session.expire(instance,)
。[orm] ¶
当将多对一属性与
None
进行比较时,query.filter(SomeClass.somechild == None)
正确生成 “id IS NULL”,包括 NULL 在右侧。[orm] ¶
query.order_by()
考虑了别名连接,例如query.join('orders', aliased=True).order_by(Order.id)
[orm] ¶
eagerload()
、lazyload()
、eagerload_all()
接受可选的第二个类或映射器参数,这将选择要将选项应用于的映射器。这可以在使用add_entity()
添加的其他映射器之间进行选择。[orm] ¶
急切加载将与通过
add_entity()
添加的映射器一起使用。[orm] ¶
为 “动态” 关系添加了 “级联删除” 行为,就像常规关系一样。如果未设置
passive_deletes
标志(也是刚刚添加的),则删除父项将触发子项的完全加载,以便可以相应地删除或更新它们。[orm] ¶
同样对于动态关系,实现了正确的
count()
行为以及其他辅助方法。[orm] ¶
修复了多态关系的级联,以便从对象到多态集合的级联继续沿着特定于集合中每个元素的属性集级联。
[orm] ¶
query.get()
和query.load()
不考虑现有的过滤器或其他条件;这些方法始终在数据库中查找给定的 id 或从身份映射返回当前实例,而忽略已配置的任何现有过滤器、join、group_by 或其他条件。参考: #893
[orm] ¶
添加了与继承映射器结合使用的
version_id_col
的支持。version_id_col
通常在继承关系中的基本映射器上设置,在所有继承映射器中生效。参考: #883
[orm] ¶
放宽了对具有标签的
column_property()
表达式的规则;现在接受任何ColumnElement
,因为编译器现在会自动标记未标记的ColumnElement
。像select()
语句这样的 selectable 仍然需要通过as_scalar()
或label()
转换为ColumnElement
。[orm] ¶
修复了反向引用错误,如果
attr
为None
,则无法删除instance.attr
[orm] ¶
删除了或私有化了几个 ORM 属性:
mapper.get_attr_by_column()
、mapper.set_attr_by_column()
、mapper.pks_by_table
、mapper.cascade_callable()
、MapperProperty.cascade_callable()
、mapper.canload()
、mapper.save_obj()
、mapper.delete_obj()
、mapper._mapper_registry
、attributes.AttributeManager
[orm] ¶
将不兼容的集合类型分配给关系属性现在会引发
TypeError
而不是 sqlalchemy 的ArgumentError
。[orm] ¶
如果传入字典中的键与集合的
keyfunc
将用于该值的键不匹配,则MappedCollection
的批量赋值现在会引发错误。参考: #886
[orm] [newval1] [newval2] ¶
自定义集合现在可以指定一个
@converter
方法,以将 “批量” 赋值中使用的对象转换为值流,如下所示:obj.col = # or obj.dictcol = {'foo': newval1, 'bar': newval2}
MappedCollection
使用此钩子来确保传入的键/值对从集合的角度来看是合理的。[orm] ¶
修复了在双向关系的双方都使用
lazy="dynamic"
时出现的无限循环问题参考: #872
[orm] ¶
修复了应用于
Query
+ 急切加载的LIMIT/OFFSET
别名的更多问题,在这种情况下,当针对 select 语句进行映射时参考: #904
[orm] ¶
修复了自引用急切加载,这样,如果同一个映射实例在同一个结果集中的两个或多个不同的列集中出现,则其急切加载的集合将被填充,而不管是否所有行都包含该集合的 “急切” 列集。当启用
join_depth
获取结果时,这也将显示为KeyError
。[orm] ¶
修复了当
LIMIT
与继承映射器结合使用时,Query
不会将子查询应用于 SQL 的错误,其中急切加载器仅在父映射器中。[orm] ¶
澄清了当您尝试使用与会话中已存在的实例相同的身份键来
update()
实例时发生的错误消息。[orm] ¶
对
merge(instance, dont_load=True)
进行了一些澄清和修复。修复了在返回的实例上禁用延迟加载器的错误。此外,我们目前不支持合并具有未提交更改的实例,如果使用dont_load=True
... 这现在将引发错误。这是由于合并给定实例的 “已提交状态” 以正确对应于新复制的实例以及其他修改状态的复杂性。由于dont_load=True
的用例是缓存,因此给定的实例无论如何都不应在其上进行任何未提交的更改。我们现在也在不使用任何事件的情况下复制实例,以便新会话上的 ‘dirty’ 列表保持不受影响。[orm] ¶
修复了在结合使用
session.begin_nested()
和多个级别深度的封闭session.begin()
语句时可能出现的错误[orm] ¶
修复了具有自定义
entity_name
的实例的session.refresh()
参考: #914
sql¶
[sql] ¶
通用函数!我们引入了一个已知 SQL 函数的数据库,例如
current_timestamp
、coalesce
,并创建显式函数对象来表示它们。这些对象具有约束的参数列表,具有类型感知能力,并且可以以特定于方言的方式编译。因此,说func.char_length("foo", "bar")
会引发错误(参数过多),func.coalesce(datetime.date(2007, 10, 5), datetime.date(2005, 10, 15))
知道其返回类型是Date
。到目前为止,我们只表示了几个函数,但将继续添加到系统中参考: #615
[sql] ¶
改进了自动重新连接支持;
Connection
现在可以在其底层连接无效后自动重新连接,而无需再次从引擎connect()
。这允许绑定到单个Connection
的 ORM 会话不需要重新连接。在底层连接失效后,必须回滚Connection
上的打开事务,否则会引发错误。还修复了未为cursor()
、rollback()
或commit()
调用断开连接检测的错误。[sql] ¶
为
String
和create_engine()
添加了新标志,assert_unicode=(True|False|'warn'|None)
。在create_engine()
和String
上默认为False
或None
,在Unicode
类型上默认为‘warn’
。当为True
时,当非 unicode 字节串作为绑定参数传递时,会导致所有 unicode 转换操作引发异常。‘warn’
会导致警告。强烈建议所有 unicode 感知的应用程序正确使用 Python unicode 对象(即u'hello'
而不是'hello'
),以便数据准确地往返。[sql] ¶
“unique” 绑定参数的生成已简化为使用与所有其他内容相同的 “唯一标识符” 机制。这不会影响用户代码,但任何可能已针对生成的名称进行硬编码的代码除外。生成的绑定参数现在具有
"
的形式,而之前只有同名的第二个绑定才具有此形式。_ " [sql] ¶
如果 select 的列子句中没有正好一个表达式,
select().as_scalar()
将引发异常。[sql] ¶
bindparam()
对象本身可以用作execute()
的键,例如statement.execute({bind1:'foo', bind2:'bar'})
[sql] ¶
为
TypeDecorator
添加了新方法process_bind_param()
和process_result_value()
,它们自动利用底层类型的处理。非常适合与Unicode
或Pickletype
一起使用。TypeDecorator
现在应该是增强任何现有类型(包括其他TypeDecorator
子类(如PickleType
))行为的主要方式。[sql] ¶
当 selectable(和其他)导出列集合中的两列基于名称冲突时,将发出警告。
[sql] ¶
具有架构的表仍然可以在 sqlite、firebird 中使用,架构名称只是被删除
参考: #890
[sql] ¶
更改了各种 “literal” 生成函数以使用匿名绑定参数。这里变化不大,除了它们的标签现在看起来像
":param_1"
、":param_2"
而不是":literal"
[sql] ¶
现在支持
"tablename.columname"
形式的列标签,即带有点的标签。[sql] ¶
select()
的from_obj
关键字参数可以是标量或列表。
misc¶
[dialects] ¶
sqlite
SLDate
类型不会错误地呈现日期时间或时间对象的 “微秒” 部分。[dialects] ¶
- oracle
为 Oracle 添加了断开连接检测支持
对二进制/原始类型进行了一些清理,以便即席检测
cx_oracle.LOB
参考: #902
[dialects] ¶
- MSSQL
PyODBC 不再具有全局 “set nocount on”。
修复自动加载时非身份整数 PK。
更好地支持
convert_unicode
。为 pyodbc/adodbapi 减少了严格的日期转换。
架构限定表/自动加载。
[backend] [firebird] ¶
正确地反射域(部分修复)和
PassiveDefaults
参考: #410
[3562] [backend] [firebird] ¶
恢复为使用默认
poolclass
(在 0.4.0 中为测试目的设置为SingletonThreadPool
)[backend] [firebird] ¶
将
func.length()
映射到‘char_length’
(在旧版本的 Firebird 上可以使用 UDF‘strlen’
轻松覆盖)
0.4.1¶
发布日期:2007 年 11 月 18 日星期日orm¶
[orm] ¶
应用了
LIMIT/OFFSET
的急切加载不再添加连接到其自身有限子查询的主表;急切加载现在直接连接到子查询,该子查询也向结果集提供主表的列。这消除了LIMIT/OFFSET
的所有急切加载的JOIN
。参考: #843
[orm] ¶
session.refresh()
和session.expire()
现在支持一个额外的参数“attribute_names”
,它是要刷新或过期的单个属性键名列表,允许部分重新加载已加载实例上的属性。参考: #802
[orm] ¶
为检测属性添加了
op()
运算符;例如User.name.op(‘ilike’)(‘%somename%’)
参考: #767
[orm] ¶
映射类现在可以使用任意语义定义
__eq__
、__hash__
和__nonzero__
方法。orm 现在在仅标识的基础上处理所有映射实例。(例如‘is’
vs‘==’
)参考: #676
[orm] ¶
删除了
Mapper
上的“properties”
访问器;它现在抛出一个信息丰富的异常,解释了mapper.get_property()
和mapper.iterate_properties
的用法[orm] ¶
为
Query
添加了having()
方法,以与filter()
附加到WHERE
子句相同的方式将HAVING
应用于生成的语句。[orm] ¶
query.options()
的行为现在完全基于路径,例如,诸如eagerload_all(‘x.y.z.y.x’)
之类的选项将仅将急切加载应用于那些路径,即而不是‘x.y.x’
;eagerload(‘children.children’)
仅适用于正好两级深度的路径,等等。参考文献: #777
[orm] ¶
当设置为 mutable=False 时,PickleType 将使用 == 进行比较,而不是 is 运算符。要使用 is 或任何其他比较器,请使用 PickleType(comparator=my_custom_comparator) 传入自定义比较函数。
[orm] ¶
如果您同时使用 distinct() 和包含 UnaryExpressions (或其他) 的 order_by(),query 不会抛出错误
参考文献: #848
[orm] ¶
当使用 distinct() 时,来自连接表的 order_by() 表达式会被正确添加到 columns 子句中
参考文献: #786
[orm] ¶
修复了 Query.add_column() 不接受类绑定属性作为参数的错误;如果发送了无效参数给 add_column(),Query 也会抛出错误 (在 instances() 时)
参考文献: #858
[orm] ¶
在 InstanceState.__cleanup() 中增加了一些垃圾回收解除引用的检查,以减少应用程序关闭时的 “gc ignored” 错误
[orm] ¶
Session API 已经固化
[orm] ¶
对已持久化的对象执行 session.save() 操作会报错
参考文献: #840
[orm] ¶
对 *未* 持久化的对象执行 session.delete() 操作会报错。
[orm] ¶
当更新或删除会话中已存在但身份不同的实例时,session.update() 和 session.delete() 会抛出错误。
[orm] ¶
Session 在确定 “对象 X 已经在另一个会话中” 时会进行更仔细的检查;例如,如果你序列化一系列对象并反序列化 (例如在 Pylons HTTP 会话或类似场景中),它们可以进入新的会话而不会发生任何冲突
[orm] ¶
merge() 包含一个关键字参数 “dont_load=True”。设置此标志将导致 merge 操作在响应传入的 detached 对象时,不从数据库加载任何数据,并将接受传入的 detached 对象,就好像它已经存在于该会话中一样。使用此参数可以将来自外部缓存系统的 detached 对象合并到会话中。
[orm] ¶
当 deferred 列属性被赋值时,不再触发加载操作。在这些情况下,新赋值的值将无条件地出现在 flushes 的 UPDATE 语句中。
[orm] ¶
修复了重新分配集合子集 (obj.relation = obj.relation[1:]) 时的截断错误
参考文献: #834
[orm] ¶
简化了 backref 配置代码,现在 backref 如果覆盖了现有属性,则会抛出错误
参考文献: #832
[orm] ¶
改进了 add_property() 等的行为,修复了涉及 synonym/deferred 的问题。
参考文献: #831
[orm] ¶
修复了 clear_mappers() 的行为,使其更好地进行自我清理。
[orm] ¶
修复了 “行切换” 行为,即当 INSERT/DELETE 组合成单个 UPDATE 时;父对象上的多对多关系会正确更新。
参考文献: #841
[orm] ¶
修复了 association proxy 的 __hash__ 方法 - 这些集合是不可哈希的,就像它们的可变 Python counterparts 一样。
[orm] ¶
为 scoped sessions 添加了 save_or_update, __contains__ 和 __iter__ 方法的代理。
[orm] ¶
修复了一个非常难以重现的问题,即 Query 的 FROM 子句可能会被某些生成调用污染
参考文献: #852
sql¶
[sql] ¶
bindparam() 上的 “shortname” 关键字参数已被弃用。
[sql] ¶
添加了 contains 运算符 (生成 “LIKE %<other>%” 子句)。
[sql] ¶
匿名列表达式会自动添加标签。例如,select([x* 5]) 会生成 “SELECT x * 5 AS anon_1”。这允许标签名出现在 cursor.description 中,然后可以适当地匹配到结果列处理规则。(由于 text() 表达式可能表示多列,因此我们不能可靠地使用位置跟踪来进行结果列匹配)。
[sql] ¶
运算符重载现在由 TypeEngine 对象控制 - 目前内置的运算符重载是 String 类型重载 ‘+’ 为字符串连接运算符。用户定义的类型也可以通过重写 adapt_operator(self, op) 方法来定义自己的运算符重载。
[sql] ¶
二进制表达式右侧的未类型化绑定参数将被分配操作左侧的类型,以更好地启用适当的绑定参数处理生效
参考文献: #819
[sql] ¶
从大多数语句编译中移除了正则表达式步骤。同时修复了
参考文献: #833
[sql] ¶
修复了空 (零列) sqlite 插入,允许在自增单列表上进行插入。
[sql] ¶
修复了 text() 子句的表达式转换;这修复了各种 ORM 场景,在这些场景中,字面文本被用于 SQL 表达式
[sql] ¶
移除了 ClauseParameters 对象;compiled.params 现在返回一个常规字典,以及 result.last_inserted_params() / last_updated_params()。
[sql] ¶
修复了 INSERT 语句关于主键列的问题,这些主键列具有基于 SQL 表达式的默认生成器;SQL 表达式像往常一样内联执行,但不会为该列触发 “postfetch” 条件,对于那些通过 cursor.lastrowid 提供它的数据库。
[sql] ¶
func. 对象可以被序列化/反序列化
参考文献: #844
[sql] ¶
重写并简化了用于在可选择表达式之间 “target” 列的系统。在 SQL 方面,这由 “corresponding_column()” 方法表示。ORM 大量使用此方法来 “adapt” 表达式的元素到类似的、别名化的表达式,以及 target 结果集列,这些列最初绑定到表或 selectable 到别名化的、 “corresponding” 表达式。新的重写具有完全一致和准确的行为。
[sql] ¶
添加了一个字段 (“info”) 用于在 schema 项目上存储任意数据
参考文献: #573
[sql] ¶
Connections 上的 “properties” 集合已重命名为 “info”,以匹配 schema 的可写集合。在 0.5 版本之前,仍然可以通过 “properties” 名称访问。
[sql] ¶
修复了当使用 strategy=’threadlocal’ 时 Transaction 的 close() 方法
[sql] ¶
修复了编译后的绑定参数,以避免错误地填充 None
参考文献: #853
[sql] ¶
<Engine|Connection>._execute_clauseelement 变为公共方法 Connectable.execute_clauseelement
misc¶
[dialects] ¶
添加了对 MaxDB 的实验性支持 (仅限版本 >= 7.6.03.007)。
[dialects] ¶
oracle 现在会将 “DATE” 反射为 OracleDateTime 列,而不是 OracleDate
[dialects] ¶
在 oracle table_names() 函数中添加了对 schema 名称的感知,修复了 metadata.reflect(schema=’someschema’)
参考文献: #847
[dialects] ¶
MSSQL 函数选择的匿名标签变得确定性
[dialects] ¶
sqlite 会将 “DECIMAL” 反射为 numeric 列。
[dialects] ¶
使 access dao 检测更加可靠
参考文献: #828
[dialects] ¶
将 Dialect 属性 ‘preexecute_sequences’ 重命名为 ‘preexecute_pk_sequences’。对于使用旧名称的树外 dialects,存在属性代理。
[dialects] ¶
为未知类型反射添加了测试覆盖率。修复了 sqlite/mysql 对未知类型类型反射的处理。
[dialects] ¶
为 mysql dialect 添加了 REAL 类型 (对于利用 REAL_AS_FLOAT sql 模式的人)。
[dialects] ¶
没有参数构造的 mysql Float、MSFloat 和 MSDouble 现在会生成无参数 DDL,例如 ‘FLOAT’。
[misc] ¶
移除了未使用的 util.hash()。
0.4.0¶
发布日期: 2007 年 10 月 17 日 星期三[no_tags] ¶
(有关相对于 0.3 的重大更改的开始,请参见 0.4.0beta1,以及 https://sqlalchemy.org.cn/trac/wiki/WhatsNewIn04 )
[no_tags] ¶
添加了初始 Sybase 支持 (目前仅限 mxODBC)
参考文献: #785
[no_tags] ¶
为 PostgreSQL 添加了部分索引支持。在 Index 上使用 postgres_where 关键字。
[no_tags] ¶
基于字符串的查询参数解析/配置文件解析器可以理解更广泛的布尔值字符串值
参考文献: #817
[no_tags] ¶
如果另一侧的集合不包含该项,backref 删除对象操作不会失败,支持 noload 集合
参考文献: #813
[no_tags] ¶
从 “dynamic” 集合中移除了 __len__,因为它需要发出 SQL “count()” 操作,从而强制所有列表评估发出冗余 SQL
参考文献: #818
[no_tags] ¶
为 locate_dirty() 添加了内联优化,可以大大加快重复调用 flush() 的速度,就像 autoflush=True 时发生的那样
参考文献: #816
[no_tags] ¶
IdentifierPreprarer 的 _requires_quotes 测试现在是基于正则表达式的。任何提供自定义 legal_characters 或 illegal_initial_characters 集合的树外 dialects 都需要迁移到正则表达式或重写 _requires_quotes。
[no_tags] ¶
由于 ticket #370 (正确的方法),Firebird 的 supports_sane_rowcount 和 supports_sane_multi_rowcount 设置为 False。
[no_tags] ¶
- Firebird 反射的改进和修复
FBDialect 现在模仿 OracleDialect,关于 TABLE 和 COLUMN 名称的大小写敏感性 (请参阅当前文件中的 ‘case_sensitive remotion’ 主题)。
FBDialect.table_names() 不会带入系统表 (ticket:796)。
FB 现在可以正确反射 Column 的 nullable 属性。
[no_tags] ¶
修复了 SQL 编译器对结果集处理中使用的顶层列标签的感知;包含相同列名的嵌套选择不会影响结果或与结果列元数据冲突。
[no_tags] ¶
query.get() 和相关函数 (如多对一延迟加载) 使用编译时别名化的绑定参数名称,以防止与已存在于映射的 selectable 中的绑定参数发生名称冲突。
[no_tags] ¶
修复了三级和多级选择以及延迟继承加载 (即没有 select_table 的 abc 继承)。
参考文献: #795
[no_tags] ¶
传递给 shard.py 中 id_chooser 的 Ident 始终是一个列表。
[no_tags] ¶
无参数的 ResultProxy._row_processor() 现在是类属性 _process_row。
[no_tags] ¶
为 PostgreSQL 8.2+ 添加了从插入和更新操作返回值的功能。
参考文献: #797
[no_tags] ¶
PG 反射,当看到默认 schema 名称在 Table 中被显式用作 “schema” 参数时,会假定这是用户期望的约定,并会在外键相关的反射表中显式设置 “schema” 参数,从而使它们仅与也使用显式 “schema” 参数的 Table 构造函数匹配 (即使它是默认 schema)。换句话说,SA 假定用户在这种用法上是一致的。
[no_tags] ¶
修复了 sqlite 对 BOOL/BOOLEAN 的反射
参考文献: #808
[no_tags] ¶
为 mysql 添加了对带有 LIMIT 的 UPDATE 的支持。
[no_tags] ¶
m2o 上的空外键不会触发延迟加载
参考文献: #803
[no_tags] ¶
oracle 不会为非类型化结果集隐式转换为 unicode (即,当甚至没有使用 TypeEngine/String/Unicode 类型时;以前它会检测 DBAPI 类型并进行转换,无论如何)。应该修复
参考文献: #800
[no_tags] ¶
修复了长表/列名称的匿名标签生成
参考文献: #806
[no_tags] ¶
Firebird dialect 现在使用 SingletonThreadPool 作为 poolclass。
[no_tags] ¶
Firebird 现在使用 dialect.preparer 来格式化序列名称
[no_tags] ¶
修复了 postgres 和多个两阶段事务的崩溃问题。两阶段提交和回滚不会像通常的 dbapi 提交/回滚那样自动结束并开始一个新的事务。
参考文献: #810
[no_tags] ¶
为 _ScopedExt mapper 扩展添加了一个选项,以便在对象初始化时不会自动将新对象保存到会话。
[no_tags] ¶
修复了 Oracle non-ansi 连接语法
[no_tags] ¶
PickleType 和 Interval 类型 (在本地不支持它的数据库上) 现在稍微快一些了。
[no_tags] ¶
为 Firebird 添加了 Float 和 Time 类型 (FBFloat 和 FBTime)。修复了 TEXT 和 Binary 类型的 BLOB SUB_TYPE。
[no_tags] ¶
更改了 in_ 运算符的 API。in_() 现在接受单个参数,该参数是值序列或 selectable。旧的将值作为 varargs 传入的 API 仍然有效,但已被弃用。
0.4.0beta6¶
发布日期: 2007 年 9 月 27 日 星期四[no_tags] ¶
Session 身份映射现在默认是 *弱引用*,使用 weak_identity_map=False 来使用常规字典。我们正在使用的弱字典经过自定义,可以检测到 “dirty” 的实例,并保持对这些实例的临时强引用,直到更改被刷新。
[no_tags] ¶
Mapper 编译已被重组,使得大多数编译发生在 mapper 构造时。这使我们可以减少对 mapper.compile() 的调用,并允许基于类的属性强制编译 (例如,User.addresses == 7 将编译所有 mappers;这是)。唯一的注意事项是,继承 mapper 现在在构造时会查找其继承的 mapper;因此,继承关系中的 mappers 需要按继承顺序构造 (无论如何这应该是正常情况)。
参考文献: #758
[no_tags] ¶
在 Postgres 检测到的关键字中添加了 “FETCH”,以指示结果行保持语句 (即,除了 “SELECT” 之外)。
[no_tags] ¶
添加了 SQLite 保留关键字的完整列表,以便它们被正确转义。
[no_tags] ¶
加强了 Query 生成 “eager load” 别名与 Query.instances() (实际上抓取 eagerly loaded 行) 之间的关系。如果别名不是由 EagerLoader 为该语句专门生成的,则在获取行时 EagerLoader 将不会生效。这可以防止列在并非旨在 eager load 的情况下被意外地抓取为 eager load 的一部分,这种情况可能发生在文本 SQL 以及某些继承情况下。这一点尤其重要,因为列的 “匿名别名” 现在使用简单的整数计数来生成标签。
[no_tags] ¶
从 clauseelement.compile() 中移除了 “parameters” 参数,替换为 “column_keys”。发送到 execute() 的参数仅在列名的角度与 insert/update 语句编译过程交互,而不是这些列的值。产生更一致的 execute/executemany 行为,并在内部简化了一些事情。
[no_tags] ¶
为 PickleType 添加了 ‘comparator’ 关键字参数。默认情况下,“mutable” PickleType 使用对象的 dumps() 表示形式对对象进行 “深度比较”。但这不适用于字典。提供适当的 __eq__() 实现的 Pickled 对象可以使用 “PickleType(comparator=operator.eq)” 进行设置。
参考文献: #560
[no_tags] ¶
添加了 session.is_modified(obj) 方法;执行与 flush 操作中发生的相同的 “history” 比较操作;设置 include_collections=False 会得到与 flush 确定是否为实例的行发出 UPDATE 时使用的结果相同的结果。
[no_tags] ¶
为 Sequence 添加了 “schema” 参数;当序列位于备用 schema 中时,将其与 Postgres /Oracle 一起使用。实现了一部分,应该可以修复。
[no_tags] ¶
修复了 mysql enums 的空字符串反射。
[no_tags] ¶
将 MySQL dialect 更改为使用旧的 LIMIT <offset>, <limit> 语法,而不是 LIMIT <l> OFFSET <o>,以供使用 3.23 的用户使用。
参考文献: #794
[no_tags] ¶
为 relation() 添加了 ‘passive_deletes=”all”’ 标志,在父对象被删除的 flush 期间禁用所有外键属性的 nulling-out。
[no_tags] ¶
列默认值和 onupdates,内联执行,将为子查询和其他需要括号的表达式添加括号
[no_tags] ¶
String/Unicode 类型在没有长度时自动转换为 TEXT/CLOB 的行为现在 *仅* 发生在没有参数的 String 或 Unicode 的精确类型时。如果您使用没有长度的 VARCHAR 或 NCHAR (String/Unicode 的子类),它们将被 dialect 解释为 VARCHAR/NCHAR;那里不会发生 “magic” 转换。这是一种不太令人惊讶的行为,特别是这有助于 Oracle 将基于字符串的绑定参数保留为 VARCHAR 而不是 CLOB。
参考文献: #793
[no_tags] ¶
修复了 ShardedSession 以使其与 deferred 列一起工作。
参考文献: #771
[no_tags] ¶
用户定义的 shard_chooser() 函数必须接受 “clause=None” 参数;这是传递给 session.execute(statement) 的 ClauseElement,可用于确定正确的 shard id (因为 execute() 不接受实例)。
[no_tags] ¶
调整了 NOT 的运算符优先级以匹配 ‘==’ 和其他运算符,以便 ~(x <operator> y) 生成 NOT (x <op> y),这与旧版本的 MySQL 更好地兼容。这不适用于 “~(x==y)”,因为它在 0.3 中那样,因为 ~(x==y) 编译为 “x != y”,但仍然适用于像 BETWEEN 这样的运算符。
参考文献: #764
[no_tags] ¶
其他 issues:,,.
0.4.0beta5¶
无发布日期[no_tags] ¶
连接池修复;beta4 的更好性能得以保留,但修复了 “connection overflow” 和其他存在的错误 (例如)。
参考: #754
[no_tags] ¶
修复了从自定义继承条件确定正确同步子句的错误。
参考: #769
[no_tags] ¶
扩展了 ‘engine_from_config’ 强制转换为 QueuePool 大小/溢出。
参考: #763
[no_tags] ¶
mysql 视图可以再次被反射。
参考: #748
[no_tags] ¶
AssociationProxy 现在可以接受自定义的 getter 和 setter。
[no_tags] ¶
修复了 orm 查询中 BETWEEN 故障。
[no_tags] ¶
修复了 OrderedProperties 序列化
参考: #762
[no_tags] ¶
SQL 表达式默认值和序列现在对 INSERT 或 UPDATE 期间的所有非主键列以及 executemany()-style 调用期间的所有列执行 “inline”。 任何 insert/update 语句上的 inline=True 标志也会强制对单个 execute() 采用相同的行为。 result.postfetch_cols() 是一个列的集合,之前的单个 insert 或 update 语句包含 SQL 端默认表达式。
[no_tags] ¶
修复了 PG executemany() 行为。
参考: #759
[no_tags] ¶
postgres 反射表,对于没有默认值的主键列,autoincrement=False。
[no_tags] ¶
postgres 不再用单独的 execute() 调用包装 executemany(),而是倾向于性能。 由于 psycopg2 不报告 executemany() 的正确 rowcount,“rowcount”/“concurrency” 与已删除项的检查(使用 executemany)在 PG 中被禁用。
[fixed] [tickets] ¶
参考: #742
[fixed] [tickets] ¶
参考: #748
[fixed] [tickets] ¶
参考: #760
[fixed] [tickets] ¶
参考: #762
[fixed] [tickets] ¶
参考: #763
0.4.0beta4¶
发布日期:Wed Aug 22 2007[no_tags] ¶
整理了当你 ‘from sqlalchemy import *’ 时最终出现在你的命名空间中的内容
[no_tags] ¶
不再导入 ‘table’ 和 ‘column’。 它们仍然可以通过直接引用(如 ‘sql.table’ 和 ‘sql.column’)或从 sql 包进行 glob 导入来使用。 当刚开始使用 SQLAlchemy 时,太容易意外地使用 sql.expressions.table 而不是 schema.Table,column 也是如此。
[no_tags] ¶
像 ClauseElement、FromClause、NullTypeEngine 等内部类也不再导入到您的命名空间中
[no_tags] ¶
不再导入 ‘Smallinteger’ 兼容性名称(小写的 i!),但暂时保留在 schema.py 中。 SmallInteger(大写的 I!)仍然被导入。
[no_tags] ¶
连接池在内部使用 “threadlocal” 策略来返回已绑定到线程的相同连接,用于 “上下文” 连接; 这些是当您执行 “无连接” 执行(如 insert().execute())时使用的连接。 这类似于 “threadlocal” 引擎策略的 “部分” 版本,但没有线程本地事务部分。 我们希望它可以减少连接池开销以及数据库使用率。 但是,如果事实证明它会对稳定性产生负面影响,我们将立即将其回滚。
[no_tags] ¶
修复了绑定参数处理,以便 “False” 值(如空字符串)仍然可以被处理/编码。
[no_tags] ¶
修复了 select() “生成式” 行为,以便调用 column()、select_from()、correlate() 和 with_prefix() 不会修改原始 select 对象
参考: #752
[no_tags] ¶
为类型添加了 “legacy” 适配器,以便用户定义的 TypeEngine 和 TypeDecorator 类,它们定义了 convert_bind_param() 和/或 convert_result_value() 将继续起作用。 还支持调用这些方法的 super() 版本。
[no_tags] ¶
添加了 session.prune(),修剪会话中缓存的不再在其他地方引用的实例。(用于强引用身份映射的实用程序)。
[no_tags] ¶
为 Transaction 添加了 close() 方法。 如果是最外层事务,则使用 rollback 关闭事务,否则只是结束而不影响外部事务。
[no_tags] ¶
事务性和非事务性 Session 与绑定的连接更好地集成; close() 将确保连接事务状态与绑定到 Session 之前存在的状态相同。
[no_tags] ¶
修改了 SQL 运算符函数,使其成为模块级运算符,允许 SQL 表达式可序列化。
参考: #735
[no_tags] ¶
对 mapper class.__init__ 进行了小的调整,以允许 Py2.6 object.__init__() 行为。
[no_tags] ¶
修复了 select() 的 ‘prefix’ 参数
[no_tags] ¶
Connection.begin() 不再接受 nested=True,此逻辑现在都在 begin_nested() 中。
[no_tags] ¶
修复了涉及级联的新 “动态” 关系加载器
[fixed] [tickets] ¶
参考: #735
[fixed] [tickets] ¶
参考: #752
0.4.0beta3¶
发布日期:Thu Aug 16 2007[no_tags] ¶
SQL 类型优化
[no_tags] ¶
新的性能测试表明,与针对 0.3 运行的相同测试相比,组合的大规模插入/大规模选择测试的函数调用次数减少了 68%。
[no_tags] ¶
结果集迭代的总体性能提高了大约 10-20%。
[no_tags] ¶
在 types.AbstractType 中,convert_bind_param() 和 convert_result_value() 已迁移到返回可调用对象的 bind_processor() 和 result_processor() 方法。 如果没有返回可调用对象,则不会调用任何预/后处理函数。
[no_tags] ¶
在 base/sql/defaults 中添加了钩子,以优化绑定参数/结果处理器调用的调用,从而最大限度地减少方法调用开销。
[no_tags] ¶
添加了对 executemany() 场景的支持,这样就不需要启动不需要的 “last row id” 逻辑,参数也不会被过度遍历。
[no_tags] ¶
为 mapper() 添加了 ‘inherit_foreign_keys’ 参数。
[no_tags] ¶
在 sqlite 中添加了对字符串日期传递的支持。
[fixed] [tickets] ¶
参考: #738
[fixed] [tickets] ¶
参考: #739
[fixed] [tickets] ¶
参考: #743
[fixed] [tickets] ¶
参考: #744
0.4.0beta2¶
发布日期:Tue Aug 14 2007oracle¶
[oracle] [improvements.] ¶
为 mysql 在 LOAD DATA INFILE 后自动提交。
[oracle] [improvements.] ¶
添加了基本的 SessionExtension 类,允许用户定义的功能在 flush()、commit() 和 rollback() 边界发生。
[oracle] [improvements.] ¶
添加了 engine_from_config() 函数,用于帮助从 .ini 样式配置创建 create_engine()。
[oracle] [improvements.] ¶
base_mapper() 变为普通属性。
[oracle] [improvements.] ¶
session.execute() 和 scalar() 可以搜索 Table,以便从给定的 ClauseElement 中绑定。
[oracle] [improvements.] ¶
Session 自动从带有绑定的 mapper 中推断表,也使用 base_mapper,以便继承层次结构自动绑定。
[oracle] [improvements.] ¶
将 ClauseVisitor 遍历移回内联非递归。
misc¶
0.4.0beta1¶
发布日期:Sun Aug 12 2007orm¶
[orm] ¶
速度! 随着 ResultProxy 最近的加速,大型加载的总函数调用次数显着减少。
[orm] ¶
test/perf/masseagerload.py 报告 0.4 在所有 SA 版本(0.1、0.2 和 0.3)中具有最少的函数调用次数。
[orm] ¶
新的 collection_class api 和实现。 集合现在通过装饰而不是代理来检测。 您现在可以拥有管理自身成员资格的集合,并且您的类实例将直接暴露在关系属性上。 这些更改对于大多数用户是透明的。
参考: #213
[orm] ¶
InstrumentedList(以前是这样)已被删除,关系属性不再具有 ‘clear()’、‘.data’ 或集合类型提供的任何其他添加方法。 当然,您可以自由地将它们添加到自定义类中。
[orm] ¶
__setitem__-like 赋值现在为现有值触发删除事件(如果有)。
[orm] ¶
用作集合类的类字典不再需要更改 __iter__ 语义 - 默认情况下使用 itervalues()。 这是一个向后不兼容的更改。
[orm] ¶
在大多数情况下,不再需要为映射集合子类化 dict。 orm.collections 提供了预定义的实现,这些实现通过指定的列或您选择的自定义函数来键控对象。
[orm] ¶
集合赋值现在需要兼容的类型 - 将 None 分配给清除集合或将列表分配给字典集合现在将引发参数错误。
[orm] ¶
AttributeExtension 移动到 interfaces,并且 .delete 现在是 .remove 事件方法签名也已交换。
[orm] ¶
Query 的重大修改
[orm] ¶
所有 selectXXX 方法都已弃用。 生成式方法现在是执行操作的标准方法,即 filter()、filter_by()、all()、one() 等。 已弃用的方法在其新的替换项中进行了文档字符串化。
[orm] ¶
类级属性现在可以用作查询元素……不再有 ‘.c.’! “Class.c.propname” 现在被 “Class.propname” 取代。 支持所有子句运算符,以及更高级别的运算符,例如 Class.prop==<some instance> 用于标量属性,Class.prop.contains(<some instance>) 和 Class.prop.any(<some expression>) 用于基于集合的属性(所有属性都是可否定的)。 基于表的列表达式以及通过 ‘c’ 安装在映射类上的列当然仍然完全可用,并且可以与新属性自由混合。
参考: #643
[orm] ¶
删除了旧的 query.select_by_attributename() 功能。
[orm] ¶
延迟加载使用的别名逻辑已被推广,因此它还为 Query 添加了完整的自动别名支持。 不再需要创建显式的 Alias 来多次连接到相同的表; *即使对于自引用关系也是如此*。
join() 和 outerjoin() 接受参数 “aliased=True”。 这会导致它们的连接建立在别名表上; 后续对 filter() 和 filter_by() 的调用会将所有表表达式(是的,使用原始映射 Table 的真实表达式)转换为该 Alias 的表达式,直到 join() 的持续时间(即,直到调用 reset_joinpoint() 或另一个 join())。
join() 和 outerjoin() 接受参数 “id=<somestring>”。 当与 “aliased=True” 一起使用时,id 可以通过 add_entity(cls, id=<somestring>) 引用,以便即使连接的实例来自别名,您也可以选择它们。
join() 和 outerjoin() 现在可以与自引用关系一起使用! 使用 “aliased=True”,您可以连接到所需的深度,即 query.join(['children', 'children'], aliased=True); 过滤器条件将针对最右侧的连接表
[orm] ¶
添加了 query.populate_existing(),标记查询以重新加载查询中触及的所有实例的所有属性和集合,包括延迟加载的实体。
参考: #660
[orm] ¶
添加了 eagerload_all(),允许 eagerload_all(‘x.y.z’) 指定给定路径中所有属性的延迟加载。
[orm] ¶
Session 的重大修改
[orm] ¶
一个 “配置” 会话的新函数,称为 “sessionmaker()”。 将各种关键字参数发送到此函数一次,返回一个新的类,该类创建针对该原型的 Session。
[orm] ¶
SessionTransaction 从 “公共” API 中删除。 您现在可以在 Session 本身调用 begin()/ commit()/rollback()。
[orm] ¶
Session 还支持 SAVEPOINT 事务; 调用 begin_nested()。
[orm] ¶
当垂直或水平分区(即,使用多个引擎)时,Session 支持两阶段提交行为。 使用 twophase=True。
[orm] ¶
Session 标志 “transactional=True” 生成一个会话,该会话始终在首次使用时将自身置于事务中。 在 commit()、rollback() 或 close() 时,事务结束; 但在下次使用时再次开始。
[orm] ¶
Session 支持 “autoflush=True”。 这会在每次查询之前发出 flush()。 与事务性结合使用,您可以只 save()/update() 然后查询,新对象将在那里。 在最后使用 commit()(或如果是非事务性的则使用 flush())来刷新剩余的更改。
[orm] ¶
新的 scoped_session() 函数取代了 SessionContext 和 assignmapper。 构建在 “sessionmaker()” 概念之上,以生成一个类,该类的 Session() 构造返回线程本地会话。 或者,像旧的 “objectstore” 时代一样,将所有 Session 方法作为类方法调用,即 Session.save(foo); Session.commit()。
[orm] ¶
为 Session 添加了新的 “binds” 参数,以支持使用 sessionmaker() 函数配置多个绑定。
[orm] ¶
添加了基本的 SessionExtension 类,允许用户定义的功能在 flush()、commit() 和 rollback() 边界发生。
[orm] ¶
具有 dynamic_loader() 的基于 Query 的 relation()。 这是一个*可写*集合(支持 append() 和 remove()),当为读取访问时,它也是一个实时的 Query 对象。 非常适合处理只需要部分加载的非常大的集合。
[orm] ¶
flush()-嵌入式内联 INSERT/UPDATE 表达式。 将任何 SQL 表达式(如 “sometable.c.column + 1”)分配给实例的属性。 在 flush() 时,mapper 检测到表达式并将其直接嵌入到 INSERT 或 UPDATE 语句中; 该属性在实例上被延迟,以便在下次访问它时加载新值。
[orm] ¶
引入了一个基本的分片(水平扩展)系统。 该系统使用修改后的 Session,该 Session 可以根据用户定义的定义 “分片策略” 的函数在多个数据库之间分配读取和写入操作。 实例及其依赖项可以根据属性值、轮询方法或任何其他用户定义的系统在多个数据库之间分发和查询。
参考: #618
[orm] ¶
延迟加载已得到增强,可以在更多位置允许更多连接。 它现在可以在自引用和循环结构的任何任意深度起作用。 加载循环结构时,在 relation() 上指定 “join_depth”,指示您希望表自身连接多少次; 每个级别都获得一个不同的表别名。 别名名称本身现在在编译时使用简单的计数方案生成,并且更易于查看,当然也完全是确定性的。
参考: #659
[orm] ¶
添加了复合列属性。 这允许您在使用 ORM 时创建由多个列表示的类型。 新类型的对象在查询表达式、比较、query.get() 子句等中完全起作用,并且表现得好像它们是常规的单列标量……除非它们不是! 在 mapper 的 “properties” 字典中使用函数 composite(cls, *columns),cls 的实例将被创建/映射到单个属性,该属性由与 *columns 对应的值组成。
参考: #211
[orm] ¶
改进了对具有相关子查询的自定义 column_property() 属性的支持,现在可以更好地与延迟加载一起使用。
[orm] ¶
主键 “折叠” 行为; mapper 将分析其给定可选选择中的所有列,以查找主键 “等效性”,即通过外键关系或通过显式 inherit_condition 等效的列。 主要用于连接表继承场景,其中继承表中的不同命名 PK 列应 “折叠” 成单值(或更少值)主键。 修复了如下问题。
参考: #611
[orm] ¶
连接表继承现在将仅针对连接的根表生成所有继承类的主键列。 这意味着根表中的每一行都对单个实例是不同的。 如果由于某些罕见的原因这不是期望的,则各个 mapper 上的显式 primary_key 设置将覆盖它。
[orm] ¶
当将 “polymorphic” 标志与连接表或单表继承一起使用时,所有身份键都针对继承层次结构的根类生成; 这允许 query.get() 使用与非多态 get 相同的缓存语义以多态方式工作。 请注意,这目前不适用于具体继承。
[orm] ¶
二级继承加载:多态 mapper 可以在*没有* select_table 参数的情况下构造。 其表未在初始加载中表示的继承 mapper 将立即发出第二个 SQL 查询,每个实例一次(即对于大型列表而言效率不高),以便加载剩余的列。
[orm] ¶
二级继承加载还可以通过 “polymorphic_fetch” 参数将其第二个查询移动到列级 “延迟” 加载中,该参数可以设置为 ‘select’ 或 ‘deferred’
[orm] ¶
现在可以使用 include_columns/exclude_columns 将可选选择列的子集映射到 mapper 属性。
参考: #696
[orm] ¶
添加了 undefer_group() MapperOption,将一组由 “group” 连接的 “deferred” 列设置为加载为 “undeferred”。
[orm] ¶
重写了 “确定性别名名称” 逻辑,使其成为 SQL 层的一部分,生成更简单的别名和标签名称,更类似于 Hibernate 的风格
sql¶
[sql] ¶
速度! 子句编译以及 SQL 构造的机制已得到显着简化和简化,与 0.3 的语句构造/编译开销相比,提高了 20-30%。
[sql] ¶
所有 “type” 关键字参数,例如 bindparam()、column()、Column() 和 func.<something>() 的参数,都重命名为 “type_”。 这些对象仍然将其 “type” 属性命名为 “type”。
[sql] ¶
从 schema 项目中删除了 case_sensitive=(True|False) 设置,因为检查此状态增加了大量方法调用开销,并且没有充分的理由将其设置为 False。 所有小写的表名和列名将被视为不区分大小写(是的,我们也调整了 Oracle 的 UPPERCASE 样式)。
extensions¶
mysql¶
oracle¶
misc¶
[transactions] ¶
为事务添加了上下文管理器(with 语句)支持。
[transactions] ¶
添加了对两阶段提交的支持,目前适用于 mysql 和 postgres。
[transactions] ¶
添加了使用保存点的子事务实现。
[transactions] ¶
添加了对保存点的支持。
[metadata] ¶
表可以从数据库批量反射,而无需预先声明。MetaData(engine, reflect=True) 将加载数据库中存在的所有表,或者使用 metadata.reflect() 进行更精细的控制。
[metadata] ¶
DynamicMetaData 已重命名为 ThreadLocalMetaData
[metadata] ¶
ThreadLocalMetaData 构造函数现在不接受任何参数。
[metadata] ¶
BoundMetaData 已被移除 - 常规 MetaData 是等效的
[metadata] ¶
Numeric 和 Float 类型现在具有 “asdecimal” 标志;Numeric 默认为 True,Float 默认为 False。当为 True 时,值作为 decimal.Decimal 对象返回;当为 False 时,值作为 float() 返回。 True/False 的默认值已经是 PG 和 MySQL 的 DBAPI 模块的行为。
参考: #646
[metadata] ¶
新的 SQL 运算符实现,它从表达式结构中删除所有硬编码的运算符,并将它们移到编译中;允许更大的运算符编译灵活性;例如,“+” 在字符串上下文中编译为 “||”,或在 MySQL 上编译为 “concat(a,b)”;而在数字上下文中,它编译为 “+”。修复。
参考: #475
[metadata] ¶
“匿名” 别名和标签名称现在在 SQL 编译时以完全确定的方式生成……不再有随机的十六进制 ID
[metadata] ¶
对 SQL 元素 (ClauseElement) 进行了重大的架构改革。所有元素共享一个通用的 “可变性” 框架,该框架允许对元素的就地修改以及生成行为采取一致的方法。提高了 ORM 的稳定性,ORM 大量使用了 SQL 表达式的突变。
[metadata] ¶
select() 和 union() 现在具有 “生成” 行为。像 order_by() 和 group_by() 这样的方法返回一个新的实例 - 原始实例保持不变。非生成方法仍然保留。
[metadata] ¶
select/union 的内部结构大大简化 - 关于 “是否为子查询” 和 “关联” 的所有决策都推迟到 SQL 生成阶段。select() 元素现在永远不会被其封闭容器或任何方言的编译过程修改
[metadata] ¶
select(scalar=True) 参数已弃用;使用 select(..).as_scalar()。生成的对象遵循完整的 “列” 接口,并在表达式中更好地发挥作用。
[metadata] ¶
添加了 select().with_prefix('foo'),允许在 SELECT 的列子句之前放置任何关键字集
参考: #504
[metadata] ¶
为 row[<index>] 添加了数组切片支持
参考: #686
[metadata] ¶
结果集更好地尝试将 cursor.description 中存在的 DBAPI 类型与方言定义的 TypeEngine 对象匹配,然后将其用于结果处理。请注意,这仅对文本 SQL 生效;构造的 SQL 语句始终具有显式类型映射。
[metadata] ¶
来自 CRUD 操作的结果集立即关闭其底层游标,并且如果为操作定义了自动关闭连接,则也会自动关闭连接;这允许更有效地使用连接进行连续的 CRUD 操作,并减少 “悬空连接” 的机会。
[metadata] ¶
列默认值和 onupdate Python 函数(即传递给 ColumnDefault 的函数)可以接受零个或一个参数;一个参数是 ExecutionContext,您可以从中调用 “context.parameters[someparam]” 来访问附加到语句的其他绑定参数值。用于执行的连接也可用,以便您可以预先执行语句。
参考: #559
[metadata] ¶
为序列添加了 “显式” 创建/删除/执行支持(即,您可以将 “connectable” 传递给 Sequence 上这些方法中的每一个)。
[metadata] ¶
在操作模式时,更好地引用标识符。
[metadata] ¶
标准化了表反射在无法找到类型时的行为;而是替换为 NullType,并引发警告。
[metadata] ¶
ColumnCollection(即表上的 ‘c’ 属性)遵循字典语义进行 “__contains__”
参考: #606
[engines] ¶
速度!结果处理和绑定参数处理的机制已经过彻底检查、简化和优化,以尽可能少地发出方法调用。批量 INSERT 和批量行集迭代的基准测试都表明 0.4 比 0.3 快两倍以上,函数调用减少了 68%。
[engines] ¶
您现在可以 Hook 进入池生命周期,并在每次新的 DBAPI 连接、池检出和检入时运行 SQL 语句或其他逻辑。
[engines] ¶
连接获得 .properties 集合,其内容作用域限定为底层 DBAPI 连接的生命周期
[engines] ¶
从 Pool 中移除了 auto_close_cursors 和 disallow_open_cursors 参数;减少了开销,因为游标通常由 ResultProxy 和 Connection 关闭。
[postgres] ¶
添加了 PGArray 数据类型,用于使用 postgres 数组数据类型。
flambé! the dragon and The Alchemist image designs created and generously donated by Rotem Yaari.
Created using Sphinx 7.2.6. Documentation last generated: Tue 11 Mar 2025 02:40:17 PM EDT