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

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


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

0.4 变更日志

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

0.4.8

发布日期:2008 年 10 月 12 日星期日

orm

  • [orm]
    修复了关于传递“A=B”与“B=A”时导致错误的 inherit_condition 的错误
    参考:#1039
  • [orm]
    在 SessionExtension.before_flush()中对新的、脏的和已删除的集合进行的更改将对该刷新生效。
  • [orm]
    向 InstrumentedAttribute 添加了 label()方法,以确保与 0.5 的向前兼容性。

sql

  • [sql]
    column.in_(someselect)现在可以作为一个 columns-clause 表达式使用,而不会使子查询泄漏到 FROM 子句中
    参考:#1074

mysql

  • [mysql]
    添加了 MSMediumInteger 类型。
    参考:#1146

sqlite

oracle

  • [oracle]
    has_sequence()现在考虑模式名称
    参考:#1155
  • [oracle]
    将 BFILE 添加到反射类型列表中
    参考:#1121

0.4.7p1

发布日期:2008 年 7 月 31 日星期四

orm

  • [orm]
    向 scoped_session 方法添加了“add()”和“add_all()”。 0.4.7 的解决方法:
from sqlalchemy.orm.scoping import ScopedSession, instrument
setattr(ScopedSession, "add", instrument("add"))
setattr(ScopedSession, "add_all", instrument("add_all"))
• 1
• 2
• 3
• 4
  • [orm]
    修复了在 relation()中调用 set()和生成器表达式时与非 2.3 兼容的用法。

0.4.7

发布日期:2008 年 7 月 26 日星期六

orm

  • [orm]
    当与 many-to-many 一起使用 contains()运算符时,将为 secondary(关联)表设置别名,以便多个 contains()调用不会互相冲突
    参考:#1058
  • [orm]
    修复了阻止 merge()与 comparable_property()一起运行的错误
  • [orm]
    现在,关于 relation()上的 enable_typechecks=False 设置仅允许具有继承映射器的子类型。 完全不相关的类型,或者没有针对目标映射器设置映射器继承的子类型仍然不被允许。
  • [orm]
    向 Sessions 添加了 is_active 标志,以检测事务是否正在进行中。 该标志始终为 True,对于“transactional”(在 0.5 中为非“autocommit”)会话。
    参考:#976

sql

  • [sql]
    修复了调用 select([literal(‘foo’)])或 select([bindparam(‘foo’)])时的错误。

schema

  • [schema]
    如果表名或模式名包含的字符超过该方言配置的字符限制,则  create_all()、drop_all()、create()、drop()都会引发错误。一些数据库可以在使用过程中处理过长的表名,SQLA  也可以处理这个问题。但是由于我们正在 DB 的目录表中查找名称,因此各种反射/在创建期间进行 checkfirst 的场景失败。
    参考:#571
  • [schema]
    当在 Column 上说“index=True”时生成的索引名称被截断为适合该方言的长度。此外,具有太长名称的索引不能使用 Index.drop()显式删除,类似于。
    参考:#571, #820

mysql

  • [mysql]
    将“CALL”添加到返回结果行的 SQL 关键字列表中。

oracle

  • [oracle]
    Oracle 的 get_default_schema_name()在返回之前“规范化”名称,这意味着当检测到标识符为大小写不敏感时,它返回一个小写名称。
  • [oracle]
    在搜索现有表时,创建/删除表时考虑模式名称,以便其他所有者命名空间中具有相同名称的表不发生冲突。
    参考:#709
  • [oracle]
    游标现在默认情况下将“arraysize”设置为  50,其值可以使用 Oracle 方言的 create_engine()的“arraysize”参数进行配置。这是为了考虑 cx_oracle  的默认设置为“1”,这会导致向 Oracle 发送许多往返。这实际上与 BLOB/CLOB  绑定的游标结合使用效果很好,其中有任意数量可用,但仅在该行请求的生命周期内(因此仍然需要 BufferedColumnRow,但不那么需要)。
    参考:#1062
  • [oracle]sqlite
  • 添加了 SLFloat 类型,与 SQLite REAL 类型亲和。以前只提供了 SLNumeric,它满足 NUMERIC 亲和,但与 REAL 不同。

杂项

  • [postgres]
    修复了 server_side_cursors 以正确检测 text()子句。
  • [postgres]
    添加了 PGCidr 类型。
    参考:#1092

0.4.6

发布日期:2008 年 5 月 10 日

orm

  • [orm]
    修复了最近的 relation()重构,修复了在本地和远程表之间多次连接的奇异 viewonly 关系,这些关系之间有一个共同的列用于连接。
  • [orm]
    还重新建立了跨多个表连接的 viewonly relation()配置。
  • [orm]
    添加了一个实验性  relation()标志,以帮助跨函数等进行  primaryjoins,_local_remote_pairs=[tuples]。这补充了一个复杂的 primaryjoin  条件,允许您提供构成关系本地和远程侧的各个列对。还改进了惰性加载 SQL 生成,以处理将 bind  参数放置在函数和其他表达式内的情况。(部分进展)
    参考:#610
  • [orm]
    修复了单表继承,使您可以从已加入表继承的映射器中单表继承而无需问题。
    参考:#1036
  • [orm]
    修复了如果发生了子句适应,Query.order_by()可能会出现的“连接元组”错误。
    参考:#1027
  • [orm]
    删除了关于映射的 selectables 需要“别名”的古老断言 - 如果没有,映射器现在会自己创建别名。尽管在这种情况下,您需要使用类,而不是映射的可选择项,作为列属性的来源 - 因此仍然会发出警告。
  • [orm]
    修复了涉及继承的“exists”函数的问题(any()、has()、~contains());完整的目标连接将被呈现到关系中,以链接到子类。
  • [orm]
    恢复了对主查询行使用 append_result()扩展方法的用法,当扩展存在且只返回单个实体结果时。
  • [orm]
    还重新建立了跨多个表连接的 viewonly relation()配置。
  • [orm]
    删除了关于映射的 selectables 需要“别名”的古老断言 - 如果没有,映射器现在会自己创建别名。尽管在这种情况下,您需要使用类,而不是映射的可选择项,作为列属性的来源 - 因此仍然会发出警告。
  • [orm]
    优化了 mapper._save_obj(),在 flush 期间不必要地调用 ne()来比较标量值。
    参考:#1015
  • [orm]
    添加了一个特性,使得贪婪加载中设置为 column_property()的子查询具有显式标签名称(顺便说一句,这不是必需的)时,当实例是贪婪连接的一部分时,标签会被匿名化,以防止与父对象上的同名子查询或列冲突。
    参考:#1019
  • [orm]
    基于集合的集合 |=、-=、^= 和 &= 对其操作数更加严格,只操作集合、frozensets 或集合类型的子类。以前,它们接受任何鸭式类型的集合。
  • [orm]
    添加了一个示例 dynamic_dict/dynamic_dict.py,演示了在 dynamic_loader 上放置字典行为的简单方法。

sql

  • [sql]
    通过.collate()表达式运算符和 collate(, ) sql 函数添加了 COLLATE 支持。
  • [sql]
    修复了当应用于非表连接的选择语句时 union()的错误。
  • [sql]
    当作为 FROM 子句使用时,text()表达式的行为得到了改进,例如 select().select_from(text(“sometext”))
    参考:#1014
  • [SQL]
    Column.copy()尊重“autoincrement”的值,修复了与 Migrate 一起使用的问题
    参考:#1021

mssql

  • [mssql]
    添加了“odbc_autotranslate”参数到引擎/dburi 参数。任何给定的字符串都将传递到 ODBC 连接字符串中:

”AutoTranslate=%s” % odbc_autotranslate

  • 参考:#1005
  • [mssql]
    添加了“odbc_options”参数到引擎/dburi 参数。给定的字符串简单地附加到 SQLAlchemy 生成的 ODBC 连接字符串中。
    这应该消除将来需要添加大量 ODBC 选项的需求。

杂项

  • [声明式] [扩展]
    连接表继承映射器使用了一个稍微放松的函数来创建“继承条件”到父表,以便对尚未声明的 Table 对象的其他外键不会触发错误。
  • [声明式] [扩展]
    修复了在 ForeignKey 中使用已声明属性时的重入映射器编译挂起问题,即 ForeignKey(MyOtherClass.someattribute)
  • [引擎]
    现在可以将池监听器提供为可调用的字典或(可能是部分的)PoolListener 的鸭子类型,由您选择。
  • [引擎]
    添加了“rollback_returned”选项到 Pool,它将禁用在连接返回时发出的 rollback()。此标志仅在不支持事务的数据库(即 MySQL/MyISAM)中使用是安全的。
  • [扩展]
    基于集合的关联代理 |=,-=,^=和&=对其操作数更为严格,仅对集合,frozenset 或其他关联代理进行操作。以前,它们将接受任何鸭子类型的集合。
  • [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()仍然会将给定对象的状态复制到持久对象上,因此像上面的示例通常会将“x”的所有属性的“None”复制到持久副本上。这些可以使用 session.expire(x)来恢复。
  • [ORM]
    还修复了 merge()中的行为,即目标上存在但未在合并集合中的集合元素未从目标中删除。
  • [ORM]
    添加了对“未编译映射器”的更积极检查,特别有助于声明式层。
    参考:#995
  • [ORM]
    “primaryjoin”/“secondaryjoin”背后的方法论已进行了重构。行为应该稍微更智能一些,主要表现在错误消息方面,已经简化为更易读的形式。在少量情况下,它可以更好地解析正确的外键。
  • [orm]
    添加 comparable_property(),将查询比较器行为添加到常规的、未受管理的 Python 属性中
  • [orm] [‘machines’] [Company.employees.of_type(Engineer)]
    查询.with_polymorphic() 的功能已添加到 mapper() 中作为配置选项。
    它通过几种形式设置:
    with_polymorphic=’ * ’ with_polymorphic=[mappers] with_polymorphic=(’ * ', selectable) with_polymorphic=([mappers], selectable)
    这控制了继承映射器的默认多态加载策略。当没有给定可选择项时,将为所有请求的联接表继承映射器创建外连接。请注意,联接的自动创建与具体表继承不兼容。
    现有的 mapper() 上的 select_table 标志现在已弃用,并且与 with_polymorphic(’ * ', select_table) 同义。请注意,select_table 的底层“内涵”已被完全删除并替换为更新、更灵活的方法。
    新方法还自动允许对子类进行及早加载,如果它们存在的话,例如:
sess.query(Company).options(eagerload_all())
• 1
  • 以加载 Company 对象、其员工和作为工程师的员工的‘machines’集合为例。很快还应该引入一个“with_polymorphic”查询选项,该选项将允许对关系上的 with_polymorphic() 进行每个查询的控制。
  • [orm]向查询中添加了两个“实验性”功能,“实验性”是因为它们的具体名称/行为还没有最终确定:_values() 和 _from_self()。我们希望得到关于这些功能的反馈。
  • _values(*columns)  接收列表达式列表,并返回一个只返回这些列的新查询。在求值时,返回值是一个元组列表,就像使用 add_column() 或  add_entity() 时一样,唯一的区别是“实体零”,即映射类,不包含在结果中。这意味着现在终于可以在 Query 上使用  group_by() 和 having(),这些功能到目前为止一直没有用。
    该方法的未来更改可能包括删除其加入、过滤和允许其他与“结果集”无关的选项的能力,因此我们寻求的反馈是人们希望如何使用 _values()……即在最后,还是人们更喜欢在调用后继续生成。
  • _from_self()编译  Query 的 SELECT 语句(减去任何急加载器),并返回一个从该 SELECT 选择的新 Query。所以基本上你可以从一个 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]
    当挂起实例上的属性过期时,当触发“refresh”操作并且找不到结果时不会引发错误。
  • [orm]
    Session.execute 现在可以从元数据中找到绑定
  • [orm]
    调整了“自引用”的定义,即任何具有共同父级的两个映射器(这会影响是否需要在与 Query 连接时需要 aliased=True)。
  • [orm]
    对 query.join()中的“from_joinpoint”参数进行了一些修复,以便如果前一个连接被别名化而这个连接没有,连接仍然成功进行。
  • [orm]各种“级联删除”修复:
  • 修复了动态关系的“级联删除”操作,该操作仅在 0.4.2 中实现了外键空值行为,而不是实际级联删除
  • 在多对一上没有 delete-orphan 级联的删除级联将不会删除在调用 session.delete()之前从父级断开连接的孤立节点(一对多已经有了这个)。
  • 在删除级联与 delete-orphan 级联时,无论它是否仍附加到也已删除的父级,都将删除孤立节点。
  • 在使用继承时,可以正确检测到存在于超类上的关系上的 delete-orphan 级联。
  • 参考:#895
  • [orm]
    修复了在使用 select_from()时,Query 中正确别名映射器配置的 order_by 计算顺序。
  • [orm]
    重构了在用另一个集合替换一个集合时触发的差异逻辑为 collections.bulk_replace,对于构建多级集合的任何人都很有用。
  • [orm]
    将级联遍历算法从递归转换为迭代,以支持深层对象图。

sql

  • [sql]
    在模式限定的表中,现在将模式名称放在所有列表达式以及生成列标签时的表名之前。这在所有情况下都可以防止跨模式名称冲突
    参考:#999
  • [sql]
    现在可以允许选择所有 FROM 子句相关联且自身没有 FROM 的查询。这些通常在标量上下文中使用,即 SELECT x, (SELECT x WHERE y) FROM table。需要显式调用 correlate()。
  • [sql]
    ‘name’不再是 Column()的必需构造参数。现在可以推迟直到列添加到表中。
  • [sql]
    like(),ilike(),contains(),startswith(),endswith()接受一个可选的关键字参数“escape=”,使用语法“x LIKE y ESCAPE ‘’”设置为转义字符。
    参考:#791#993
  • [sql]
    random()现在是一个通用的 sql 函数,并将编译为数据库的随机实现(如果有)。
  • [sql]
    update().values()和 insert().values()接受关键字参数。
  • [sql]
    修复了 select()在生成 FROM 子句方面的问题,在罕见情况下,可能会产生两个子句,而本意是取消另一个。一些具有大量急加载的 ORM 查询可能会看到这种症状。
  • [sql]
    case()函数现在还将字典作为其  whens 参数。它还默认将“THEN”表达式解释为值,这意味着 case([(x==y, “foo”)])将“foo”解释为绑定值,而不是  SQL 表达式。在这种情况下,对于标准本身,如果“value”关键字存在,这些可能仅为文字字符串,否则 SA 将强制使用 text()或  literal()。

mysql

  • [mysql]
    方言用于缓存服务器设置的连接.info 键已更改并现在已命名空间化。

mssql

  • [mssql]
    反映的表现在将自动加载其他被自动加载表中的外键引用的表。
    参考:#979
  • [mssql]
    添加了 executemany 检查以跳过标识获取。
    参考:#916
  • [mssql]
    添加了小日期类型的存根。
    参考:#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”。解析同义词必然会导致一些混乱的猜测,我们宁愿默认情况下将其关闭。当设置了标志时,表和相关表将在所有情况下针对同义词进行解析,这意味着如果特定表存在同义词,则在反射相关表时将使用它。这比以前的行为更粘性,这就是为什么默认情况下关闭的原因。

杂项

  • [declarative] [extension]
    “synonym” 函数现在可以直接与 “declarative” 一起使用。通过使用“descriptor” 关键字参数传入装饰的属性,例如:somekey = synonym('_somekey', descriptor=property(g, s))
  • [declarative] [extension]
    “deferred” 函数可以与 “declarative” 一起使用。最简单的用法是一起声明 deferredColumn,例如:data = deferred(Column(Text))
  • [declarative] [extension]
    Declarative 还增加了 @synonym_for(…)@comparable_using(…),作为 synonymcomparable_property 的前端。
  • [declarative] [extension]
    在使用 declarative 时,对映射器编译进行了改进;已经编译的映射器在使用时仍会触发其他未编译的映射器的编译。
    参考:#995
  • [declarative] [extension]
    Declarative 将为缺少名称的列完成设置,允许更干燥的语法。

class Foo(Base):

__tablename__ = 'foos' id = Column(Integer, primary_key=True)

  • [declarative] [extension]
    在 declarative 中,可以通过将 “inherits=None” 发送到 __mapper_args__ 来禁用继承。
  • [declarative] [extension]
    declarative_base() 接受可选的关键字参数“mapper”,这是任何可调用/类/方法,用于生成映射器,例如 declarative_base(mapper=scopedsession.mapper)。这个属性也可以在单独的声明类中使用“mapper_cls”属性进行设置。
  • [postgres]
    修复了 PG 服务器端游标的问题,将固定单元测试作为默认测试套件的一部分。为游标 ID 添加了更好的唯一性。
    参考:#1001

0.4.4

发布日期:2008 年 3 月 12 日(星期三)

orm

  • [orm]
    any(), has(), contains(), ~contains(), 属性级别的 ==!= 现在可以正确地与自引用关系一起使用 - 在 EXISTS 内部的子句在“remote”一侧被别名化,以区分它与父表。这适用于单表自引用以及基于继承的自引用。
  • [orm]
    修复了在与 NULL 比较一对一关系时,关系() 级别的 == 和 != 运算符的行为。
    参考:#985
  • [orm]
    修复了一个错误,即当由 select_table 映射的多态映射实例未加载 session.expire() 属性时。
  • [orm]
    添加了 query.with_polymorphic() - 指定了从基类继承的类列表,这些类将被添加到查询的 FROM 子句中。允许在过滤器()条件中使用子类,并且急切加载这些子类的属性。
  • [orm]
    你的呼声已经被听到:使用 delete-orphan 从属性或集合中删除挂起的项目会将该项目从会话中删除;不会引发 FlushError。请注意,如果您显式地 session.save()了挂起的项目,则属性/集合的移除仍会将其排除。
  • [orm]
    当在会话中调用 session.refresh()和 session.expire()时,对于不在会话中持久存在的实例会引发错误。
  • [orm]
    当使用 join()生成多个 Query 对象时,可能会出现生成性 bug。
  • [orm]
    修复了在  0.4.3 中引入的 bug,当使用默认的“select” polymorphic_fetch  时,加载已持久化的实例映射到连接表继承时,会触发一个无用的从其连接表加载的“次要”加载。这是由于属性在第一次加载时被标记为过期,并且在上一个“次要”加载中未被标记为未过期。属性现在基于任何加载或提交操作成功后在  dict 中的存在而被标记为未过期。
  • [orm]
    废弃的 Query 方法 apply_sum()、apply_max()、apply_min()、apply_avg()。更好的方法学正在到来……。
  • [orm]
    relation()可以接受一个可调用对象作为其第一个参数,该可调用对象返回要相关联的类。这是为了帮助声明式包在类尚未就位时定义关系。
  • [orm]
    添加了一个新的“更高级别”的操作符称为“of_type()”:在 join()中以及与 any()和 has()一起使用时,用于限定将在过滤条件中使用的子类,例如:

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==)),在执行时评估的实际主键值,以便  Query 的自动刷新步骤可以完成,从而在是挂起的情况下填充的 PK 值。
  • [orm]
    将关系级别的 order by 设置为“secondary”表中的列现在可以与急切加载一起使用,以前的“order by”不会对次要表的别名进行别名处理。
  • [orm]
    现在,基于现有描述符的同义词现在是这些描述符的完全代理。

sql

  • [sql]
    可以再次对文本 FROM 子句创建选择的别名。
    参考:#975
  • [sql]
    bindparam() 的值可以是可调用的,这样在语句执行时会被评估以获取值。
  • [SQL]
    添加了对结果集获取的异常包装/重新连接支持。重新连接适用于那些在结果集期间引发可捕获数据错误的数据库(即在 MySQL 上不起作用)。
    参考:#978
  • [SQL]
    实现了“threadlocal”引擎的两阶段 API,通过 engine.begin_twophase(),engine.prepare()
    参考:#936
  • [SQL]
    修复了阻止 UNION 可克隆的错误。
    参考:#986
  • [SQL]
    在 insert()、update()、delete() 和 DDL() 中添加了“bind”关键字参数。现在这些语句上的 .bind 属性也可以赋值,就像在 select() 上一样。
  • [SQL]
    现在可以在 INSERT 和 INTO 之间编译带有额外“前缀”单词的插入语句,用于供应商扩展,如 MySQL 的 INSERT IGNORE INTO table。

扩展

  • [扩展]
    添加了一个新的超小型“声明式”扩展,允许在类声明下方内联进行  Table 和 mapper() 配置。此扩展与 ActiveMapper 和 Elixir 不同之处在于它根本不重新定义任何  SQLAlchemy 语义;字面 Column、Table 和 relation() 构造用于定义类行为和表定义。

杂项

  • [方言]
    无效的 SQLite 连接 URL 现在会引发错误。
  • [方言]
    postgres TIMESTAMP 现在可以正确渲染
    参考:#981
  • [方言]
    postgres PGArray 默认是“可变”类型;在与 ORM 一起使用时,使用可变风格的相等性/写时复制技术来测试更改。

0.4.3

发布日期:Thu Feb 14 2008

通用

  • [通用]
    修复了许多隐藏的以及一些不那么隐藏的兼容性问题,感谢对 Python 2.3 的新支持,使得完整测试套件可以在 2.3 上运行。
  • [通用]
    现在警告被作为类型异常.SAWarning 发出。

ORM

  • [ORM]
    每个 Session.begin() 现在必须伴随相应的  commit() 或 rollback(),除非会话使用 Session.close() 关闭。这也包括使用  transactional=True 创建的会话隐式的 begin()。这里引入的最大变化是,当使用 transactional=True  创建的会话在 flush() 期间引发异常时,您必须调用 Session.rollback() 或 Session.close()  以便该会话在异常后继续。
  • [ORM]
    修复了在合并瞬时实体与带有反向引用集合的实体时出现的 merge() 集合加倍错误。
    参考:#961
  • [ORM]
    merge(dont_load=True) 不接受瞬时实体,这与 merge(dont_load=True) 不接受任何“脏”对象的事实相一致。
  • [ORM]
    添加了由 scoped_session 生成的独立“query”类属性。这提供了 MyClass.query,而不使用 Session.mapper。通过以下方式使用:

MyClass.query = Session.query_property()

  • [orm]
    当尝试在没有会话的情况下访问过期实例属性时,会引发适当的错误消息
  • [orm]
    dynamic_loader() / lazy=”dynamic”现在接受并使用 order_by 参数,方式与 relation()中的工作方式相同。
  • [orm]
    添加了 expire_all()方法到 Session。为所有持久实例调用 expire()。这在与…一起使用时很方便。
  • [orm]
    部分或完全过期的实例在影响这些对象的常规查询操作期间将其过期属性填充,从而防止每个实例需要不必要的第二个 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]
    修复了多态继承中的一个 bug,当基本的多态 _on 列不对应于继承映射器的本地可选择的任何列时,引发了不正确的异常,超过一层。
  • [orm]
    修复了多态继承中的一个 bug,这使得很难在多态映射器上设置一个工作的 “order_by”。
  • [orm]
    修复了 Query 中的一个相当昂贵的调用,该调用减慢了多态查询的速度。
  • [orm]
    如果需要,”被动默认值“ 和其他 ”内联“ 默认值现在可以在 flush() 调用时加载;特别是,这允许构建关系(),其中外键列引用服务器端生成的非主键列。
    参考:#954
  • [orm]其他 Session 事务修复/更改:
  • 修复了会话事务管理中的一个 bug:当向嵌套事务添加连接时,父事务没有在连接上启动。
  • 现在 session.transaction 总是指向最内层的活动事务,即使在会话事务对象上直接调用 commit/rollback。
  • 两阶段事务现在可以被准备。
  • 当在一个连接上准备两阶段事务失败时,所有的连接都会回滚。
  • 当使用嵌套事务时,session.close() 没有关闭所有事务。
  • rollback() 以前错误地将当前事务直接设置为可以回滚的事务的父事务。现在它将回滚到能够处理它的下一个事务,但将当前事务设置为其父事务,并且使之间的事务无效。无效的事务只能回滚或关闭,任何其他调用都会导致错误。
  • 对于 commit(),autoflush 没有对简单的子事务进行刷新。
  • unitofwork flush 在会话不在事务中且提交事务失败时,没有关闭失败的事务。
  • [orm]
    杂项票据:
    参考:#940, #964

sql

  • [sql]
    添加了 “schema.DDL”,一个可执行的自由格式 DDL 语句。DDL 可以独立执行,也可以附加到 Table 或 MetaData 实例上,并在创建和/或删除这些对象时自动执行。
  • [sql]
    可以使用 ‘useexisting=True’ 标志覆盖表列和约束,该标志现在考虑与其一起传递的参数。
  • [sql]
    添加了基于可调用的 DDL 事件接口,添加了在创建和删除 Tables 和 MetaData 之前和之后的钩子。
  • [sql]
    添加了 where() 方法到 delete()update() 构造函数中,该方法返回一个新对象,其中的条件与现有条件通过 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 中将通配符运算符与给定操作数连接起来,即在所有情况下为“’%’ || ”,正确接受 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 语句没有被放在那里。现在它们将被放在那里,如果没有‘name’可用,则使用它们的完整字符串表示。
  • [sql]
    CompositeSelect,即任何 union()、union_all()、intersect()等现在断言每个可选择对象包含相同数量的列。这符合相应的 SQL 要求。
  • [sql]
    为否则未标记的函数和表达式生成的匿名‘label’现在在编译时向外传播,例如 select([select([func.foo()])])的表达式。
  • [sql]
    在上述思想的基础上,CompositeSelects 现在根据第一个可选择对象中存在的名称构建其“.c.”集合;corresponding_column()现在对所有嵌入式可选择对象完全有效。
  • [sql]
    Oracle 和其他数据库现在正确编码用于序列等默认值的 SQL,即使没有使用 unicode 标识符,因为标识符准备器可能返回缓存的 unicode 标识符。
  • [sql]
    表和子句与表达式左侧的 datetime 对象现在可以比较(d < table.c.col)。(右侧的 datetimes 一直有效,左侧的异常是 datetime 实现的怪癖。)

杂项

  • [方言]
    SQLite 中对模式的更好支持(通过 ATTACH DATABASE … AS name 链接)。在过去的一些情况下,SQLite 生成的 SQL 中省略了模式名称。���在不再这样。
  • [方言]
    SQLite 上的 table_names 现在也会选择临时表。
  • [方言]
    在反射操作期间自动检测未指定的 MySQL ANSI_QUOTES 模式,支持在中间更改模式。如果不使用反射,则仍然需要手动设置模式。
  • [方言]
    修复了 SQLite 上 TIME 列的反射。
  • [方言]
    最终将 PGMacAddr 类型添加到 postgres 中
    参考:#580
  • [方言]
    在 Firebird 下反映与 PK 字段关联的序列(通常具有 BEFORE INSERT 触发器)
  • [方言]
    在生成 LIMIT/OFFSET 子查询时,Oracle 组装结果集列映射的正确列,即使长名称截断也允许列正确映射到结果集
    参考:#941
  • [方言]
    MSSQL 现在在 _is_select 正则表达式中包含 EXEC,这应该允许使用返回行的存储过程。
  • [方言]
    MSSQL  现在包含对 ANSI SQL row_number() 函数的 LIMIT/OFFSET 的实验性实现,因此需要 MSSQL-2005  或更高版本。要启用此功能,请将 “has_window_funcs” 添加到 connect 的关键字参数中,或将  “?has_window_funcs=1” 添加到您的 dburi 查询参数中。
  • [扩展]
    更改 ext.activemapper 以使用非事务性会话进行对象存储。
  • [扩展]
    修复了关联代理列表上的 “[‘a’] + obj.proxied” 二元操作的输出顺序。

0.4.2p3

发布日期:2008 年 1 月 9 日

通用

  • [通用]
    子版本编号方案更改为适应 setuptools 版本号规则;easy_install -u 现在应该获取此版本而不是 0.4.2。

ORM

  • [ORM]
    在使用“可变标量”(如 PickleTypes)时,修复了关于 session.dirty 的错误
  • [ORM]
    当在主或次要关联条件中使用非本地映射列刷新时,添加了更详细的错误消息
  • [ORM]
    现在在 InstanceState.__cleanup() 中抑制 所有 错误。
  • [ORM]
    修复了属性历史记录错误,即对于已经有挂起更改的基于集合的属性,将新集合分配给该属性会生成不正确的历史记录
    参考:#922
  • [ORM]
    修复了 delete-orphan 级联错误,即将相同对象两次设置到标量属性可能会将其记录为孤儿
    参考:#925
  • [ORM]
    修复了对基于列表的关系的 += 赋值上的级联。
  • [ORM]
    现在可以对尚不存在的属性创建同义词,稍后通过 add_property() 添加。这通常包括反向引用。(即您可以创建反向引用的同义词,而不必担心操作顺序)
    参考:#919
  • [ORM]
    修复了可能发生的多态“union”映射器的错误,该错误会回退到继承表的“延迟”加载
  • [ORM]
    映射器/映射类(即‘c’)上的“columns”集合针对映射表,而不是在多态“union”加载情况下的 select_table(这不应该是可察觉的)。
  • [orm]
    修复了一个相当关键的 bug,即相同实例可能会在 unitofwork.new 集合中列出多次;最常见的情况是在使用继承映射器和 ScopedSession.mapper 的组合时,每个实例的多个 init 调用可能会使用不同的 _state 对象保存()对象
  • [orm]
    向  Query 添加了非常基本的迭代器行为。调用 query.yield_per()并在迭代上下文中评估 Query;每个 N 行的集合将被打包并   yield。请极度谨慎使用此方法,因为它不会尝试在结果批次边界上协调急切加载的集合,也不会在同一批次中出现相同实例时表现良好。这意味着如果在多个批次中引用了急切加载的集合,它将被清除,并且在所有情况下,如果在多个批次中出现相同实例,属性将被覆盖。
  • [orm]
    为集合和关联代理集合提供了固定的原地设置变异操作符。
    参考:#920

sql

  • [sql]
    现在 Text 类型已正确导出,并且在 DDL 创建时不会引发警告;没有长度的 String 类型仅在 CREATE TABLE 时引发警告
    参考:#912
  • [sql]
    添加了新的 UnicodeText 类型,用于指定编码的、无长度的 Text 类型
  • [sql]
    修复了 union()中的 bug,使得不从 FromClause 对象派生的 select()语句可以进行 union 操作
  • [sql]
    将  TEXT 的名称更改为 Text,因为它是一个“通用”类型;TEXT 名称在 0.5 版本之前已被弃用。当没有长度时,String 转为  Text 的“升级”行为也在 0.5 版本之前被弃用;在用于 CREATE TABLE 语句时将发出警告(在 SQL 表达式目的上没有长度的  String 仍然可以使用)
    参考:#912
  • [sql]
    修复了 generative select.order_by(None) / group_by(None)未能重置 order by/group by 条件的问题
    参考:#924

杂项

  • [dialects]
    修复了 mysql 空字符串列默认值的反射。
  • [ext]
    为关联代理列表添加了‘+’、‘’、‘+=’和‘=’支持。
  • [dialects]
    mssql - 缩小了对 MSDate/MSDateTime 子类中“date”/“datetime”的测试范围,以防止传入的“datetime”对象被错误解释为“date”对象,反之亦然。
    参考:#923
  • [dialects]
    修复了 PGArray 类型的 subtype 结果处理器的缺失调用。
    参考:#913

0.4.2

发布日期:2008 年 1 月 2 日(星期三)

orm

  • [orm]
    针对基于集合的反向引用的主要行为更改:它们不再触发延迟加载!“reverse”添加和删除被排队,并在实际读取和加载集合时与集合合并;但在此之前不会触发加载。对于注意到这种行为的用户,在某些情况下,这应该比在某些情况下使用动态关系更方便;对于那些没有注意到的用户,您可能会注意到您的应用程序在某些情况下使用的查询比以前少得多。
    参考:#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()进行对称调用;以前,一个没有修改列属性(但有关系()修改)的实例可能会调用 before_update()但不调用 after_update()
    参考:#907
  • [orm]
    查询语句中缺失的列现在在加载时会自动延迟加载。
  • [orm]
    扩展“object”并且在实例构造时没有提供 init()方法的映射类现在会在实例构造时引发 TypeError,如果存在非空*args 或**kwargs(并且不被任何扩展(如 scoped_session mapper)消耗),与普通 Python 类的行为一致
    参考:#908
  • [orm]
    修复了当 filter_by()将关系与 None 进行比较时的 Query bug
    参考:#899
  • [orm]
    改进了对映射实体的 pickling 支持。现在,每个实例的惰性/延迟/过期可调用对象都是可序列化的,因此它们可以与 _state 一起序列化和反序列化。
  • [orm]
    新的  synonym()行为:如果映射类上不存在属性,则属性将放置在映射类上。如果类上已经存在属性,则 synonym  将使用适当的比较运算符装饰属性,以便它可以像任何其他映射属性一样在列表达式中使用(即可在  filter()中使用等)。“proxy=True”标志已弃用,不再具有任何意义。此外,“map_column=True”标志将自动生成与同义词名称相对应的  ColumnProperty,即:‘somename’:synonym(‘_somename’,  map_column=True)将把名为’somename’的列映射到属性’_somename’。请参阅映射器文档中的示例。
    参考:#801
  • [orm]
    Query.select_from()现在用给定的参数替换所有现有的  FROM 条件;以前的行为通常不太有用,因为它需要 filter()调用来创建连接条件,并且在 filter()中引入的新表已经添加到了  FROM 子句中。新行为不仅允许从主表进行连接,还允许选择语句。过滤条件、排序条件、急加载子句将与给定语句进行“别名”对比。
  • [orm]
    本月对属性工具化的重构改变了自  0.3  中途以来我们一直拥有的“加载时复制”行为,大多数情况下改为了“修改时复制”。这样做可以大幅减少加载操作的延迟,并且总体工作量更少,因为只有实际被修改的属性才会复制其“已提交状态”。只有“可变标量”属性(即  pickle 对象或其他可变项)才保留了旧行为,这也是改变加载时复制的原因。
  • [orm] [attrname]
    对属性的轻微行为变化是,删除属性不会再次触发该属性的惰性加载器;“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]
    eagerloading 将与通过 add_entity()添加的映射器一起工作。
  • [orm]
    在“dynamic”关系中添加了“级联删除”行为,就像常规关系一样。如果未设置 passive_deletes 标志(也刚刚添加),则删除父项将触发对子项的完全加载,以便可以相应地删除或更新它们。
  • [orm]
    还使用 dynamic,实现了正确的 count()行为以及其他辅助方法。
  • [orm]
    修复了多态关系上的级联问题,使得从对象到多态集合的级联继续沿着集合中每个元素特定的属性集进行级联。
  • [orm]
    query.get()和 query.load()不考虑现有的过滤器或其他条件;这些方法总是在数据库中查找给定的 id 或从标识映射中返回当前实例,而不考虑已配置的任何现有过滤器、连接、group_by 或其他条件。
    参考:#893
  • [orm]
    在继承映射器中添加了对 version_id_col 的支持。version_id_col 通常在继承关系中的基本映射器上设置,在那里它对所有继承映射器生效。
    参考:#883
  • [orm]
    放宽了  column_property()表达式具有标签的规则;现在接受任何 ColumnElement,因为编译器现在会自动为没有标签的  ColumnElement 添加标签。可选择的,如 select()语句,仍然需要通过 as_scalar()或 label()转换为  ColumnElement。
  • [orm]
    修复了无法删除 instance.attr 的 backref 错误,如果 attr 为 None 的话
  • [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}
• 1
• 2
• 3
  • MappedCollection 使用此钩子来确保从集合的角度来看传入的键/值对是合理的。
  • [orm]
    在双向关系的两侧同时使用 lazy=”dynamic”时修复了无限循环问题
    参考:#872
  • [orm]
    在 Query + eagerloads 中应用 LIMIT/OFFSET 别名的更多修复,这种情况下映射到 select 语句时
    参考:#904
  • [orm]
    修复了自引用的急切加载,以便如果同一映射实例出现在同一结果集中的两个或更多不同列集中,其急切加载的集合将被填充,无论所有行是否包含该集合的“急切”列集。当打开 join_depth 时,这也会显示为 KeyError。
  • [orm]
    修复了当在继承映射器中使用 LIMIT 与仅在父映射器中存在急切加载器时,Query 不会将子查询应用于 SQL 的错误。
  • [orm]
    澄清了当您尝试使用相同标识键更新()一个已经存在于会话中的实例时出现的错误消息。
  • [orm]
    对  merge(instance,  dont_load=True)进行了一些澄清和修复。修复了懒加载器在返回的实例上被禁用的错误。此外,我们目前不支持合并具有未提交更改的实例,在使用  dont_load=True  的情况下….现在会引发错误。这是因为合并给定实例的“已提交状态”以正确对应新复制的实例以及其他修改状态的复杂性。由于  dont_load=True  的用例是缓存,给定实例不应该有任何未提交的更改。我们现在也不使用任何事件将实例复制到新会话中,因此新会话上的“脏”列表保持不受影响。
  • [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))知道其返回类型是一个日期。到目前为止,我们只表示了一些函数,但将继续向系统添加。
    参考:#615
  • [sql]
    自动重新连接支持改进;连接现在可以在其基础连接无效后自动重新连接,而不需要从引擎重新连接()。这允许绑定到单个连接的  ORM 会话不需要重新连接。连接上的打开事务在基础连接无效后必须回滚,否则会引发错误。还修复了在 cursor(),rollback()或  commit()中未调用 disconnect detect 的错误。
  • [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().as_scalar() 如果 select 在其列子句中没有确切一个表达式,则会引发异常。
  • [sql]
    bindparam() 对象本身可以用作 execute() 的键,即 statement.execute({bind1:’foo’, bind2:’bar’)
  • [sql]
    添加了新的方法到  TypeDecorator,process_bind_param() 和  process_result_value(),它们自动利用底层类型的处理。非常适合与 Unicode 或 Pickletype  一起使用。TypeDecorator 现在应该是增强任何现有类型行为的主要方式,包括其他 TypeDecorator 子类,如  PickleType。
  • [sql]
    selectables(以及其他对象)在其导出列集合中基于名称冲突的两列时将发出警告。
  • [sql]
    具有模式的表仍然可以在 sqlite、firebird 中使用,模式名称只是被删除
    参考:#890
  • [sql]
    将各种“literal”生成函数更改为使用匿名绑定参数。 这里没有太多变化,除了它们的标签现在看起来像“:param_1”,“:param_2”而不是“:literal”
  • [sql]
    现在支持形式为“tablename.columname”的列标签,即带有点的形式。
  • [sql]
    select() 的 from_obj 关键字参数可以是标量或列表。

杂项

  • [dialects]
    sqlite SLDate 类型不会错误地呈现日期时间或时间对象的“微秒”部分。
  • [dialects]oracle
  • 为 Oracle 添加了断开连接检测支持
  • 对二进制/原始类型进行了一些清理,以便在需要时检测 cx_oracle.LOB
  • 参考:#902
  • [dialects]MSSQL
  • PyODBC 不再具有全局的 “set nocount on”。
  • 修复 autoload 上的非标识整数 PKs
  • 更好地支持 convert_unicode
  • 对于 pyodbc/adodbapi,日期转换更加宽松
  • 模式限定的表 / autoload
  • 参考:#824, #839, #842, #901
  • [backend] [firebird]
    正确反映域(部分修复)和 PassiveDefaults
    参考:#410
  • [3562] [后端] [firebird]
    恢复使用默认的池类(在 0.4.0 中设置为 SingletonThreadPool 用于测试目的)
  • [后端] [firebird]
    将 func.length()映射到‘char_length’(在旧版本的 Firebird 上可以轻松使用 UDF‘strlen’进行覆盖)

0.4.1

发布日期:2007 年 11 月 18 日星期日

orm

  • [orm]
    eager loading 与应用 LIMIT/OFFSET 不再将主表连接到其自身的有限子查询;现在,eager loads 直接连接到提供主表列给结果集的子查询。这消除了所有带有 LIMIT/OFFSET 的 eager loads 的 JOIN。
    参考:#843
  • [orm]
    session.refresh()和 session.expire()现在支持额外的参数“attribute_names”,一个包含要刷新或过期的单个属性键名的列表,允许对已加载实例的属性进行部分重新加载。
    参考:#802
  • [orm]
    向 instrumented 属性添加了 op()运算符;例如,User.name.op(‘ilike’)(‘%somename%’)
    参考:#767
  • [orm]
    映射类现在可以定义具有任意语义的 eqhashnonzero 方法。orm 现在仅基于标识处理所有映射实例。(例如,‘is’ vs ‘==’)
    参考:#676
  • [orm]
    Mapper 上的“properties”访问器已被移除;现在会抛出一个信息性异常,解释 mapper.get_property()和 mapper.iterate_properties 的用法
  • [orm]
    在 Query 中添加了 having()方法,与 filter()类似,将 HAVING 应用于生成的语句。
  • [orm]
    query 现在完全基于路径的选项,即诸如 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(),查询不会抛出错误
    参考:#848
  • [orm]
    使用 distinct()时,来自连接表的 order_by()表达式将正确添加到列子句中
    参考:#786
  • [orm]
    修复了 Query.add_column()不接受类绑定属性作为参数的错误;Query 还会在 add_column()(在 instances()时间)发送无效参数时引发错误
    参考:#858
  • [orm]
    在 InstanceState.__cleanup() 中增加了更多的垃圾收集解引用检查,以减少应用程序关闭时的 “gc ignored” 错误。
  • [orm]
    会话 API 已经稳定:
  • [orm]
    对已经持久化的对象执行 session.save() 是一个错误
    参考:#840
  • [orm]
    对于 持久对象执行 session.delete() 是一个错误。
  • [orm]
    当更新或删除已在会话中具有不同标识的实例时,session.update() 和 session.delete() 将抛出错误。
  • [orm]
    在确定 “对象 X 已在另一个会话中” 时,会话检查得更加仔细;例如,如果你 pickle 一系列对象然后 unpickle(即在 Pylons HTTP 会话或类似情况下),它们可以进入新的会话而不会产生任何冲突。
  • [orm]
    merge() 包含了一个关键字参数 “dont_load=True”。设置此标志将导致合并操作不会从数据库中加载任何数据以响应传入的分离对象,并且将接受传入的分离对象,就好像它已经存在于该会话中。用于将外部缓存系统中的分离对象合并到会话中。
  • [orm]
    当属性为延迟列属性时,不再触发加载操作,当属性被赋值时,新分配的值将无条件地出现在 flushes 的 UPDATE 语句中。
  • [orm]
    修复了重新分配集合子集(obj.relation = obj.relation[1:])时的截断错误。
    参考:#834
  • [orm]
    简化了反向引用配置代码,现在会为现有属性抛出错误的反向引用。
    参考:#832
  • [orm]
    改进了 add_property() 等的行为,修复了涉及 synonym/deferred 的问题。
    参考:#831
  • [orm]
    修复了 clear_mappers() 行为,以更好地清理自身。
  • [orm]
    修复了 “行切换” 行为,即当一个 INSERT/DELETE 结合到一个单独的 UPDATE 时;父对象上的多对多关系得到了正确更新。
    参考:#841
  • [orm]
    为关联代理修复了 hash ——这些集合是不可哈希的,就像它们的可变 Python 对应物一样。
  • [orm]
    为了减少作用域会话的 “save_or_update”、“contains” 和 “iter” 方法的代理。
  • [orm]
    修复了非常难以重现的问题,即查询的 FROM 子句可能会被某些生成调用污染。
    参考:#852

sql

  • [sql]
    “bindparam()” 上的 “shortname” 关键字参数已被弃用。
  • [sql]
    添加了包含运算符(生成一个 “LIKE %%” 子句)。
  • [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]
    修复了关于具有基于 SQL 表达式的默认生成器的主键列的 INSERT 语句;SQL 表达式会像正常情况下内联执行,但不会为那些通过 cursor.lastrowid 提供“postfetch”条件的列触发。
  • [sql]
    func.对象可以被 pickle/unpickle
    参考:#844
  • [sql]
    重写并简化了用于在可选择表达式之间“定位”列的系统。在  SQL 端,这由“corresponding_column()”方法表示。该方法在 ORM  中被广泛使用,用于将表达式的元素“适应”到类似的,别名的表达式,以及将最初绑定到表或可选择表达式的结果集列定位到别名的“对应”表达式。新的重写功能具有完全一致和准确的行为。
  • [sql]
    添加了一个字段(“info”)用于在模式项上存储任意数据。
    参考:#573
  • [sql]
    连接上的“properties”集合已重命名为“info”,以匹配模式的可写集合。直到 0.5 版本,仍可通过“properties”名称访问。
  • [sql]
    修复了使用 strategy=’threadlocal’时 Transaction 上的 close()方法。
  • [sql]
    修复了编译绑定参数不会错误地填充 None。
    参考:#853
  • [sql]
    ._execute_clauseelement 变成了一个公共方法 Connectable.execute_clauseelement

杂项

  • [dialects]
    添加了对 MaxDB 的实验性支持(仅适用于版本 >= 7.6.03.007)。
  • [dialects]
    现在 oracle 会将“DATE”反映为 OracleDateTime 列,而不是 OracleDate
  • [dialects]
    在 Oracle table_names() 函数中增加了对模式名称的支持,修复了 metadata.reflect(schema=’someschema’)
    参考:#847
  • [dialects]
    MSSQL 匿名标签用于选择函数,使其具有确定性
  • [dialects]
    sqlite 将“DECIMAL”反映为数字列。
  • [dialects]
    使访问 dao 检测更加可靠
    参考:#828
  • [dialects]
    将 Dialect 属性 ‘preexecute_sequences’ 重命名为 ‘preexecute_pk_sequences’。对于使用旧名称的 out-of-tree 方言,现在有一个属性代理。
  • [dialects]
    为未知类型反射添加了测试覆盖。修复了 sqlite/mysql 对于未知类型反射的处理。
  • [dialects]
    为 mysql 方言添加了 REAL(用于利用 REAL_AS_FLOAT sql 模式的人)。
  • [dialects]
    mysql Float、MSFloat 和 MSDouble 现在构造时不带参数会产生无参数 DDL,例如’FLOAT’。
  • [misc]
    删除了未使用的 util.hash()。


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

相关文章
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十九)(2)
SqlAlchemy 2.0 中文文档(六十九)
23 0
|
3月前
|
SQL NoSQL 数据库
SqlAlchemy 2.0 中文文档(五十二)(5)
SqlAlchemy 2.0 中文文档(五十二)
21 0
|
3月前
|
SQL 关系型数据库 数据库
SqlAlchemy 2.0 中文文档(六十九)(4)
SqlAlchemy 2.0 中文文档(六十九)
16 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十九)(3)
SqlAlchemy 2.0 中文文档(六十九)
17 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十九)(5)
SqlAlchemy 2.0 中文文档(六十九)
20 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十七)(5)
SqlAlchemy 2.0 中文文档(六十七)
23 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十七)(3)
SqlAlchemy 2.0 中文文档(六十七)
20 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十七)(2)
SqlAlchemy 2.0 中文文档(六十七)
14 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十七)(4)
SqlAlchemy 2.0 中文文档(六十七)
13 0
|
3月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十七)(1)
SqlAlchemy 2.0 中文文档(六十七)
32 0