SqlAlchemy 2.0 中文文档(六十五)(4)https://developer.aliyun.com/article/1560890
0.8.0b1
发布日期:2012 年 10 月 30 日
通用
- [通用] [已移除]
“sqlalchemy.exceptions”作为“sqlalchemy.exc”的同义词已完全移除。
参考:#2433 - [通用]
SQLAlchemy 0.8 现在支持 Python 2.5 及以上版本。不再支持 Python 2.4。
orm
- [orm] [功能]
relationship()内部的重大重写现在允许包含指向自身的列在复合外键中的连接条件。添加了一个新的 API,用于非常专业的 primaryjoin 条件,允许基于 SQL 函数、CAST 等的条件通过在表达式中必要时内联放置注释函数 remote()和 foreign()来处理。以前使用半私有的 _local_remote_pairs 方法的配方可以升级到这种新方法。
另请参阅
重写的 _orm.relationship()机制
参考:#1401 - [orm] [功能]
新的独立函数 with_polymorphic()提供了 query.with_polymorphic()的功能,以独立形式提供。它可以应用于查询中的任何实体,包括作为“of_type()”修饰符的连接目标。
参考:#2333 - [orm] [功能]
现在属性上的 of_type()构造接受别名为 aliased()的类构造以及 with_polymorphic 构造,并且与 query.join()、any()、has()以及 eager loaders subqueryload()、joinedload()、contains_eager()一起工作。
参考:#1106,#2438 - [orm] [功能]
对映射类的事件监听进行了改进,允许指定未映射类用于实例和映射器事件。当传递 propagate=True 标志时,已建立的事件将自动设置在该类的子类上,并且在最终映射时将为该类本身设置事件。
参考:#2585 - [orm] [feature]
“延迟声明反射”系统已经移入声明式扩展本身,使用新的 DeferredReflection 类。该类现在已经针对单表和联合表继承用例进行了测试。
参考:#2485 - [orm] [feature]
添加了新的核心功能“inspect()”,它作为对映射器、对象等进行内省的通用入口。映射器和 InstanceState 对象已经增强了公共 API,允许检查映射属性,包括针对列绑定或关系绑定属性的过滤器,检查当前对象状态,属性历史记录等。
参考:#2208 - [orm] [feature]
在 session.begin_nested()中调用 rollback()现在只会使那些在该事务范围内具有净变化的对象过期,即在刷新时被修改或被修改的对象。这允许 begin_nested()的典型用例,即修改一小部分对象,保留未在子事务中修改的更大范围对象的数据。
参考:#2452 - [orm] [feature]
添加了实用功能 Session.enable_relationship_loading(),取代了 relationship.load_on_pending。然而,应该避免使用这两个功能。
参考:#2372 - [orm] [feature]
添加了对.column_property()、relationship()、composite()的.info 字典参数的支持。所有 MapperProperty 类都具有可用的自动创建的.info 字典。 - [orm] [feature]
从映射集合中添加/移除 None 现在会生成属性事件。以前,在某些情况下,会忽略 None 的追加。相关。
参考:#2229 - [orm] [feature]
映射集合中存在 None 现在在刷新时会引发错误。以前,集合中的 None 值会被静默忽略。
参考:#2229 - [orm] [feature]
Query.update()方法现在对被更新的表更加宽松。现在更好地支持普通的 Table 对象,并且可以使用附加的继承子类进行 update(); 子类表将成为更新的目标,如果父表在 WHERE 子句中被引用,编译器将调用 UPDATE…FROM 语法,以满足 WHERE 子句。如果在“values”字典中通过对象指定列,还支持 MySQL 的多表更新功能。PG 的 DELETE…USING 在 Core 中还不可用。 - [orm] [feature]
新的 session 事件 after_transaction_create 和 after_transaction_end 允许跟踪新的 SessionTransaction 对象。如果检查了对象,可以用于确定会话何时首次激活和何时停用。 - [orm] [feature]
Query 现在可以加载包含不可哈希类型的实体/标量混合“元组”行,方法是在使用的相应 TypeEngine 对象上设置“hashable=False”标志。返回不可哈希类型(通常是列表)的自定义类型可以将此标志设置为 False。
参考:#2592 - [orm] [feature]
现在 Query 默认情况下会“自动关联”,与 select()相同。以前,在另一个查询中使用的 Query 需要显式调用 correlate()方法,以便将内部的表与外部关联起来。如常,correlate(None)会禁用关联。
参考:#2179 - [orm] [feature]
在 Session.add()、Session.merge()等操作后,现在会触发 after_attach 事件,以确保对象在 Session.new 或 Session.identity_map 中建立后,当调用事件时,对象会在这些集合中表示。添加了 before_attach 事件以适应需要使用预附加对象的用例。
参考:#2464 - [orm] [feature]
当在 flush 的“execute”部分中使用不受支持的方法时,Session 将产生警告。这些熟悉的方法包括 add()、delete()等,以及在 mapper 级别 flush 事件中调用的集合和相关对象操作,如 after_insert()、after_update()等。长期以来,明确记录了当 Session 在执行 flush 计划时被操纵时,SQLAlchemy 无法保证结果,但用户仍在这样做,所以现在有了警告。也许将来 Session 会增强以支持在 flush 内部执行这些操作,但目前无法保证结果。 - [orm] [feature]
ORM 实体可以传递给核心 select()构造,以及传递给 select()的 select_from()、correlate()和 correlate_except()方法,它们将被解包为可选择的。
参考:#2245 - [orm] [feature]
为基于映射属性的关系连接条件提供自动渲染支持,使用核心 SQL 构造。例如,select([SomeClass]).where(SomeClass.somerelationship) 将渲染出从“someclass”选择,并使用“somerelationship”的主连接作为 WHERE 子句。这改变了在核心 SQL 上下文中使用“SomeClass.somerelationship”的先前含义;以前,它会“解析”为父可选择项,这通常不太有用。也适用于 query.filter()。相关内容。
参考:#2245 - [orm] [功能]
在 declarative_base() 中的类注册现在是 WeakValueDictionary。因此,“Base”的子类如果没有被任何其他映射器/超类映射器引用,将被垃圾回收。请查看此票证的下一个注释。
参考:#2526 - [orm] [功能]
可以使用文档中描述的新的 @declared_attr 用法解决单继承声明子类之间的列冲突,无论是否使用混合类。
参考:#2472 - [orm] [功能]
declared_attr 现在可以用于非混合类,尽管这通常只对单继承子类列冲突解决有用。
参考:#2472 - [orm] [功能]
declared_attr 现在可以用于不是 Column 或 MapperProperty 的属性;包括任何用户定义的值以及关联代理对象。
参考:#2517 - [orm] [功能]
非常有限的支持,当类本身被解除引用时,继承映射器可以被垃圾回收。映射器不能有自己的表(即仅支持单表继承),没有放置多态属性。这允许用例创建一个临时的声明映射类的子类,在被单元测试解除引用时可以被垃圾回收。
参考:#2526 - [orm] [功能]
Declarative 现在通过字符串名称和完整模块限定名称维护类的注册表。现在可以基于关系() 中的模块限定字符串查找具有相同名称的多个类。当多个类共享相同名称时,简单类名查找现在会引发信息性错误消息。
参考:#2338 - [orm] [功能]
现在可以提供类绑定属性,覆盖任何非 ORM 类型的列,而不仅仅是描述符。
参考:#2535 - [orm] [功能]
在 Query.subquery() 中添加了 with_labels 和 reduce_columns 关键字参数,提供两种生成具有唯一命名列的查询的替代策略。
参考:#1729 - [orm] [feature]
当对一个仪器化集合的引用由于过期/属性刷新/集合替换而不再与父类关联,但现在分离的集合接收到附加或移除操作时,会发出警告。
参考:#2476 - [orm] [bug]
在刷新时,如果两个表之间存在外键依赖关系,并且这些表通过连接继承相关联,并且外键依赖关系不是 inherit_condition 的一部分,则 ORM 将进行额外的努力来确定这种依赖关系不重要,从而为用户节省了 use_alter 指令。
参考:#2527 - [orm] [bug]
现在,仅对 listen() 分配的类的后代类触发 instrumentation 事件 class_instrument()、class_uninstrument() 和 attribute_instrument()。以前,无论传递了什么“目标”参数,事件侦听器都会被分配为在所有情况下监听所有类。
参考:#2590 - [orm] [bug]
在将多级子类以任意顺序或中间类缺失的情况下发送给 with_polymorphic() 时,会按正确顺序生成 JOIN,并在正确的继承表中生成 JOIN。
参考:#1900 - [orm] [bug]
对共享共同基类的子类实体链进行了改进,处理连接/子查询的急切加载,没有提供特定的“连接深度”。在检测到“循环”之前,将单独链出每个子类映射器,而不是将基类视为“循环”的源。
参考:#2481 - [orm] [bug]
“被动”标志在 Session.is_modified() 上不再起作用。在所有情况下,is_modified() 只查看本地内存中修改的标志,不会发出任何 SQL 或调用加载器可调用/初始化程序。
参考:#2320 - [orm] [bug]
当使用 delete-orphan 级联时,如果 one-to-many 或 many-to-many 没有设置 single-parent=True,则发出的警告现在是一个错误。在任何情况下,ORM 在此警告后将无法正常运行。
参考:#2405 - [orm] [bug]
在 flush 事件中发出的延迟加载,如 before_flush()、before_update()等,现在将像在非事件代码中一样运行,关于在延迟发出的查询中使用的 PK/FK 值的考虑。以前,会建立特殊标志,导致延迟加载基于在刷新时调用时父 PK/FK 值的“先前”值加载相关项目;现在,以这种方式加载的信号现在局限于工作单元实际需要以这种方式加载的地方。请注意,UOW 有时会在调用 before_update()事件之前加载这些集合,因此“passive_updates”的使用与否可能会影响在刷新事件中访问时集合是否表示“旧”或“新”数据,根据延迟加载何时发出。这种变化在极小的机会上是不兼容的,用户事件代码依赖于旧行为。
参考:#2350 - [orm] [bug]
继续关于由于事件监听器导致刷新后的额外状态;任何从属性角度标记为“脏”的状态,通常通过 after_insert()、after_update()等中的列属性设置事件,将在所有情况下重置“历史”标志,而不仅仅是那些参与刷新的实例。这样做的效果是,这种“脏”状态在刷新后不会传递,并且不会导致 UPDATE 语句。会发出一个警告;可以使用 set_committed_state()方法在对象上分配属性而不产生历史事件。
参考:#2566, #2582 - [orm] [bug]
修复了在@declared_attr Column 和直接定义的 Column 之间逐渐演变的断开。在这两种情况下,Column 将被应用于声明类的表,但不会应用于联合继承子类的表。以前,直接定义的 Column 会被放置在基表和子表上,这通常不是所期望的。
参考:#2565 - [orm] [bug]
现在,声明式可以将在单表继承子类上声明的列传播到父类的表,当父类本身被映射到一个 join()或 select()语句时,直接或通过联合继承,而不仅仅是一个 Table。
参考:#2549 - [orm] [bug]
当 uselist=False 与“dynamic”加载器结合时会发出错误。这在 0.7.9 中是一个警告。 - [orm] [removed]
ORM 的传统“可变”系统,包括 MutableType 类以及 PickleType 和 postgresql.ARRAY 上的 mutable=True 标志已被移除。ORM 使用在 0.7 版本中引入的 sqlalchemy.ext.mutable 扩展来检测原地变异。移除 MutableType 和相关结构从 SQLAlchemy 的内部移除了大量复杂性。这种方法的性能表现不佳,因为在使用时会导致对 Session 的全部内容进行扫描。
参考:#2442 - [orm] [removed]已移除的弃用标识符:
- allow_null_pks mapper() 参数���使用 allow_partial_pks)
- _get_col_to_prop() 映射器方法(使用 get_property_by_column())
- Session.merge() 的 dont_load 参数(使用 load=True)
- sqlalchemy.orm.shard 模块(使用 sqlalchemy.ext.horizontal_shard)
- [orm] [moved]
InstrumentationManager 接口和整个相关的替代类实现系统现在已经移动到 sqlalchemy.ext.instrumentation。这是一个很少使用的系统,会给类的仪器化机制增加显著的复杂性和开销。新的架构允许它保持未使用状态,直到实际导入 InstrumentationManager 时,它才会被引导到核心部分。
examples
- [examples]
Beaker 缓存示例已转换为使用 dogpile.cache。这是一个由 Beaker 缓存内部的相同创建者编写的新缓存库,代表了一个大幅改进、简化和现代化的缓存系统。
另请参阅
Dogpile Caching
参考:#2589
engine
- [engine] [feature]
现在连接事件监听器可以与单独的 Connection 对象关联,而不仅仅是 Engine 对象。
参考:#2511 - [engine] [feature]
before_cursor_execute 事件会触发所谓的“_cursor_execute”事件,这些事件通常是主键绑定序列和在 INSERT 时未使用 RETURNING 时调用的默认生成 SQL 短语的特殊执行。
参考:#2459 - [engine] [feature]
测试套件使用的库已经稍微移动了一下,以便它们再次成为 SQLAlchemy 安装的一部分。此外,新的测试套件现在位于新的 sqlalchemy.testing.suite 包中。这是一个正在开发中的系统,希望为外部方言提供一个通用的测试套件。在 SQLAlchemy 之外维护的方言可以使用新的测试装置作为其自己测试的框架,并将免费获得一个“兼容性”方言专注的测试套件,包括一个改进的“要求”系统,其中可以为测试启用或禁用特定功能和特性。 - [engine] [feature]
添加了一个新的系统,可以在不使用入口点的情况下在进程中注册新的方言。请参阅“注册新方言”的文档。
参考:#2462 - [engine] [feature]
如果没有明确传递“value”或“callable”参数,则默认将“required”标志设置为 True,在 bindparam() 上。这将导致语句执行检查参数是否存在于最终的绑定参数集合中,而不是隐式地赋值为 None。
参考:#2556 - [engine] [feature]
对“方言” API 进行了各种 API 调整,以更好地支持高度专业化的系统,如 Akiban 数据库,包括更多的钩子,允许执行上下文访问类型处理器。 - [engine] [feature]
Inspector.get_primary_keys() 已弃用;使用 Inspector.get_pk_constraint()。谢谢 Diana Clarke。
参考:#2422 - [engine] [feature]
添加了一个新的 C 扩展模块“utils”,用于在有时间实现时进行额外的函数加速。 - [engine] [bug]
Inspector.get_table_names() 的 order_by=”foreign_key” 功能现在将表按照依赖者优先排序,以与 util.sort_tables 和 metadata.sorted_tables 保持一致。 - [engine] [bug]
修复了一个 bug,即如果数据库重新启动影响了多个连接,则每个连接都会单独调用池的新释放,即使只需要一个释放。
参考:#2522 - [engine] [bug]
select().apply_labels() 上的 .c. 属性的列名称现在基于 而不是 ,对于具有明确定义的 .key 的列。
参考:#2397 - [engine] [bug]
autoload_replace 标志在 Table 上,当为 False 时,将导致引用已声明列的反射外键约束被跳过,假设 Python 中声明的列将接管指定 Python 中的 ForeignKey 或 ForeignKeyConstraint 声明的任务。 - [engine] [bug]
ResultProxy 方法 inserted_primary_key、last_updated_params()、last_inserted_params()、postfetch_cols()、prefetch_cols() 都会断言给定的语句是一个已编译的构造,并且是一个适当的 insert() 或 update() 语句,否则会引发 InvalidRequestError。
参考:#2498 - [engine]
ResultProxy.last_inserted_ids 被移除,替换为 inserted_primary_key。
sql
- [sql] [feature]
添加了一个新的方法Engine.execution_options()
到Engine
。这个方法的工作方式类似于Connection.execution_options()
,因为它创建了一个引用新选项集的父对象的副本。该方法可用于构建每个引擎共享相同基础连接池的分片方案。该方法已在 ORM 中针对水平分片配方进行了测试。
另见Engine.execution_options()
- [sql] [feature]
核心中的运算符系统进行了重大改组,允许重新定义现有运算符以及在类型级别添加新运算符。新类型可以从现有类型创建,这些类型增加或重新定义了导出到列表达式的操作,类似于 ORM 允许 comparator_factory。新的架构将此功能移入核心,以便在所有情况下一致可用,并使用现有类型传播行为进行干净传播。
参考:#2547 - [sql] [feature]
为了补充,类型现在可以提供“绑定表达式”和“列表达式”,允许在列或绑定级别上将 SQL 表达式注入到语句中。这适用于类型需要在 SQL 级别增强绑定和结果行为的用例,而不是在 Python 级别。允许类似透明加密/解密、使用 PostGIS 函数等方案。
参考:#1534, #2547 - [sql] [feature]
核心运算符系统现在包括 getitem 运算符,即 Python 中的括号运算符。首先用于为 PostgreSQL ARRAY 类型提供索引和切片行为,并且还提供了一个用于端用户定义自定义 getitem 方案的钩子,这些方案可以应用于类型级别以及 ORM 级别的自定义操作符方案中。lshift(<<)和 rshift(>>)也支持作为可选运算符。
注意,这个变化的效果是,ORM 与 synonym()或其他“装饰器封装”方案一起使用的基于描述符的 getitem 方案将需要开始使用自定义比较器以保持这种行为。 - [sql] [feature]
修订了用于确定用户定义运算符的运算符优先级的规则,即使用op()
方法授予的运算符。以前,在所有情况下都应用最小的优先级,现在默认优先级为零,低于所有运算符,除了“逗号”(例如,在func
调用的参数列表中使用)和“AS”,并且还可以通过op()
方法��的“precedence”参数进行自定义。
参考:#2537 - [sql] [feature]
对所有 String 类型添加了“collation”参数。当存在时,呈现为 COLLATE 。这是为了支持现在多个数据库(包括 MySQL、SQLite 和 PostgreSQL)支持的 COLLATE 关键字。
参考:#2276 - [sql] [feature]
现在可以通过将 operators.custom_op()与 UnaryExpression()结合来使用自定义的一元运算符。 - [sql] [feature]
增强了 GenericFunction 和 func.*,允许通过类名自动在 func.*命名空间中使用用户定义的 GenericFunction 子类,可选地使用包名,以及具有与 func.*中标识名称不同的渲染名称的功能。 - [sql] [feature]
现在 cast()和 extract()构造也将通过 func.*访问器生成,因为用户自然会尝试从 func.*访问这些名称,即使返回的对象不是 FunctionElement 也应该符合预期。
参考:#2562 - [sql] [feature]
现在可以使用新的 inspect()服务获取 Inspector 对象的实例。
参考:#2208 - [sql] [feature]
column_reflect 事件现在接受 Inspector 对象作为第一个参数,位于“table”之前。使用这个非常新的事件的 0.7 版本的代码将需要修改,以添加“inspector”对象作为第一个参数。
参考:#2418 - [sql] [feature]
现在结果集中列的定位行为默认区分大小写。SQLAlchemy 多年来会对这些值进行不区分大小写的转换,可能是为了缓解像 Oracle 和 Firebird 这样的方言早期大小写敏感性问题。这些问题在更现代的版本中已经更清晰地解决,因此在标识符上调用 lower()的性能损失已经消除。可以通过在 create_engine()上设置“case_insensitive=False”来重新启用不区分大小写的比较。
参考:#2423 - [sql] [feature]
当在 insert.values()或 update.values()中存在不在目标表中的键时,发出的“未使用的列名”警告现在是一个异常。
参考:#2415 - [sql] [feature]
向 ForeignKey、ForeignKeyConstraint 添加了“MATCH”子句,感谢 Ryan Kelly。
参考:#2502 - [sql] [feature]
添加了对从表的别名进行 DELETE 和 UPDATE 的支持,这在查询中可能与其他地方的自身相关联,由 Ryan Kelly 提供。
��考:#2507 - [sql] [feature]
select()具有 correlate_except()方法,自动关联除传递的所有 selectables 之外的所有 selectables。 - [sql] [feature]
prefix_with()方法现在在每个 select()、insert()、update()、delete()上都可用,具有相同的 API,接受多个前缀调用,以及“方言名称”,以便将前缀限制为一种方言。
参考:#2431 - [sql] [feature]
在 select()构造中添加了 reduce_columns()方法,使用 util.reduce_columns 实用程序函数内联替换列以删除等效列。reduce_columns()还添加了“with_only_synonyms”以限制仅对具有相同名称的列进行减少。已删除不推荐使用的 fold_equivalents()功能。
参考:#1729 - [sql] [feature]
重新设计了 startswith()、endswith()、contains()运算符,以更好地处理否定(NOT LIKE),并且在编译时组装它们,以便它们的渲染 SQL 可以被修改,例如在 Firebird STARTING WITH 的情况下。
参考:#2470 - [sql] [feature]
添加了一个钩子到渲染 CREATE TABLE 系统,通过针对新的 schema.CreateColumn 构造函数构造@compiles 函数,为每个列提供访问渲染的系统。
参考:#2463 - [sql] [feature]
“标量”选择现在具有 WHERE 方法以帮助生成构建。此外,关于 SS“关联”列的方式略有调整;新方法不再将意义应用于所选的基础 Table 列。这改进了一些相当晦涩的情况,而且似乎之前的逻辑没有任何目的。 - [sql] [feature]
当首次使用构造为引用多个远程表的 ForeignKeyConstraint()时,将引发显式错误。
参考:#2455 - [sql] [feature]
向ColumnOperators.notin_()
、ColumnOperators.notlike()
、ColumnOperators.notilike()
添加了ColumnOperators
。
参考:#2580 - [sql] [change]
如果指定了长度,Text()类型将呈现给定的长度。 - [sql] [changed]
expression.sql 中的大多数类不再以下划线开头,即 Label、SelectBase、Generative、CompareMixin。_BindParamClause 也更名为 BindParameter。这些类的旧下划线名称将在可预见的未来保持可用作为同义词。 - [sql] [bug]
修复了传递给Compiler.process()
的关键字参数不会传播到 SELECT 语句的列子句中存在的列表达式的 bug。特别是当自定义编译方案依赖于特殊标志时,这种情况会出现。
参考:#2593 - [sql] [bug] [orm]
select()
的自动相关特性,以及由此引发的Query
的特性,不会对直接在包含 SELECT 的 FROM 列表中呈现的 SELECT 语句产生影响。 SQL 中的相关性仅适用于诸如 WHERE、ORDER BY、列子句中的列表达式。
参考:#2595 - [sql] [bug]
调整了列优先级,将“concat”和“match”运算符移动到与“is”、“like”等运算符相同的位置;这有助于在与“IS”结合使用时进行括号渲染。
参考:#2564 - [sql] [bug]
将列表达式应用于带有标签的选择语句,无论是否有其他修改构造,都不再将该表达式“定位”到底层列;这会影响依赖于列定位以检索结果的 ORM 操作。也就是说,像 query(User.id, User.id.label(‘foo’))这样的查询现在将分别跟踪每个“User.id”表达式的值,而不是将它们混合在一起。预计不会影响任何用户;但是,如果使用 select()与 query.from_statement()结合使用并尝试加载完全组合的 ORM 实体的用法可能不会按预期运行,如果 select()命名的列对象具有任意的.label()名称,因为这些将不再定位到由该实体映射的列对象。
参考:#2591 - [sql] [bug]
修复了将列“default”参数解释为可调用项,以便不将 ExecutionContext 传递给关键字参数的问题。
参考:#2520 - [sql] [bug]
所有的 UniqueConstraint、ForeignKeyConstraint、CheckConstraint 和 PrimaryKeyConstraint 在直接引用绑定到表的 Column 对象时(即不仅仅是字符串列名),并且只引用一个 Table 时,将自动附加到它们的父表上。在 0.8 之前,这种行为仅适用于 UniqueConstraint 和 PrimaryKeyConstraint,而不适用于 ForeignKeyConstraint 或 CheckConstraint。
参考:#2410 - [sql] [错误]
TypeDecorator 现在包括一个通用的 repr(),默认情况下以“impl”类型为基础工作。对于那些指定了自定义 init 方法的 TypeDecorator 类来说,这是一个行为变化;那些类型如果需要 repr()提供一个忠实的构造函数表示,就需要重新定义 repr()。
参考:#2594 - [sql] [错误]
column.label(None)现在生成一个匿名标签,而不是返回列对象本身,与 label(column, None)的行为一致。
参考:#2168 - [sql] [已移除]
在create_engine()
以及String
上长期弃用且无效的assert_unicode
标志已被移除。
postgresql
- [postgresql] [功能]
postgresql.ARRAY 具有可选的“维度”参数,将为数组分配特定数量的维度,这将在 DDL 中呈现为 ARRAY[][]…,还提高了绑定/结果处理的性能。
参考:#2441 - [postgresql] [功能]
postgresql.ARRAY 现在支持索引和切片。Python []运算符可用于所有类型为 ARRAY 的 SQL 表达式;可以传递整数或简单切片。这些切片也可以在 UPDATE 语句的 SET 子句的赋值侧使用,通过将它们传递给 Update.values();查看文档以获取示例。 - [postgresql] [功能]
添加了新的“数组字面量”构造函数 postgresql.array()。基本上是一个以 ARRAY[1,2,3]形式呈现的“元组”。 - [postgresql] [功能]
添加了对 PostgreSQL ONLY 关键字的支持,该关键字可以出现在 SELECT、UPDATE 或 DELETE 语句中对应的表中。该短语是使用 with_hint()建立的。感谢 Ryan Kelly
参考:#2506 - [postgresql] [功能]PostgreSQL 方言的“ischema_names”字典是“非官方”可定制的。意思是,新类型如 PostGIS 类型可以添加到这个字典中,PG 类型反射代码应该能够处理带有可变参数数量的简单类型。这里的功能之所以“非官方”,有三个原因:
- 这不是一个“官方”API。理想情况下,“官方”API 应该允许在方言或全局级别以一种通用方式调用自定义类型处理可调用对象。
- 这仅针对 PG 方言实现,特别是因为 PG 对自定义类型有广泛支持,而其他数据库后端不是这样。真正的 API 将在默认方言级别实现。
- 这里的反射代码仅针对简单类型进行了测试,可能在更复杂类型上存在问题。
- 补丁由Éric Lemoine 提供。
mysql
- [mysql] [feature]
将 TIME 类型添加到 mysql 方言,接受“fst”参数,这是最近 MySQL 版本的新“分数秒”指定符。数据类型将解释从驱动程序接收的微秒部分,但请注意,目前大多数/所有 MySQL DBAPI 都不支持返回此值。
参考:#2534 - [mysql] [bug]
方言在第一次连接时不再发出昂贵的服务器排序查询,以及服务器大小写。这些功能仍然作为半私有功能可用。
参考:#2404
sqlite
- [sqlite] [feature]
SQLite 的日期和时间类型已经进行了改进,以支持更开放的输入和输出格式,使用基于名称的格式字符串和正则表达式。新的参数“microseconds”还提供了省略时间戳“微秒”部分的选项。感谢 Nathan Wright 对此工作和测试的贡献。
参考:#2363 - [sqlite]
将NCHAR
、NVARCHAR
添加到 SQLite 方言的已识别类型名称列表以供反射使用。SQLite 返回给定类型的名称作为返回的名称。
参考:rc3addcc9ffad
mssql
- [mssql] [feature]
SQL Server 方言可以给出数据库限定的模式名称,即“schema=‘mydatabase.dbo’”;反射操作将检测到这一点,将模式分割在“.”之间以单独获取所有者,并在反映“dbo”所有者内的目标之前发出“USE mydatabase”语句;然后恢复从 DB_NAME()返回的现有数据库。 - [mssql] [feature]
更新了对 mxodbc 驱动程序的支持;建议使用 mxodbc 3.2.1 以获得完全兼容性。 - [mssql] [bug]
移除了旧行为,即通过==将列与标量 SELECT 进行比较会强制转换为 SQL 服务器方言的 IN。这是隐式行为,在其他情况下会失败,因此被移除。依赖于此行为的代码需要修改为显式使用 column.in_(select)。
参考:#2277
oracle
- [oracle] [feature]
从 setinputsizes()集中排除的列的类型可以通过将字符串 DBAPI 类型名称列表发送到 exclude_setinputsizes 方言参数来自定义,该列表以前是固定的。该列表现在默认为 STRING、UNICODE,移除了 CLOB、NCLOB。
参考:#2561 - [oracle] [bug]
当使用 quote=True 的 Column 生成同名的绑定参数时,将引用信息传递给 bindparam() 对象,就像在生成的 INSERT 和 UPDATE 语句中一样,以便完全支持未知的保留名称。
参考:#2437 - [oracle] [bug]
Oracle 中的 CreateIndex 结构现在将索引的名称模式限定为父表的名称。以前,此名称被省略,导致索引在默认模式中创建,而不是表的模式。
misc
- [feature] [access]
MS Access 方言已移至 Bitbucket 上的自己的项目中,利用了新的 SQLAlchemy 方言兼容性套件。该方言仍处于非常粗糙的状态,可能尚未准备好供一般使用,但现在已经具有极其基础的功能。bitbucket.org/zzzeek/sqlalchemy-access
- [feature] [firebird]
“startswith()” 运算符显示为 “STARTING WITH”,“~startswith()” 显示为 “NOT STARTING WITH”,使用 FB 的更有效的运算符。
参考:#2470 - [feature] [firebird]
为 fdb 驱动程序添加了一个实验性方言,但由于无法构建 fdb 包,因此尚未经过测试。
参考:#2504 - [bug] [firebird]
当尝试发出没有长度的 VARCHAR 时,引发 CompileError,与 MySQL 相同。
参考:#2505 - [bug] [firebird]
Firebird 现在使用严格的“ansi 绑定规则”,以便绑定参数不会在语句的列子句中显示 - 它们会按照字面意思显示。 - [bug] [firebird]
当使用 DateTime 类型与 Firebird 时,支持将 datetime 作为 date 传递;其他方言也支持此功能。 - [moved] [maxdb]
MaxDB 方言,多年来一直无法使用,已移到待定的 Bitbucket 项目中,bitbucket.org/zzzeek/sqlalchemy-maxdb
。
general
- [general] [removed]
“sqlalchemy.exceptions” 作为 “sqlalchemy.exc” 的同义词已完全移除。
参考:#2433 - [general]
SQLAlchemy 0.8 现在面向 Python 2.5 及以上版本。不再支持 Python 2.4。
orm
- [orm] [feature]
关系(relationship())内部进行了重大重写,现在允许包含指向自身的列在复合外键内的连接条件。添加了一个用于非常专业化的 primaryjoin 条件的新 API,允许根据需要在表达式内联中放置注释函数 remote() 和 foreign() 处理基于 SQL 函数、CAST 等的条件。以前使用半私有的 _local_remote_pairs 方法的方案可以升级到这种新方法。
另请参阅
重写 _orm.relationship() 机制
参考:#1401 - [orm] [feature]
新的独立函数 with_polymorphic() 提供了 query.with_polymorphic() 的功能,以独立形式提供。它可以应用于查询中的任何实体,包括作为联接的目标,在其中取代 “of_type()” 修改器。
参考:#2333 - [orm] [feature]
在属性上的 of_type() 结构现在接受别名化(aliased())类构造以及多态(with_polymorphic)构造,并且与 query.join()、any()、has() 以及同时也适用于 eager loaders 子查询加载(subqueryload())、连接加载(joinedload())、包含加载(contains_eager())。
参考:#1106,#2438 - [orm] [feature]
对于映射类的事件监听的改进允许指定未映射的类用于实例和映射器事件。当传递 propagate=True 标志时,建立的事件将自动设置在该类的子类上,当最终映射时,事件将为该类本身设置。
参考:#2585 - [orm] [feature]
“延迟声明式反射”系统已经移动到声明式扩展本身中,使用新的 DeferredReflection 类。此类现在已经针对单表和联合表继承用例进行了测试。
参考:#2485 - [orm] [feature]
添加了新的核心函数“inspect()”,它作为对映射器、对象、其他内容进行内省的通用网关。Mapper 和 InstanceState 对象已经增强,提供了公共 API,允许检查映射的属性,包括针对列绑定或关系绑定属性的过滤器,检查当前对象状态,属性历史记录等。
参考:#2208 - [orm] [feature]
在 session.begin_nested() 中调用 rollback() 现在只会使那些在该事务范围内具有净更改的对象失效,即在刷新时脏对象或修改的对象。这允许 begin_nested() 的典型用例,即修改一小部分对象,保留不在子事务中修改的较大对象集合中的数据。
参考:#2452 - [orm] [feature]
添加了实用功能 Session.enable_relationship_loading(),取代了 relationship.load_on_pending。然而,应该避免使用这两个功能。
参考:#2372 - [orm] [feature]
增加了对 column_property()、relationship()、composite() 的 .info 字典参数的支持。所有 MapperProperty 类都可以在整体上使用自动创建的 .info 字典。 - [orm] [feature]
向/从映射集合中添加/移除 None 现在会生成属性事件。以前,在某些情况下,None 追加会被忽略。相关内容。
参考:#2229 - [orm] [feature]
映射集合中存在 None 现在在刷新时会引发错误。以前,集合中的 None 值会被静默忽略。
参考:#2229 - [orm] [feature]
Query.update() 方法现在对更新的表更加宽松。现在更好地支持普通的 Table 对象,并且可以使用一个加入继承的子类与 update() 一起使用;子类表将成为更新的目标,如果父表在 WHERE 子句中被引用,编译器将调用 UPDATE…FROM 语法来满足 WHERE 子句。如果在“values”字典中通过对象指定列,还支持 MySQL 的多表更新功能。PG 的 DELETE…USING 在 Core 中还不可用。 - [orm] [feature]
新的 session 事件 after_transaction_create 和 after_transaction_end 允许跟踪新的 SessionTransaction 对象。如果检查对象,则可以确定会话何时首次激活以及何时停用。 - [orm] [feature]
现在 Query 可以通过在使用的相应 TypeEngine 对象上设置标志“hashable=False”来加载包含不可哈希类型的实体/标量混合“元组”行。返回不可哈希类型(通常是列表)的自定义类型可以将此标志设置为 False。
参考:#2592 - [orm] [feature]
现在 Query 默认会像 select() 一样“自动关联”。以前,在另一个查询中使用的 Query 需要显式调用 correlate() 方法才能将内部的表与外部关联起来。如常,correlate(None) 可以禁用关联。
参考:#2179 - [orm] [feature]
现在在对象在 Session.add()、Session.merge() 等方法中建立在 Session.new 或 Session.identity_map 中后,会发出 after_attach 事件,以便在调用事件时这些集合中表示对象。添加了 before_attach 事件以适应需要在预附加对象时进行自动刷新的用例。
参考:#2464 - [orm] [feature]
当在 flush 的“execute”部分中使用不受支持的方法时,会产生警告。这些是熟悉的方法 add()、delete() 等,以及在 mapper 级别 flush 事件中调用的集合和相关对象操作,如 after_insert()、after_update() 等。长期以来,已经明确记录了当 Session 在执行 flush 计划时被操作时,SQLAlchemy 无法保证结果,但用户仍在这样做,所以现在有了警告。也许将来 Session 将被增强以支持在 flush 中执行这些操作,但目前无法保证结果。 - [orm] [feature]
ORM 实体可以传递给核心 select() 构造,以及传递给 select() 的 select_from()、correlate() 和 correlate_except() 方法,它们将被解包为可选择项。
参考:#2245 - [orm] [feature]
一些支持根据映射属性自动渲染关系连接条件的功能,使用核心 SQL 构造。例如,select([SomeClass]).where(SomeClass.somerelationship) 将从“someclass”中选择,并使用“somerelationship”的主连接作为 WHERE 子句。这改变了在核心 SQL 上下文中使用“SomeClass.somerelationship”之前的含义;以前,它会“解析”为父可选择项,这通常不太有用。也适用于 query.filter()。相关链接。
参考:#2245 - [orm] [feature]
在 declarative_base() 中的类注册表现在是 WeakValueDictionary。因此,“Base”的子类如果没有被其他映射器/超类映射器引用,将被垃圾回收。查看此票证的下一个注释。
参考:#2526 - [orm] [feature]
单继承声明子类之间的列冲突,无论是否使用混合类,都可以使用文档中描述的新的 @declared_attr 用法解决。
参考:#2472 - [orm] [feature]
declared_attr 现在可以用于非混合类,尽管这通常只对单继承子类列冲突解决有用。
参考:#2472 - [orm] [feature]
declared_attr 现在可以与不是 Column 或 MapperProperty 的属性一起使用;包括任何用户定义的值以及关联代理对象。
参考:#2517 - [orm] [feature]
非常有限的支持,用于继承映射器在类本身被解除引用时进行垃圾回收。映射器不能拥有自己的表(即只有单个表继承),没有多态属性。这允许创建声明性映射类的临时子类的用例,在被单元测试解除引用时进行垃圾回收。
参考:#2526 - [orm] [feature]
Declarative 现在通过字符串名称以及完整的模块限定名称维护类的注册表。现在可以根据模块限定的字符串在 relationship() 中查找具有相同名称的多个类。当多个类共享相同名称时,简单的类名称查找现在会引发一条信息性错误消息。
参考:#2338 - [orm] [feature]
现在可以提供类绑定属性,这些属性会覆盖任何非 ORM 类型的列,而不仅仅是描述符。
参考:#2535 - [orm] [feature]
向 Query.subquery() 添加了 with_labels 和 reduce_columns 关键字参数,以提供两种用于生成具有唯一命名列的查询的替代策略。
参考:#1729 - [orm] [feature]
当对一个工具化集合的引用不再与父类相关联(因为到期/属性刷新/集合替换),但是接收到现在已分离的集合上的 append 或 remove 操作时,会发出警告。
参考:#2476 - [orm] [bug]
如果两个表通过连接继承相关,并且 FK 依赖关系不是 inherit_condition 的一部分,则 ORM 在 flush 期间将执行额外的工作来确定 FK 依赖关系不重要,这样用户就不需要使用 use_alter 指令。
参考:#2527 - [orm] [bug]
现在,instrumentation 事件 class_instrument()、class_uninstrument() 和 attribute_instrument() 仅对分配给 listen() 的类的后代类触发。以前,无论传递了什么“target”参数,事件监听器都会被分配为在所有情况下监听所有类。
参考:#2590 - [orm] [bug]
在 with_polymorphic() 中,如果以任意顺序发送多级子类或者中间类缺失,则会正确按顺序生成 JOIN 并正确生成继承表。
参考:#1900 - [orm] [bug]
在处理共享共同基类的子类实体链的 joined/subquery eager loading 中进行了改进,没有提供特定的“连接深度”。在检测到“循环”之前,会逐个链到每个子类映射器,而不是将基类视为“循环”的源。
参考:#2481 - [orm] [bug]
现在,Session.is_modified() 上的“passive”标志不再起作用。在所有情况下,is_modified() 只查看本地内存中的修改标志,并且不会发出任何 SQL 或调用加载器可调用/初始化器。
参考:#2320 - [orm] [bug]
当使用 delete-orphan 级联与 one-to-many 或 many-to-many 且没有设置 single-parent=True 时发出的警告现在是一个错误。在任何情况下,ORM 在此警告后将无法正常运行。
参考:#2405 - [orm] [bug]
在 flush 事件中发出的惰性加载(如 before_flush()、before_update() 等)现在将按照非事件代码中的方式运行,考虑到在惰性发出的查询中使用的主键/外键值。之前,特殊标志将被建立,这些标志将导致惰性加载基于父主键/外键值的“先前”值,特别是在 flush 中调用时;现在,以这种方式加载的信号现在被局限于工作单元实际需要以这种方式加载的位置。请注意,工作单元有时会在调用 before_update() 事件之前加载这些集合,因此“passive_updates”的使用与否可能会影响在 flush 事件中访问时集合是否表示“旧”或“新”数据,具体取决于惰性加载的时间。该更改在极小的可能性下与旧行为相关的用户事件代码依赖不兼容。
参考:#2350 - [orm] [bug]
关于 flush 后额外状态的持续讨论,由于事件侦听器,任何从属性角度标记为“脏”的状态,通常是通过在 after_insert()、after_update() 等中设置列属性事件来完成的,现在在所有情况下都将重置“历史”标志,而不仅仅是那些在 flush 中的实例。这样做的效果是,在 flush 后,这种“脏”状态不会继续存在,并且不会产生 UPDATE 语句。发出了相应的警告;set_committed_state() 方法可用于在不产生历史事件的情况下分配对象上的属性。
参考:#2566,#2582 - [orm] [bug]
修复了在 @declared_attr Column 和直接定义的 Column 之间逐渐发展的断开连接。在这两种情况下,Column 将应用于声明类的表,但不适用于联合继承子类的表。之前,直接定义的 Column 将被放置在基表和子表上,这通常不是所期望的。
参考:#2565 - [orm] [bug]
当父类本身被映射到 join() 或 select() 语句时,Declarative 现在可以将在单表继承子类上声明的列传播到父类的表上,而不仅仅是通过连接继承直接或间接映射到表上。
参考:#2549 - [orm] [bug]
当 uselist=False 与“dynamic”加载器结合时会发出错误。这在 0.7.9 中是一个警告。 - [orm] [removed]
ORM 的遗留“可变”系统,包括 MutableType 类以及 PickleType 和 postgresql.ARRAY 上的 mutable=True 标志已被移除。ORM 使用 sqlalchemy.ext.mutable 扩展检测原地突变,该扩展在 0.7 中引入。移除 MutableType 和相关构造从 SQLAlchemy 的内部删除了大量复杂性。由于在使用时会扫描 Session 的全部内容,这种方法性能较差。
参考:#2442 - [orm] [removed]已移除的已弃用标识符:
- allow_null_pks mapper() 参数(使用 allow_partial_pks)
- _get_col_to_prop() mapper 方法(使用 get_property_by_column())
- Session.merge() 的 dont_load 参数(使用 load=True)
- sqlalchemy.orm.shard 模块(使用 sqlalchemy.ext.horizontal_shard)
- [orm] [moved]
InstrumentationManager 接口及整个相关的替代类实现系统现已移动到 sqlalchemy.ext.instrumentation。这是一个很少使用的系统,它给类的实现机制增加了显著的复杂性和开销。新的架构允许直到实际导入 InstrumentationManager 时才使用它,此时它被引导到核心中。
例子
- [例子]
Beaker 缓存示例已转换为使用 dogpile.cache。这是一个由 Beaker 的缓存内部创建者编写的新的缓存库,代表了一个大大改进的、简化的、现代化的缓存系统。
参见
Dogpile 缓存
参考:#2589
engine
- [engine] [feature]
现在可以将连接事件监听器与单个连接对象关联,而不仅仅是与 Engine 对象关联。
参考:#2511 - [engine] [feature]
before_cursor_execute 事件会触发所谓的“_cursor_execute”事件,这些事件通常是主键绑定序列和默认生成的 SQL 语句的特殊执行情况,当使用 INSERT 时未使用 RETURNING 时单独调用。
参考:#2459 - [engine] [feature]
测试套件使用的库已经重新安排,以便它们再次成为 SQLAlchemy 安装的一部分。此外,新的测试套件现在位于新的 sqlalchemy.testing.suite 包中。这是一个正在开发中的系统,希望为外部方言提供一个通用的测试套件。在 SQLAlchemy 之外维护的方言可以使用新的测试装置作为其自己测试的框架,并将免费获得一个针对方言的“兼容性”测试套件,包括一个改进的“要求”系统,其中可以为测试启用或禁用特定功能和功能。 - [engine] [feature]
添加了一种新的在进程中注册新方言而不使用入口点的系统。请参阅“注册新方言”文档。
参考:#2462 - [engine] [feature]
默认情况下,“required”标志在 bindparam()上设置为 True,如果“value”或“callable”参数未显式传递,则会导致语句执行检查参数是否存在于最终绑定参数集合中,而不是隐式分配 None。
参考:#2556 - [engine] [feature]
对“dialect” API 进行了各种 API 调整,以更好地支持高度专业化的系统,如 Akiban 数据库,包括更多的钩子以允许执行上下文访问类型处理器。 - [engine] [feature]
Inspector.get_primary_keys()已弃用;请使用 Inspector.get_pk_constraint()。感谢 Diana Clarke。
参考:#2422 - [engine] [feature]
添加了一个新的 C 扩展模块“utils”,用于在有时间实现时提供额外的功能加速。 - [engine] [bug]
Inspector.get_table_names()的 order_by=”foreign_key”功能现在首先按 dependee 排序表,以与 util.sort_tables 和 metadata.sorted_tables 保持一致。 - [engine] [bug]
修复了一个错误,即如果数据库重新启动影响多个连接,则每个连接将单独调用池的新处理,即使只需要一个处理。
参考:#2522 - [engine] [bug]
select().apply_labels()上的.c.属性的列名称现在基于而不是,对于那些具有明确定义的.key 的列。
参考:#2397 - [engine] [bug]
当 Table 上的 autoload_replace 标志为 False 时,将跳过引用已声明列的反射外键约束,假设在 Python 中声明的列将接管指定 Python ForeignKey 或 ForeignKeyConstraint 声明的任务。 - [engine] [bug]
ResultProxy 方法 inserted_primary_key,last_updated_params(),last_inserted_params(),postfetch_cols(),prefetch_cols()都断言给定的语句是一个已编译的构造,并且是一个适当的 insert()或 update()语句,否则引发 InvalidRequestError。
参考:#2498 - [engine]
ResultProxy.last_inserted_ids 已被移除,替换为 inserted_primary_key。
sql
- [sql] [feature]
添加了一个新方法Engine.execution_options()
到Engine
。该方法类似于Connection.execution_options()
,它创建一个指向新选项集的父对象的副本。该方法可用于构建分片方案,其中每个引擎共享相同的底层连接池。该方法已针对 ORM 中的水平分片配方进行了测试。
另请参阅Engine.execution_options()
- [sql] [feature]
在 Core 中对操作符系统进行了重大改组,允许在类型级别重新定义现有操作符以及添加新操作符。可以从现有类型创建新类型,这些新类型添加或重新定义导出到列表达式的操作,类似于 ORM 如何允许 comparator_factory。新架构将此功能移入 Core,以便在所有情况下一致可用,并且使用现有类型传播行为进行干净传播。
参考:#2547 - [sql] [feature]
为了补充,现在类型可以提供“绑定表达式”和“列表达式”,允许在每列或每绑定级别的语句中在编译时注入 SQL 表达式。这适用于需要在 SQL 级别增强绑定和结果行为的类型的用例,而不是在 Python 级别。允许方案如透明加密/解密,使用 PostGIS 函数等。
参考:#1534, #2547 - [sql] [feature]
核心操作符系统现在包括 getitem 操作符,即 Python 中的方括号操作符。首先用于为 PostgreSQL ARRAY 类型提供索引和切片行为,并且还提供了一个钩子,用于最终用户定义自定义 getitem 方案,这些方案可以应用于类型级别以及 ORM 级别的自定义操作符方案。lshift (<<)和 rshift (>>)也作为可选操作符受支持。
请注意,此更改会导致 ORM 与 synonym()或其他“包装描述符”的方案结合使用的基于描述符的 getitem 方案需要开始使用自定义比较器以保持此行为。 - [sql] [feature]
修改了用于确定用户定义运算符(即使用op()
方法授予的运算符)的运算符优先级的规则。以前,在所有情况下都应用最小优先级,现在默认优先级为零,低于所有运算符,除了“逗号”(例如,在func
调用的参数列表中使用)和“AS”,还可以通过op()
方法上的“precedence”参数进行自定义。
参考:#2537 - [sql] [feature]
向所有 String 类型添加了“collation”参数。当存在时,呈现为 COLLATE 。这是为了支持现在多个数据库支持的 COLLATE 关键字,包括 MySQL、SQLite 和 PostgreSQL。
参考:#2276 - [sql] [feature]
现在可以通过将 operators.custom_op()与 UnaryExpression()结合使用来使用自定义一元运算符。 - [sql] [feature]
加强了 GenericFunction 和 func.*,允许用户定义的 GenericFunction 子类通过类名自动在 func.*命名空间中可用,可选择使用包名,以及具有在 func.*中渲染名称与标识名称不同的功能。 - [sql] [feature]
现在 cast()和 extract()构造也将通过 func.*访问器生成,因为用户自然会尝试从 func.*访问这些名称,他们可能会按照预期的方式执行,即使返回的对象不是 FunctionElement。
参考:#2562 - [sql] [feature]
现��可以使用新的 inspect()服务获取 Inspector 对象的实例,作为
参考:#2208 - [sql] [feature]
现在 column_reflect 事件接受 Inspector 对象作为第一个参数,位于“table”之前。使用这个非常新的事件的 0.7 版本的代码将需要修改以添加“inspector”对象作为第一个参数。
参考:#2418 - [sql] [feature]
现在结果集中的列定位行为默认区分大小写。多年来,SQLAlchemy 会对这些值进行不区分大小写的转换,可能是为了缓解像 Oracle 和 Firebird 这样的方言早期大小写敏感性问题。这些问题在更现代的版本中已经更清晰地解决,因此在标识符上调用 lower()的性能损失已经消除。可以通过在 create_engine()上设置“case_insensitive=False”来重新启用不区分大小写的比较。
参考:#2423 - [sql] [feature]
当在 insert.values()或 update.values()中存在键不在目标表中时,现在发出的“未使用的列名”警告已经变成异常。
参考:#2415 - [sql] [feature]
在 ForeignKey、ForeignKeyConstraint 中添加了“MATCH”子句,感谢 Ryan Kelly。
参考:#2502 - [sql] [feature]
增加了对从表的别名进行 DELETE 和 UPDATE 的支持,这在查询中可能与其他地方的表相关联,感谢 Ryan Kelly。
参考:#2507 - [sql] [feature]
select()现在具有 correlate_except()方法,自动关联除传递的所有可选择项之外的所有可选择项。 - [sql] [feature]
prefix_with()方法现在在 select()、insert()、update()、delete()的每个上都可用,具有相同的 API,接受多个前缀调用,以及“方言名称”,以便前缀可以限制为一种方言。
参考:#2431 - [sql] [feature]
在 select()构造中添加了 reduce_columns()方法,使用 util.reduce_columns 实用程序函数替换内联列以删除等效列。reduce_columns()还添加了“with_only_synonyms”以限制仅对具有相同名称的列进行减少。已弃用的 fold_equivalents()功能已被移除。
参考:#1729 - [sql] [feature]
重新设计了 startswith()、endswith()、contains()运算符,以更好地处理否定(NOT LIKE),并在编译时组装它们,以便它们的渲染 SQL 可以被修改,例如在 Firebird STARTING WITH 的情况下。
参考:#2470 - [sql] [feature]
添加了一个钩子到渲染 CREATE TABLE 的系统中,通过针对新的 schema.CreateColumn 构造一个@compiles 函数,为每个列提供单独的渲染访问。
参考:#2463 - [sql] [feature]
“标量”选择现在具有 WHERE 方法,以帮助生成构建。此外,关于如何 SS“关联”列的轻微调整;新方法不再将所选的基础表列赋予任何含义。这改进了一些相当奇特的情况,而那里的逻辑似乎没有任何目的。 - [sql] [feature]
当首次使用构造为引用多个远程表的 ForeignKeyConstraint()时,将引发显式错误。
参考:#2455 - [sql] [feature]
添加了ColumnOperators.notin_()
,ColumnOperators.notlike()
,ColumnOperators.notilike()
到ColumnOperators
.
参考:#2580 - [sql] [change]
如果指定了长度,Text() 类型会呈现给定的长度。 - [sql] [changed]
expression.sql 中的大多数类不再以下划线开头,即 Label、SelectBase、Generative、CompareMixin。_BindParamClause 也被重命名为 BindParameter。这些类的旧下划线名称将在可预见的未来保持可用作为同义词。 - [sql] [bug]
修复了传递给Compiler.process()
的关键字参数不会传播到 SELECT 语句的 columns 子句中的列表达式的 bug。特别是当由依赖于特殊标志的自定义编译方案使用时,会出现这种情况。
参考:#2593 - [sql] [bug] [orm]
select()
的自动相关特性,以及由此引发的Query
的特性,将不会对直接在包含 SELECT 的 FROM 列表中呈现的 SELECT 语句产生影响。 SQL 中的相关性仅适用于诸如 WHERE、ORDER BY、columns 子句中的列表达式。
参考:#2595 - [sql] [bug]
调整了列优先级,将“concat”和“match”运算符移动到与“is”、“like”等运算符相同的位置;当与“IS”一起使用时,这有助于括号渲染。
参考:#2564 - [sql] [bug]
将列表达式应用于带有或不带有其他修改构造的标签的 select 语句,将不再将该表达式“定位”到底层列;这会影响依赖于列定位以检索结果的 ORM 操作。也就是说,像 query(User.id, User.id.label(‘foo’))这样的查询现在将分别跟踪每个“User.id”表达式的值,而不是将它们合并在一起。不过,不希望任何用户受到影响;但是,如果 select()与 query.from_statement()结合使用,并尝试加载完全组合的 ORM 实体,而 select()命名了具有任意.label()名称的 Column 对象,那么可能无法按预期方式运行,因为这些对象将不再定位到该实体映射的 Column 对象。
参考:#2591 - [sql] [bug]
修复了将“default”参数解释为可调用项时,不将 ExecutionContext 传递给关键字参数的问题。
参考:#2520 - [sql] [bug]
当它们直接引用绑定到 Table 的列对象(即不仅是字符串列名)并且引用一个且仅一个 Table 时,UniqueConstraint、ForeignKeyConstraint、CheckConstraint 和 PrimaryKeyConstraint 现在会自动附加到它们的父表上。在 0.8 之前,此行为仅适用于 UniqueConstraint 和 PrimaryKeyConstraint,而不适用于 ForeignKeyConstraint 或 CheckConstraint。
参考:#2410 - [sql] [bug]
TypeDecorator 现在默认包含一个基于“impl”类型的通用 repr()。对于指定了自定义 init 方法的那些 TypeDecorator 类,这是一种行为变更;这些类型将需要重新定义 repr(),如果需要 repr()提供一个忠实的构造函数表示。
参考:#2594 - [sql] [bug]
column.label(None)现在生成一个匿名标签,而不是返回列对象本身,这与 label(column, None)的行为一致。
参考:#2168 - [sql] [removed]
已删除了长期弃用且不起作用的create_engine()
和String
上的assert_unicode
标志。
postgresql
- [postgresql] [feature]
postgresql.ARRAY 具有一个可选的“dimension”参数,将为数组分配一个特定数量的维度,这将以 DDL 形式渲染为 ARRAY[][]…,还提高了绑定/结果处理的性能。
参考:#2441 - [postgresql] [feature]
postgresql.ARRAY 现在支持索引和切片。Python [] 运算符可用于所有类型为 ARRAY 的 SQL 表达式;可以传递整数或简单切片。这些切片也可以在 UPDATE 语句的 SET 子句中的赋值方面使用,通过将它们传递给 Update.values();请参阅文档以获取示例。 - [postgresql] [feature]
增加了新的“数组文字”构造 postgresql.array()。基本上是一个渲染为 ARRAY[1,2,3] 的“元组”。 - [postgresql] [feature]
增加了对 PostgreSQL ONLY 关键字的支持,该关键字可以在 SELECT、UPDATE 或 DELETE 语句中对应于表。该短语是使用 with_hint() 建立的。感谢 Ryan Kelly
参考:#2506 - [postgresql] [feature]PostgreSQL 方言的 “ischema_names” 字典是“非官方”可定制的。这意味着,诸如 PostGIS 类型之类的新类型可以添加到此字典中,并且 PG 类型反射代码应该能够处理具有不同数量参数的简单类型。这里的功能性是“非官方”的,原因有三:
- 这不是一个“官方”API。理想情况下,“官方”API 应该以一种通用的方式允许在方言或全局级别调用自定义类型处理可调用函数。
- 这仅在 PG 方言中实现,特别是因为 PG 对自定义类型有广泛支持,而其他数据库后端则不然。一个真正的 API 应该在默认方言级别实现。
- 这里的反射代码仅针对简单类型进行了测试,可能存在与更复杂类型相关的问题。
- 补丁由 Éric Lemoine 提供。
mysql
- [mysql] [feature]
在 mysql 方言中添加了 TIME 类型,接受“fst”参数,这是最近 MySQL 版本的新“分秒”指定符。数据类型将解释从驱动程序接收的微秒部分,但请注意,目前大多数/所有 MySQL DBAPI 不支持返回此值。
参考:#2534 - [mysql] [bug]
方言不再在首次连接时发出昂贵的服务器排序查询,以及服务器大小写查询。这些函数仍然作为半私有函数可用。
参考:#2404
sqlite
- [sqlite] [feature]
SQLite 的日期和时间类型已经进行了改进,以支持更开放的输入和输出格式,使用基于名称的格式字符串和正则表达式。一个新的参数“microseconds”还提供了省略时间戳的“微秒”部分的选项。感谢 Nathan Wright 在这方面的工作和测试。
参考:#2363 - [sqlite]
将NCHAR
、NVARCHAR
添加到 SQLite 方言识别的类型名称列表中以供反射使用。SQLite 返回给定类型的名称作为返回的名称。
参考:rc3addcc9ffad
mssql
- [mssql] [功能]
SQL Server 方言可以给出数据库限定的模式名称,即“schema=‘mydatabase.dbo’”;反射操作将检测到这一点,将模式分割在“.”之间以单独获取所有者,并在反射目标内部发出“USE mydatabase”语句;然后恢复从 DB_NAME()返回的现有数据库。 - [mssql] [功能]
更新了对 mxodbc 驱动程序的支持;建议使用 mxodbc 3.2.1 以实现完全兼容。 - [mssql] [错误]
删除了旧行为,即通过==将列与标量 SELECT 进行比较时,会将其强制转换为 SQL 服务器方言中的 IN。这是隐式行为,在其他情况下会失败,因此已删除。依赖于此行为的代码需要修改为显式使用 column.in_(select)。
参考:#2277
oracle
- [oracle] [功能]
可以通过将字符串 DBAPI 类型名称列表发送到 exclude_setinputsizes 方言参数来自定义从 setinputsizes()集中排除的列的类型。此列表以前是固定的。该列表现在默认为 STRING,UNICODE,从列表中删除了 CLOB,NCLOB。
参考:#2561 - [oracle] [错误]
当生成与 Column 具有 quote=True 的同名绑定参数时,现在会将引用信息传递给 bindparam()对象,就像在生成的 INSERT 和 UPDATE 语句中一样,以便完全支持未知的保留名称。
参考:#2437 - [oracle] [错误]
Oracle 中的 CreateIndex 构造现在将索引的名称模式限定为父表的名称。以前,此名称被省略,显然会在默认模式中创建索引,而不是表的模式。
杂项
- [功能] [access]
MS Access 方言已移至 Bitbucket 上的自己的项目,利用了新的 SQLAlchemy 方言兼容性套件。该方言仍处于非常初步的形式,可能尚未准备好供一般使用,但现在具有极其基本的功能。bitbucket.org/zzzeek/sqlalchemy-access
- [功能] [firebird]
“startswith()”运算符呈现为“STARTING WITH”,“~startswith()”呈现为“NOT STARTING WITH”,使用了 FB 更高效的运算符。
参考:#2470 - [功能] [firebird]
添加了一个用于 fdb 驱动程序的实验性方言,但由于无法构建 fdb 包,因此未经测试。
参考:#2504 - [错误] [firebird]
当尝试发出没有长度的 VARCHAR 时,会引发 CompileError,与 MySQL 相同。
参考:#2505 - [错误] [firebird]
Firebird 现在使用严格的“ansi 绑定规则”,这样绑定的参数不会在语句的列子句中呈现 - 它们会被字面呈现。 - [错误] [firebird]
当使用 DateTime 类型与 Firebird 时,支持将 datetime 作为 date 传递;其他方言也支持这一点。 - [移动] [maxdb]
MaxDB 方言,已经多年没有功能了,被移出到一个待定的 bitbucket 项目,bitbucket.org/zzzeek/sqlalchemy-maxdb
。