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

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

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


0.4.0

发布日期:2007 年 10 月 17 日

  • [无标签]
    (请参阅 0.4.0beta1,了解对 0.3 的主要更改的开始,以及 www.sqlalchemy.org/trac/wiki/WhatsNewIn04
  • [无标签]
    添加了初始的 Sybase 支持(目前仅支持 mxODBC)
    参考:#785
  • [无标签]
    为 PostgreSQL 添加了部分索引支持。在索引上使用 postgres_where 关键字。
  • [无标签]
    基于字符串的查询参数解析/配置文件解析器理解更广泛范围的字符串值作为布尔值
    参考:#817
  • [无标签]
    如果另一侧集合不包含项目,则 backref 删除对象操作不会失败,支持 noload 集合
    参考:#813
  • [无标签]
    从“动态”集合中删除了 len,因为这将需要发出 SQL“count()”操作,从而迫使所有列表评估发出冗余的 SQL。
    参考:#818
  • [无标签]
    添加了内联优化以定位 locate_dirty(),这可以大大加快对 flush()的重复调用,如 autoflush=True 时发生的情况。
    参考:#816
  • [无标签]
    IdentifierPreprarer 的 _requires_quotes 测试现在基于正则表达式。任何提供自定义合法字符集或非法初始字符集的树外方言都需要转移到正则表达式或覆盖 _requires_quotes。
  • [无标签]
    Firebird 的 supports_sane_rowcount 和 supports_sane_multi_rowcount 设置为 False,因为票号#370(正确方式)。
  • [无标签]在 Firebird 反射上的改进和修复:
  • FBDialect 现在模仿 OracleDialect,关于 TABLE 和 COLUMN 名称的大小写敏感性(请参见本文件中的“case_sensitive remotion”主题)。
  • FBDialect.table_names()不会带来系统表(票号:796)。
  • FB 现在正确反映了 Column 的 nullable 属性。
  • [无标签]
    修复了 SQL 编译器对结果集处理中使用的顶级列标签的意识;包含相同列名的嵌套选择不会影响结果或与结果列元数据冲突。
  • [无标签]
    query.get()和相关函数(如一对多的延迟加载)使用编译时别名绑定参数名称,以防止与已存在于映射可选择项中的绑定参数发生名称冲突。
  • [无标签]
    修复了三级和多级选择以及延迟继承加载(即没有 select_table 的 abc 继承)。
    参考:#795
  • [无标签]
    传递给 shard.py 中的 id_chooser 的标识符始终是一个列表。
  • [无标签]
    无参数 ResultProxy._row_processor()现在是类属性 _process_row。
  • [无标签]
    增加了对从 PostgreSQL 8.2+插入和更新返回值的支持。
    参考:#797
  • [无标签]
    PG   反射,在看到默认模式名称被明确用作表中的“模式”参数时,将假定这是用户期望的约定,并将在外键相关的反射表中明确设置“模式”参数,从而使它们仅与也使用显式“模式”参数的  Table 构造函数匹配(即使其为默认模式)。换句话说,SA 假定用户在此使用中是一致的。
  • [无标签]
    修复了 BOOL/BOOLEAN 的 sqlite 反射
    参考:#808
  • [无标签]
    在 mysql 上添加了对带有 LIMIT 的 UPDATE 的支持。
  • [无标签]
    m2o 上的空外键不会触发延迟加载
    引用:#803
  • [无标签]
    Oracle 不会隐式转换为 unicode 以用于非类型化结果集(即当没有使用 TypeEngine/String/Unicode 类型时;以前它会检测 DBAPI 类型并进行转换)。应该修复
    引用:#800
  • [无标签]
    修复了对长表/列名称的匿名标签生成
    引用:#806
  • [无标签]
    Firebird 方言现在使用 SingletonThreadPool 作为池类。
  • [无标签]
    Firebird 现在使用 dialect.preparer 格式化序列名称
  • [无标签]
    修复了 postgres 和多个两阶段事务之间的故障。两阶段提交和回滚不会像通常的 dbapi 提交/回滚一样自动结束一个新事务。
    引用:#810
  • [无标签]
    向 _ScopedExt 映射器扩展添加了一个选项,以便在对象初始化时不自动将新对象保存到会话中。
  • [无标签]
    修复了 Oracle 非 ANSI 连接语法
  • [无标签]
    PickleType 和 Interval 类型(在不原生支持它的数据库上)现在稍微更快。
  • [无标签]
    在 Firebird 中添加了 Float 和 Time 类型(FBFloat 和 FBTime)。修复了 TEXT 和 Binary 类型的 BLOB SUB_TYPE。
  • [无标签]
    更改了 in_ 运算符的 API。现在 in_() 接受一个参数,该参数是一个值序列或可选择的。传递值作为可变参数的旧 API 仍然有效,但已被弃用。

0.4.0beta6

发布日期:2007 年 9 月 27 日星期四

  • [无标签]
    会话标识映射现在默认为弱引用,使用 weak_identity_map=False 来使用常规字典。我们正在使用的弱字典被定制为检测“脏”实例,并保持对这些实例的临时强引用,直到更改被刷新。
  • [无标签]
    Mapper  编译已重新组织,大部分编译发生在映射器构造时。这使我们可以减少对 mapper.compile()  的调用,并且还允许基于类的属性强制进行编译(即 User.addresses == 7  将编译所有映射器;这是)。唯一的注意事项是,现在继承映射器在构造时会查找其继承的映射器;因此,继承关系中的映射器需要按照继承顺序进行构造(这应该是正常情况)。
    引用:#758
  • [无标签]
    在 Postgres 中检测到的关键字中添加了“FETCH”,以指示一个包含结果行的语句(即除了“SELECT”之外)。
  • [无标签]
    添加了 SQLite 保留关键字的完整列表,以便正确转义它们。
  • [无标签]
    加强了  Query 生成“eager load”别名与  Query.instances()之间的关系,Query.instances()实际上获取了被急加载的行。如果别名不是由 EagerLoader  专门为该语句生成的,则在获取行时 EagerLoader  将不起作用。这可以防止列被意外地抓取为急加载的一部分,当它们不是为此目的而设计时,这可能会发生在文本 SQL  以及一些继承情况下。这一点尤为重要,因为“匿名别名”现在使用简单的整数计数来生成标签。
  • [无标签]
    从  clauseelement.compile()中删除了“parameters”参数,替换为“column_keys”。传递给  execute()的参数仅与插入/更新语句的编译过程中存在的列名交互,而不涉及这些列的值。这样可以产生更一致的  execute/executemany 行为,内部简化了一些事情。
  • [无标签]
    在 PickleType 中添加了‘comparator’关键字参数。默认情况下,“mutable” PickleType 使用它们的 dumps()表示进行对象的“深度比较”。但这对于字典不起作用。提供适当 eq()实现的 Pickled 对象可以设置为“PickleType(comparator=operator.eq)”
    参考:#560
  • [无标签]
    添加了 session.is_modified(obj)方法;执行与 flush 操作中发生的“历史”比较操作相同;设置 include_collections=False 会得到与 flush 确定是否为实例的行发出 UPDATE 相同的结果。
  • [无标签]
    在 Sequence 中添加了“schema”参数;在 Postgres/Oracle 中,当序列位于替代模式中时,请使用此参数。实现部分,应该修复。
    参考:#584, #761
  • [无标签]
    修复了 mysql 枚举的空字符串反射。
  • [无标签]
    将 MySQL 方言更改为使用旧的 LIMIT , 语法,而不是对于使用 3.23 的人使用 LIMIT OFFSET 。
    参考:#794
  • [无标签]
    向 relation()添加了‘passive_deletes=”all”’标志,禁用了在删除父对象时刷新期间所有外键属性的置空。
  • [无标签]
    列默认值和 onupdates,在执行内联时,将为子查询和其他需要括号的表达式添加括号。
  • [无标签]
    关于  String/Unicode 类型的行为,当没有长度时它们自动转换为 TEXT/CLOB 现在仅适用于没有参数的 String 或  Unicode 精确类型。如果您使用没有长度的 VARCHAR 或 NCHAR(String/Unicode 的子类),它们将被方言解释为  VARCHAR/NCHAR;在那里不会发生“魔术”转换。这是更少令人惊讶的行为,特别是这有助于 Oracle 将基于字符串的绑定参数保持为  VARCHAR 而不是 CLOB。
    参考:#793
  • [无标签]
    修复了 ShardedSession 与延迟列一起工作的问题。
    参考:#771
  • [无标签]
    用户定义的 shard_chooser() 函数必须接受“clause=None”参数;这是传递给 session.execute(statement) 的 ClauseElement,并可用于确定正确的分片 id(因为 execute() 不接受实例)。
  • [无标签]
    调整了 NOT 运算符的优先级,以匹配 '’ 和其他运算符,因此 ~(x y) 会产生 NOT (x y),这与旧版 MySQL 更兼容。这不适用于“~(xy)”如同在 0.3 版本中一样,因为 ~(x==y) 编译为“x != y”,但仍适用于像 BETWEEN 这样的运算符。
    参考:#764
  • [无标签]
    其他票据:,.
    参考:#728, #757, #768, #779

0.4.0beta5

无发布日期

  • [无标签]
    连接池修复;beta4 的更好性能仍然存在,但修复了“连接溢出”和其他存在的 bug(例如)。
    参考:#754
  • [无标签]
    修复了从自定义继承条件确定正确同步子句的错误。
    参考:#769
  • [无标签]
    扩展了对 QueuePool 大小/溢出的 ‘engine_from_config’ 强制转换。
    参考:#763
  • [无标签]
    mysql 视图可以再次反射。
    参考:#748
  • [无标签]
    AssociationProxy 现在可以使用自定义的 getter 和 setter。
  • [无标签]
    修复了 orm 查询中 BETWEEN 的故障。
  • [无标签]
    修复了 OrderedProperties 的 pickling
    参考:#762
  • [无标签]
    SQL  表达式默认值和序列现在在 INSERT 或 UPDATE 期间对所有非主键列“内联”执行,并且在执行类似 executemany()  的调用期间对所有列执行。在任何 insert/update 语句上的 inline=True 标志也会强制相同的行为与单个  execute()。result.postfetch_cols() 是一个集合,其中包含上一个单个 insert 或 update 语句包含  SQL 端默认表达式的列。
  • [无标签]
    修复了 PG executemany() 的行为。
    参考:#759
  • [无标签]
    postgres 反映具有无默认值的主键列的表,autoincrement=False。
  • [无标签]
    postgres  不再使用单独的 execute()调用包装 executemany(),而是更倾向于性能。在使用 PG  时,对已删除项目进行“rowcount”/“concurrency”检查(使用 executemany)被禁用,因为 psycopg2 不会为  executemany()报告正确的 rowcount。
  • [已修复] [票务]
    参考:#742
  • [已修复] [票务]
    参考:#748
  • [已修复] [票务]
    参考:#760
  • [已修复] [票务]
    参考:#762
  • [已修复] [票务]
    参考:#763

0.4.0beta4

发布日期:2007 年 8 月 22 日(星期三)

  • [无标签]
    当您‘from sqlalchemy import *’时,整理了最终进入您命名空间的内容:
  • [无标签]
    ‘table’和‘column’不再被导入。它们仍然可以通过直接引用(如‘sql.table’和‘sql.column’)或从  sql 包进行全局导入来使用。在刚开始使用 SQLAlchemy 时,很容易意外使用 sql.expressions.table 而不是  schema.Table,同样也是 column。
  • [无标签]
    类似于 ClauseElement、FromClause、NullTypeEngine 等的内部类也不再导入到您的命名空间中
  • [无标签]
    ‘Smallinteger’兼容性名称(小写 i!)不再被导入,但目前仍保留在 schema.py 中。SmallInteger(大写 I!)仍然被导入。
  • [无标签]
    连接池在内部使用“threadlocal”策略,以返回已绑定到线程的相同连接,用于“上下文”连接;这些连接在执行“无连接”操作时使用,如   insert().execute()。这类似于“threadlocal”引擎策略的“部分”版本,但没有其中的线程本地事务部分。我们希望它能减少连接池的开销以及数据库使用。但是,如果证明对稳定性产生负面影响,我们将立即撤销。
  • [无标签]
    修复了绑定参数处理,使“False”值(如空字符串)仍然被处理/编码。
  • [无标签]
    修复了 select()的“生成”行为,使调用 column()、select_from()、correlate()和 with_prefix()不会修改原始 select 对象
    参考:#752
  • [无标签]
    添加了一个“legacy”适配器到  types,这样用户定义的 TypeEngine 和 TypeDecorator 类,定义了 convert_bind_param()和/或  convert_result_value()的将继续正常运行。还支持调用这些方法的 super()版本。
  • [无标签]
    添加了 session.prune(),清除会话中不再在其他地方引用的实例缓存。(用于强引用标识映射的实用程序)。
  • [无标签]
    添加了 Transaction 的 close() 方法。如果是最外层事务,则使用 rollback 结束事务,否则仅结束而不影响外部事务。
  • [无标签]
    事务性和非事务性 Session 与绑定连接更好地集成;close() 将确保连接的事务状态与绑定到 Session 前存在的状态相同。
  • [无标签]
    修改了 SQL 操作函数为模块级别的操作符,允许 SQL 表达式可被 pickle。
    参考:#735
  • [无标签]
    对 mapper 类的 init 进行了小的调整,以允许 Py2.6 object.init() 行为。
  • [无标签]
    修复了 select() 的 ‘prefix’ 参数
  • [无标签]
    Connection.begin() 不再接受 nested=True,这个逻辑现在都在 begin_nested() 中。
  • [无标签]
    修复了新的“动态”关系加载器涉及级联的问题
  • [修复] [问题]
    参考:#735
  • [修复] [问题]
    参考:#752

0.4.0beta3

发布日期:2007 年 8 月 16 日 星期四

  • [无标签]
    SQL 类型优化:
  • [无标签]
    新的性能测试显示,与 0.3 版本相比,组合的大规模插入/选择测试的函数调用减少了 68%。
  • [无标签]
    结果集迭代的一般性能提升约为 10-20%。
  • [无标签]
    在  types.AbstractType 中,convert_bind_param() 和 convert_result_value()  已迁移到返回可调用的 bind_processor() 和 result_processor()  方法。如果没有返回可调用函数,则不会调用预处理/后处理函数。
  • [无标签]
    在 base/sql/defaults 中添加了钩子以优化调用 bind 参数/结果处理器的性能,以减少方法调用开销。
  • [无标签]
    添加了对 executemany() 场景的支持,以避免不必要的��最后一行 id”逻辑,参数不会被过度遍历。
  • [无标签]
    向 mapper() 添加了 ‘inherit_foreign_keys’ 参数。
  • [无标签]
    在 sqlite 中添加了对字符串日期透传的支持。
  • [修复] [问题]
    参考:#738
  • [修复] [问题]
    参考:#739
  • [修复] [问题]
    参考:#743
  • [修复] [问题]
    参考:#744

0.4.0beta2

发布日期:2007 年 8 月 14 日 星期二

oracle

  • [oracle] [改进]
    在 mysql 中的 LOAD DATA INFILE 后自动提交。
  • [oracle] [改进]
    添加了 rudimental SessionExtension 类,允许在 flush()、commit() 和 rollback() 边界处进行用户定义功能。
  • [oracle] [改进]
    添加了 engine_from_config() 函数,以帮助从 .ini 风格的配置文件创建 create_engine()。
  • [oracle] [改进]
    base_mapper() 变为普通属性。
  • [oracle] [改进]
    session.execute() 和 scalar() 现在可以通过给定的 ClauseElement 搜索要绑定的表。
  • [oracle] [improvements.]
    Session 自动从具有绑定的映射器中推断表,还使用 base_mapper,以便继承层次结构自动绑定。
  • [oracle] [improvements.]
    将 ClauseVisitor 遍历移回到内联的非递归方式。

杂项

  • [fixed] [tickets]
    参考:#730
  • [fixed] [tickets]
    参考:#732
  • [fixed] [tickets]
    参考:#733
  • [fixed] [tickets]
    参考:#734

oracle

  • [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() 现在可以通过给定的 ClauseElement 搜索要绑定的表。
  • [oracle] [improvements.]
    Session 自动从具有绑定的映射器中推断表,还使用 base_mapper,以便继承层次结构自动绑定。
  • [oracle] [improvements.]
    将 ClauseVisitor 遍历移回到内联的非递归方式。

杂项

  • [fixed] [tickets]
    参考:#730
  • [fixed] [tickets]
    参考:#732
  • [fixed] [tickets]
    参考:#733
  • [fixed] [tickets]
    参考:#734

0.4.0beta1

发布日期:2007 年 8 月 12 日 星期日

orm

  • [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 移动到接口,并且.delete 现在是.remove 事件方法签名也已经交换。
  • [orm]
    Query 的重大改革:
  • [orm]
    所有 selectXXX 方法已被弃用。生成方法现在是标准操作方式,即 filter(),filter_by(),all(),one()等。弃用的方法在其新替代品中有文档字符串。
  • [orm]
    类级属性现在可以用作查询元素…不再需要‘.c.’!“Class.c.propname”现在被“Class.propname”取代。支持所有子句操作符,以及高级操作符,如标量属性的  Class.prop==,基于集合的属性的 Class.prop.contains()和  Class.prop.any()(所有这些也是可否定的)。当然,基于表的列表达式以及通过‘c’挂载在映射类上的列仍然完全可用,并且可以自由与新属性混合使用。
    参考:#643
  • [orm]
    移除了古老的 query.select_by_attributename()功能。
  • [orm]急加载使用的别名逻辑已经泛化,因此它还为 Query 添加了完全自动的别名支持。不再需要为多次加入相同表创建显式别名;即使是自引用关系
  • join()和 outerjoin()接受参数“aliased=True”。这将导致它们的加入建立在别名表上;对  filter()和 filter_by()的后续调用将把所有表达式(是的,使用原始映射表的真实表达式)翻译为别名的表,直到  join()被重置或另一个 join()被调用。
  • join()和 outerjoin()接受参数“id=”。当与“aliased=True”一起使用时,可以通过 add_entity(cls, id=)引用 id,以便选择加入的实例,即使它们来自别名。
  • 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]
    新函数“configures���一个会话,称为“sessionmaker()”。一次向该函数发送各种关键字参数,返回一个根据该原型创建会话的新类。
  • [orm]
    从“public”API 中移除了 SessionTransaction。现在可以在 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()。与 transactional 一起使用,您可以只需  save()/update()然后查询,新对象就会出现。在最后使用 commit()(或者如果不是事务性的话使用  flush())来刷新剩余的更改。
  • [orm]
    新的  scoped_session()函数取代了 SessionContext 和  assignmapper。构建在“sessionmaker()”概念之上,以生成一个类,其 Session()构造返回线程本地会话。或者,将所有  Session 方法作为类方法调用,例如 Session.save(foo);  Session.commit()。就像旧的“objectstore”时代一样。
  • [orm]
    Session 新增了“binds”参数,以支持使用 sessionmaker()函数配置多个绑定。
  • [orm]
    添加了一个基本的 SessionExtension 类,允许在 flush()、commit()和 rollback()边界处进行用户定义的功能。
  • [orm]
    基于查询的 relation()现在可以使用 dynamic_loader()。这是一个writable集合(支持 append()和 remove()),在读取时也是一个活动的 Query 对象。适用于处理非常大的集合,只需部分加载。
  • [orm]
    flush()-内嵌的  INSERT/UPDATE 表达式。将任何 SQL 表达式,如“sometable.c.column + 1”,分配给实例的属性。在  flush()时,映射器检测到表达式并直接嵌入到 INSERT 或 UPDATE 语句中;属性在实例上被延迟,所以在下次访问时加载新值。
  • [orm]
    引入了一个基本的分片(水平扩展)系统。该系统使用修改后的 Session,可以根据用户定义的“分片策略”在多个数据库之间分发读写操作。实例及其依赖项可以根据属性值、轮询方法或任何其他用户定义的系统在多个数据库之间分发和查询。
    参考:#618
  • [orm]
    急加载已经增强,允许在更多地方进行更多的连接。现在它可以在自引用和循环结构的任意深度处运行。在加载循环结构时,在   relation()上指定“join_depth”表示您希望表自连接多少次;每个级别都会得到一个不同的表别名。别名名称现在是在编译时使用简单的计数方案生成的,更容易阅读,当然完全确定性。
    参考:#659
  • [orm]
    添加了复合列属性。这允许您在使用  ORM  时创建由多个列表示的类型。新类型的对象在查询表达式、比较、query.get()子句等方面都是完全功能的,并且表现得就像是常规的单列标量…  除了它们不是!在映射器的“properties”字典中使用函数 composite(cls, columns),并且 cls 的实例将被创建/映射到一个由columns 对应的值组成的单个属性。
    参考:#211
  • [orm]
    改进了对具有相关子查询的自定义 column_property()属性的支持,现在在使用急加载时效果更好。
  • [orm]
    主键“折叠”行为;映射器将分析其给定可选择的所有列,以获取主键“等效性”,即通过外键关系或显式 inherit_condition 等价的列。主要用于连接表继承方案,其中继承表中的不同命名的 PK 列应“折叠”为单值(或更少值)主键。修复了诸如此类的问题。
    参考:#611
  • [orm]
    连接表继承现在将生成所有继承类的主键列针对连接的根表。这意味着根表中的每一行对应一个实例。如果出于某种罕见原因这不是理想的情况,单独映射器上的显式 primary_key 设置将覆盖它。
  • [orm]
    当使用“polymorphic”标志与连接表或单表继承时,所有标识键都针对继承层次结构的根类生成;这允许 query.get()以与非多态 get 相同的缓存语义多态地工作。请注意,这目前不适用于具体继承。
  • [orm]
    次要继承加载:可以构建没有 select_table 参数的多态映射器。继承映射器的表在初始加载中未表示将立即发出第二个 SQL 查询,每个实例一次(即对于大型列表来说效率不高),以加载其余列。
  • [orm]
    次要继承加载也可以将其第二个查询移动到列级“延迟”加载,通过“polymorphic_fetch”参数,可以设置为“select”或“deferred”。
  • [orm]
    现在可以仅将可用选择列的子集映射到映射器属性中,使用 include_columns/exclude_columns。
    参考:#696
  • [orm]
    添加了 undefer_group() MapperOption,设置一组由“group”连接的“延迟”列以作为“未延迟”加载。
  • [orm]
    重写了“确定性别名”逻辑,使其成为 SQL 层的一部分,生成更简单的别名和标签名称,更符合 Hibernate 的风格。

sql

  • [sql]
    速度!子句编译以及 SQL 构造的机制已经被简化和优化到相当程度,使语句构造/编译的开销提高了 20-30%。
  • [sql]
    所有“type”关键字参数,如 bindparam()、column()、Column()和 func.()中的参数,重命名为“type_”。这些对象仍然将它们的“type”属性命名为“type”。
  • [sql]
    从模式项中移除了 case_sensitive=(True|False)设置,因为检查此状态会增加很多方法调用开销,而且从来没有合理的理由将其设置为 False。所有小写的表和列名称将被视为不区分大小写(是的,我们也适应了 Oracle 的大写风格)。

扩展

  • [扩展]
    proxyengine 暂时移除,等待一个真正有效的替代品。
  • [扩展]
    SelectResults  已被 Query 取代。SelectResults / SelectResultsExt 仍然存在,但只返回一个稍微修改的 Query  对象以保持向后兼容性。SelectResults 的 join_to()方法不再存在,需要使用 join()。

mysql

  • [mysql]
    通过反射加载的表和列名称现在是 Unicode。
  • [mysql]
    现在支持所有标准列类型,包括 SET。
  • [mysql]
    表反射现在可以在一次往返中完成。
  • [mysql]
    现在支持 ANSI 和 ANSI_QUOTES SQL 模式。
  • [mysql]
    索引现在也被反射。

oracle

  • [oracle]
    添加了对 OUT 参数的非常基本的支持;使用 sql.outparam(name, type)设置一个 OUT 参数,就像 bindparam()一样;执行后,值可以通过 result.out_parameters 字典获得。
    参考:#507

杂项

  • [事务]
    为事务添加了上下文管理器(with 语句)支持。
  • [transactions]
    添加了对两阶段提交的支持,目前与 mysql 和 postgres 一起使用。
  • [事务]
    添加了一个使用保存点的子事务实现。
  • [事务]
    添加了对保存点的支持。
  • [元数据]
    可以在不事先声明的情况下从数据库中批量反射表。MetaData(engine, reflect=True)将加载数据库中存在的所有表,或者使用 metadata.reflect()进行更精细的控制。
  • [元数据]
    DynamicMetaData 已重命名为 ThreadLocalMetaData
  • [元数据]
    ThreadLocalMetaData 构造函数现在不接受参数。
  • [元数据]
    BoundMetaData 已被移除- 普通 MetaData 等效。
  • [元数据]
    Numeric  和 Float 类型现在具有一个“asdecimal”标志;对于 Numeric,默认为 True,对于 Float,默认为 False。当为  True 时,值以 decimal.Decimal 对象返回;当为 False 时,值以 float() 返回。True/False  的默认值已经是 PG 和 MySQL 的 DBAPI 模块的行为。
    参考:#646
  • [元数据]
    新的 SQL 操作符实现将所有硬编码的操作符从表达式结构中移除,并将它们移入编译中;这样可以更灵活地编译操作符;例如,在字符串上下文中使用“+”编译为“||”,在 MySQL 上则编译为“concat(a,b)”;而在数值上下文中则编译为“+”。修复。
    参考:#475
  • [元数据]
    ”匿名“别名和标签名称现在在 SQL 编译时以完全确定性的方式生成… 不再是随机的十六进制 ID
  • [元数据]
    对 SQL 元素(ClauseElement)进行了重大的架构改造。所有元素共享一个通用的“可变性”框架,允许对元素进行一致的就地修改以及生成式行为。提高了 ORM 的稳定性,该 ORM 对 SQL 表达式进行了大量的变异。
  • [元数据]
    select() 和 union() 现在具有“生成式”行为。像 order_by() 和 group_by() 这样的方法返回一个 新的 实例 - 原始实例保持不变。非生成式方法也保持不变。
  • [元数据]
    select/union 的内部大幅简化- 关于“是否子查询”和“相关性”的所有决策都推迟到 SQL 生成阶段。select() 元素现在 永远 不会被其封闭容器或任何方言的编译过程改变。
    参考:#52#569
  • [元数据]
    select(scalar=True) 参数已被弃用;使用 select(…).as_scalar()。结果对象遵循完整的“列”接口,并在表达式中更好地发挥作用。
  • [元数据]
    添加了 select().with_prefix(‘foo’),允许在 SELECT 的列子句之前放置任何一组关键字
    参考:#504
  • [元数据]
    向 row[] 添加了数组切片支持
    参考:#686
  • [元数据]
    结果集现在更好地尝试将游标描述中存在的 DBAPI 类型与方言定义的 TypeEngine 对象进行匹配,然后用于结果处理。请注意,这仅对文本 SQL 有效;构造的 SQL 语句始终具有显式类型映射。
  • [元数据]
    CRUD 操作的结果集立即关闭其底层游标,并且如果为操作定义了,还将自动关闭连接;这允许更有效地使用连接来进行连续的 CRUD 操作,减少“悬挂连接”的机会。
  • [元数据]
    列默认值和  onupdate Python 函数(即传递给 ColumnDefault 的函数)可能需要零个或一个参数;一个参数是  ExecutionContext,您可以从中调用 “context.parameters[someparam]”  来访问附加到语句的其他绑定参数值。用于执行的连接也可用,以便您可以预先执行语句。
    参考:#559
  • [元数据]
    为序列添加了“显式”创建/删除/执行支持(即您可以将“connectable”传递给 Sequence 上的每个方法)。
  • [元数据]
    在操作模式时更好地引用标识符。
  • [元数据]
    标准化了表反射的行为,其中类型无法定位时将替换为 NullType,并引发警告。
  • [元数据]
    ColumnCollection(即表上的 ‘c’ 属性)遵循“contains”的字典语义
    参考:#606
  • [引擎]
    速度!结果处理和绑定参数处理的机制已进行了全面改进、简化和优化,以尽可能少地发出方法调用。批量插入和大量行集迭代的性能测试都显示 0.4 比 0.3 快两倍以上,并且函数调用减少了 68%。
  • [引擎]
    现在您可以钩入池的生命周期,并在每个新的 DBAPI 连接、池检出和池检入时运行 SQL 语句或其他逻辑。
  • [引擎]
    连接获得了 .properties 集合,其中的内容在基础 DBAPI 连接的生命周期范围内。
  • [引擎]
    从 Pool 中删除了 auto_close_cursorsdisallow_open_cursors 参数;由于游标通常由 ResultProxy 和 Connection 关闭,因此减少了开销。
  • [postgres]
    添加了 PGArray 数据类型以使用 PostgreSQL 数组数据类型。

ORM

  • [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 的赋值现在会为现有值触发删除事件(如果有)。
  • [orm]
    作为集合类使用的类似字典的对象不再需要更改 iter 语义- 默认情况下使用 itervalues()。这是一个不兼容的变化。
  • [orm]
    在大多数情况下,不再需要为映射的集合子类化 dict。orm.collections 提供了按指定列或自定义函数键入对象的预制实现。
  • [orm]
    现在集合赋值需要兼容的类型-将 None 分配给清除集合或将列表分配给字典集合现在将引发参数错误。
  • [orm]
    AttributeExtension 移动到接口,并且.delete 现在是.remove 事件方法签名也已经交换。
  • [orm]
    Query 进行了重大改进:
  • [orm]
    所有 selectXXX 方法都已弃用。生成方法现在是执行操作的标准方式,即 filter(),filter_by(),all(),one()等。弃用的方法在其新替代品的文档字符串中有说明。
  • [orm]
    现在可以将类级属性用作查询元素…不再需要‘.c.’!“Class.c.propname”现在被“Class.propname”取代。支持所有子句操作符,以及更高级别的操作符,如标量属性的  Class.prop==,基于集合的属性的 Class.prop.contains()和  Class.prop.any()(所有这些也是可否定的)。当然,基于表的列表达式以及通过‘c’挂载在映射类上的列仍然完全可用,并且可以自由地与新属性混合使用。
    参考:#643
  • [orm]
    移除了古老的 query.select_by_attributename()功能。
  • [orm]急加载使用的别名逻辑已经泛化,因此它还为 Query 添加了完全自动的别名支持。不再需要为多次加入相同表创建显式别名;即使是自引用关系也是如此
  • join()和 outerjoin()接受参数“aliased=True”。这将导致它们的连接建立在别名表上;随后对  filter()和 filter_by()的调用将把所有表达式(是的,使用原始映射表的实际表达式)翻译为别名的表达式,直到该  join()结束(即直到 reset_joinpoint()或另一个 join()被调用)。
  • join()和 outerjoin()接受参数“id=”。当与“aliased=True”一起使用时,可以通过 add_entity(cls, id=)引用 id,以便即使它们来自别名,也可以选择加入的实例。
  • join()和  outerjoin()现在可以与自引用关系一起使用!使用“aliased=True”,您可以加入任意深度的级别,即  query.join([‘children’, ‘children’], aliased=True);过滤条件将针对最右边的连接表
  • [orm]
    添加了 query.populate_existing(),标记查询以重新加载查询中触及的所有实例的所有属性和集合,包括急切加载的实体。
    参考:#660
  • [orm]
    添加了 eagerload_all(),允许 eagerload_all(‘x.y.z’) 来指定在给定路径中所有属性的急切加载。
  • [orm]
    会话的重大改革:
  • [orm]
    新函数“配置”一个会话称为“sessionmaker()”。向该函数发送各种关键字参数一次,返回一个新类,该类对该原型创建一个会话。
  • [orm]
    会话事务从“public” API 中移除。现在你可以在会话本身上调用 begin()/commit()/rollback()。
  • [orm]
    会话还支持 SAVEPOINT 事务;调用 begin_nested()。
  • [orm]
    当纵向或横向分区(即使用多个引擎)时,会话支持两阶段提交行为。使用 twophase=True。
  • [orm]
    会话标志“transactional=True”生成一个会话,当首次使用时总是将自身置于事务中。在 commit()、rollback() 或 close() 时,事务结束;但在下次使用时重新开始。
  • [orm]
    会话支持“autoflush=True”。这会在每次查询之前发出  flush()。与 transactional 结合使用,你可以仅保存()/更新() 然后查询,新对象就会出现。在最后使用  commit()(或者如果不是在事务中使用 flush())来刷新剩余的更改。
  • [orm]
    新的  scoped_session() 函数替换了 SessionContext 和  assignmapper。构建到“sessionmaker()”概念上,以产生一个类,其 Session() 构造返回线程本地会话。或者,将所有  Session 方法作为类方法调用,例如 Session.save(foo);  Session.commit()。就像旧的“objectstore”时代一样。
  • [orm]
    添加了会话的新“binds”参数,以支持通过 sessionmaker() 函数配置多个绑定。
  • [orm]
    添加了一个基本的 SessionExtension 类,允许在 flush()、commit() 和 rollback() 边界处发生用户定义的功能。
  • [orm]
    使用 dynamic_loader() 可用于基于查询的 relation()。这是一个 可写 集合(支持 append() 和 remove()),当访问时也是一个活动的查询对象。对于处理只需要部分加载的非常大的集合非常理想。
  • [orm]
    flush()  -内嵌的内联 INSERT/UPDATE 表达式。将任何 SQL 表达式,如“sometable.c.column +  1”,分配给实例的属性。在 flush() 时,映射器检测到表达式并将其直接嵌入到 INSERT 或 UPDATE  语句中;属性在实例上被延迟,因此在下次访问时加载新值。
  • [orm]
    引入了一个基本的分片(水平扩展)系统。该系统使用修改后的 Session,可以根据用户定义的“分片策略”将读写操作分布在多个数据库之间。实例及其依赖项可以根据属性值、轮询方法或任何其他用户定义的系统在多个数据库之间分布和查询。
    参考:#618
  • [orm]
    急切加载已经增强,允许在更多地方进行更多的连接。它现在可以在自引用和循环结构的任意深度上运行。在加载循环结构时,在   relation()上指定“join_depth”,指示您希望表自连接多少次;每个级别都会获得一个不同的表别名。别名名称现在是在编译时使用简单的计数方案生成的,更容易阅读,当然完全确定性。
    参考:#659
  • [orm]
    添加了复合列属性。这允许您在使用  ORM  时创建由多个列表示的类型。新类型的对象在查询表达式、比较、query.get()子句等方面都是完全功能的,并且表现得就像是常规的单列标量…  除了它们不是!在映射器的“属性”字典中使用函数 composite(cls, columns),并且 cls 的实例将被创建/映射到一个属性,由与columns 对应的值组成。
    参考:#211
  • [orm]
    改进了对具有相关子查询的自定义 column_property()属性的支持,现在与急切加载更好地配合。
  • [orm]
    主键“合并”行为;映射器将分析其给定可选择的所有列以获取主键“等效性”,即通过外键关系或显式继承条件等方式等效的列。主要用于连接表继承场景,其中继承表中的不同命名主键列应“合并”为单值(或更少值)主键。修复了一些问题。
    参考:#611
  • [orm]
    加入表继承现在只会针对连接的根表生成所有继承类的主键列。这意味着根表中的每一行都对应一个单独的实例。如果出于某种罕见原因这不是理想的情况,那么在各个映射器上设置显式的主键设置将覆盖它。
  • [orm]
    当“多态”标志与连接表或单表继承一起使用时,所有标识键都针对继承层次结构的根类生成;这允许 query.get()以与非多态 get 相同的缓存语义多态工作。请注意,目前这不适用于具体继承。
  • [orm]
    次要继承加载:可以构建多态映射器,无需选择表参数。继承映射器,其表在初始加载中未被表示,将立即发出第二个 SQL 查询,每个实例一次(即对于大型列表来说效率不高),以加载剩余列。
  • [orm]
    次要继承加载也可以将其第二个查询移动到列级“延迟”加载中,通过“polymorphic_fetch”参数,可以设置为‘select’或‘deferred’。
  • [orm]
    现在可以仅将可用的可选择列的子集映射到映射器属性,使用 include_columns/exclude_columns。
    参考:#696
  • [orm]
    添加了 undefer_group() MapperOption,设置一组由“group”连接的“延迟”列以作为“未延迟”加载。
  • [orm]
    重写了“确定性别名”逻辑,使其成为 SQL 层的一部分,生成更简单的别名和标签名称,更符合 Hibernate 的风格。

sql

  • [sql]
    速度!子句编译以及 SQL 构造的机制已经被简化和简化到相当程度,使语句构造/编译的开销减少了 20-30%,为 0.3。
  • [sql]
    所有��type”关键字参数,如 bindparam()、column()、Column()和 func.(),重命名为“type_”。这些对象仍然将它们的“type”属性命名为“type”。
  • [sql]
    从模式项中删除了 case_sensitive=(True|False)设置,因为检查此状态会增加很多方法调用开销,而且从来没有合理的理由将其设置为 False。所有小写的表和列名将被视为不区分大小写(是的,我们也适应了 Oracle 的大写风格)。

extensions

  • [extensions]
    proxyengine 暂时移除,等待一个真正有效的替代品。
  • [extensions]
    SelectResults  已被 Query 取代。 SelectResults / SelectResultsExt 仍然存在,但只是返回一个稍微修改的 Query  对象以保持向后兼容性。 SelectResults 的 join_to()方法不再存在,需要使用 join()。

mysql

  • [mysql]
    通过反射加载的表和列名现在是 Unicode。
  • [mysql]
    现在支持所有标准列类型,包括 SET。
  • [mysql]
    现在可以在一次往返中执行表反射。
  • [mysql]
    现在支持 ANSI 和 ANSI_QUOTES SQL 模式。
  • [mysql]
    索引现在已经反映出来。

oracle

  • [oracle]
    添加了对 OUT 参数的非常基本支持;使用 sql.outparam(name, type)设置 OUT 参数,就像 bindparam()一样;执行后,值可以通过 result.out_parameters 字典获得。
    参考:#507

杂项

  • [transactions]
    为事务添加了上下文管理器(with 语句)支持。
  • [transactions]
    支持了两阶段提交,目前与 mysql 和 postgres 兼容。
  • [transactions]
    添加了使用保存点的子事务实现。
  • [事务]
    添加了对保存点的支持。
  • [元数据]
    可以从数据库中反射表,而无需事先声明它们。MetaData(engine, reflect=True)将加载数据库中存在的所有表,或使用 metadata.reflect()进行更精细的控制。
  • [元数据]
    DynamicMetaData 已更名为 ThreadLocalMetaData。
  • [元数据]
    ThreadLocalMetaData 构造函数现在不接受任何参数。
  • [元数据]
    BoundMetaData 已被移除- 普通的 MetaData 是等效的。
  • [元数据]
    数值和浮点类型现在有一个“asdecimal”标志;Numeric  默认为 True,Float 默认为 False。当为 True 时,值以 decimal.Decimal 对象返回;当为 False  时,值以 float()返回。对于 PG 和 MySQL 的 DBAPI 模块,True/False 的默认值已经是行为。
    参考:#646
  • [元数据]
    新的 SQL 运算符实现将所有硬编码的运算符从表达式结构中移除,并将它们移到编译中;允许更大的运算符编译灵活性;例如,在字符串上下文中使用“+”时,编译为“||”,或在 MySQL 上使用“concat(a,b)”;而在数值上下文中编译为“+”。修复。
    参考:#475
  • [元数据]
    “匿名”别名和标签名称现在在 SQL 编译时以完全确定性的方式生成…不再是随机的十六进制 ID。
  • [元数据]
    对 SQL 元素(ClauseElement)进行了重大的架构改造。所有元素共享一个通用的“可变性”框架,允许对元素进行一致的原地修改以及生成行为。改进了 ORM 的稳定性,ORM 大量使用对 SQL 表达式的修改。
  • [元数据]
    select()和 union()现在具有“生成”行为。像 order_by()和 group_by()这样的方法返回一个实例-原始实例保持不变。非生成方法也保留。
  • [元数据]
    select/union 的内部大幅简化- 所有关于“是否为子查询”和“相关性”的决策都推迟到 SQL 生成阶段。select()元素现在永远不会被其封闭容器或任何方言的编译过程改变。
    参考:#52, #569
  • [元数据]
    select(scalar=True)参数已弃用;使用 select(…).as_scalar()。生成的对象遵循完整的“列”接口,并在表达式中更好地发挥作用。
  • [元数据]
    添加了 select().with_prefix(‘foo’)方法,允许在 SELECT 语句的列子句之前放置任何关键字。
    参考:#504
  • [元数据]
    添加了对行[]的数组切片支持。
    参考:#686
  • [元数据]
    结果集更好地尝试将 cursor.description 中存在的 DBAPI 类型与方言定义的 TypeEngine 对象进行匹配,然后用于结果处理。请注意,这仅对文本 SQL 生效;构造的 SQL 语句始终具有显式的类型映射。
  • [元数据]
    CRUD 操作的结果集立即关闭其底层游标,并且如果为操作定义了自动关闭连接,则也会自动关闭连接;这样可以更有效地使用连接来进行连续的 CRUD 操作,减少“悬空连接”的可能性。
  • [元数据]
    列默认值和  onupdate Python 函数(即传递给 ColumnDefault 的函数)可以接受零个或一个参数;一个参数是  ExecutionContext,您可以从中调用“context.parameters[someparam]”来访问附加到语句的其他绑定参数值。执行使用的连接也可用,以便您可以预执行语句。
    参考:#559
  • [元数据]
    为序列添加了“显式”创建/删除/执行支持(即您可以将“connectable”传递给 Sequence 上的这些方法)。
  • [元数据]
    在操作模式模式时更好地引用标识符。
  • [元数据]
    标准化了无法定位类型的表反射的行为;NullType 将替换为警告被引发。
  • [元数据]
    ColumnCollection(即表上的‘c’属性)遵循字典语义中的“contains
    参考:#606
  • [引擎]
    速度!结果处理和绑定参数处理的机制已经进行了彻底的改进、简化和优化,以尽可能少地发出方法调用。批量 INSERT 和批量行集迭代的基准测试都表明 0.4 版本比 0.3 版本快两倍以上,使用的函数调用次数减少了 68%。
  • [引擎]
    现在可以钩入池生命周期,并在每次新的 DBAPI 连接、池签出和签入时运行 SQL 语句或其他逻辑。
  • [引擎]
    连接获取一个.properties 集合,其内容范围限定在底层 DBAPI 连接的生命周期内。
  • [引擎]
    从池中移除了 auto_close_cursors 和 disallow_open_cursors 参数;由于游标通常由 ResultProxy 和 Connection 关闭,因此减少了开销。
  • [Postgres]
    添加了 PGArray 数据类型,用于使用 Postgres 数组数据类型。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十九)(2)
SqlAlchemy 2.0 中文文档(六十九)
28 0
|
4月前
|
SQL 关系型数据库 数据库
SqlAlchemy 2.0 中文文档(六十八)(3)
SqlAlchemy 2.0 中文文档(六十八)
26 0
|
4月前
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(五十四)(3)
SqlAlchemy 2.0 中文文档(五十四)
29 1
|
4月前
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(五十四)(2)
SqlAlchemy 2.0 中文文档(五十四)
99 1
|
4月前
|
SQL 关系型数据库 测试技术
SqlAlchemy 2.0 中文文档(五十四)(4)
SqlAlchemy 2.0 中文文档(五十四)
37 1
|
4月前
|
SQL 关系型数据库 API
SqlAlchemy 2.0 中文文档(五十四)(5)
SqlAlchemy 2.0 中文文档(五十四)
45 1
|
4月前
|
SQL 存储 数据库
SqlAlchemy 2.0 中文文档(五十四)(1)
SqlAlchemy 2.0 中文文档(五十四)
24 0
|
4月前
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(7)
SqlAlchemy 2.0 中文文档(五十八)
56 0
|
4月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十九)(3)
SqlAlchemy 2.0 中文文档(六十九)
21 0
|
4月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十九)(1)
SqlAlchemy 2.0 中文文档(六十九)
21 0