SqlAlchemy 2.0 中文文档(六十七)(3)https://developer.aliyun.com/article/1560841
0.6.3
发布日期:Thu Jul 15 2010
orm
- [orm]
在单元测试中移除了不必要的多对多加载,该加载在已过期/未加载的集合上不必要地触发。现在,仅当 passive_updates 为 False 且父级主键已更改,或者 passive_deletes 为 False 且已删除父级时,才执行此加载。
参考:#1845 - [orm]
列实体(即 query(Foo.id))在查询从自身派生的查询时更全面地复制其状态+可选择的(即 from_self()、union() 等),以便 join() 等从正确的状态开始工作。
参考:#1853 - [orm]
修复了 Query.join() 在查询非 ORM 列然后在已经存在 FROM 子句的情况下没有使用 on 子句进行连接时会失败的 bug,现在会像没有子句时一样引发一个经过检查的异常。
参考:#1853 - [orm]
改进了对“未映射类”的检查,包括超类已映射但子类未映射的情况。任何尝试访问 cls._sa_class_manager.mapper 现在都会引发 UnmappedClassError()。
参考:#1142 - [orm]
添加了“column_descriptions”访问器到 Query,返回一个包含查询将返回的实体的命名/类型信息的字典列表。对于在 ORM 查询之上构建 GUI 很有帮助。
mysql
- [mysql]
_extract_error_code() 方法现在可以正确地与每个 MySQL 方言(MySQL-python、OurSQL、MySQL-Connector-Python、PyODBC)一起工作。以前,重新连接逻辑会在 OperationalError 条件下失败,但由于 MySQLdb 和 OurSQL 有自己的重新连接功能,因此除非观察日志,否则这些驱动程序在这里没有任何症状。
参考:#1848
oracle
- [oracle]
对 cx_oracle Decimal 处理进行了更多微调。没有小数点的“模糊”数值在连接处理程序级别被强制转换为 int。这里的优势在于 ints 以 int 形式返回,而无需涉及 SQLA 类型对象,也无需先转换为 Decimal。
不幸的是,一些奇特的子查询情况甚至可能在单个结果行之间看到不同的类型,因此当 Numeric 处理程序被指示返回 Decimal 时,无法充分利用“本机十进制”模式,必须对每个值运行 isinstance() 来检查其否已经是 Decimal。重新打开
参考:#1840
orm
- [orm]
在 unitofwork 中删除了错误的多对多加载,这会在过期/未加载的集合上不必要地触发。现在,只有在 passive_updates 为 False 且父主键已更改,或者 passive_deletes 为 False 且父项已删除时,才会进行此加载。
参考:#1845 - [orm]
Column-entities(即 query(Foo.id))在从自身派生的查询(即 from_self()、union() 等)中更全面地复制其状态,以便 join() 等操作可以正确地进行。
参考:#1853 - [orm]
修复了 Query.join() 在查询非 ORM 列然后在已经存在 FROM 子句的情况下没有 on 子句进行连接时会失败的 bug,现在会像没有子句时一样引发一个经过检查的异常。
参考:#1853 - [orm]
改进了对“未映射类”的检查,包括超类已映射但子类未映射的情况。任何尝试访问 cls._sa_class_manager.mapper 现在都会引发 UnmappedClassError()。
参考:#1142 - [orm]
向 Query 添加了 “column_descriptions” 访问器,返回一个包含查询将返回的实体的命名/类型信息的字典列表。对于在 ORM 查询之上构建 GUI 非常有帮助。
mysql
- [mysql]
_extract_error_code() 方法现在可以正确地与每个 MySQL 方言(MySQL-python、OurSQL、MySQL-Connector-Python、PyODBC)一起工作。以前,重新连接逻辑会在 OperationalError 条件下失败,但由于 MySQLdb 和 OurSQL 有自己的重新连接功能,因此除非观察日志,否则这些驱动程序在这里没有任何症状。
参考:#1848
oracle
- [oracle]
对 cx_oracle Decimal 处理进行了更多调整。没有小数点的“模糊”数值在连接处理程序级别被强制转换为 int。这里的优势在于 ints 会作为 ints 返回,而不涉及 SQLA 类型对象,也不会不必要地先转换为 Decimal。
不幸的是,一些奇特的子查询情况甚至可能在单个结果行之间看到不同的类型,因此当 Numeric 处理程序被指示返回 Decimal 时,无法充分利用“本地十进制”模式,必须对每个值运行 isinstance() 来检查它是否已经是 Decimal。重新打开
参考:#1840
0.6.2
发布日期:Tue Jul 06 2010
orm
- [orm]
Query.join() 将检查是否调用了 query.join(target, clause_expression) 形式的调用,即缺少元组,并提出信息性错误消息,说明这是错误的调用形式。 - [orm]
修复了关于自引用双向多对多关系刷新的 bug,在一个刷新中使两个对象相互引用会导致两侧都无法插入行。从 0.5 开始的回归。
参考:#1824 - [orm]
relationship() 的 post_update 功能在架构上进行了重新设计,以更紧密地与新的 0.6 工作单元集成。更改的动机是,多个影响同一行的不同外键列的“post update”调用将在单个 UPDATE 语句中执行,而不是每列每行一个 UPDATE 语句。多行更新也尽可能批量执行,同时保持一致的行顺序。 - [orm]
Query.statement, Query.subquery(), 等现在会将绑定参数的值,即由 query.params() 指定的值,传递到生成的 SQL 表达式中。以前这些值不会被传递,绑定参数会变成 None。 - [orm]
现在子查询预加载可以与包括 params() 的 Query 对象一起工作,以及 get() 查询。 - [orm]
现在可以在被父对象通过多对一引用的实例上调用 make_transient(),而不会暂时将父对象的外键值设置为 None - 这是“检测主键切换”刷新处理程序的功能。它现在会忽略不再处于“持久”状态的对象,父对象的外键标识符也不受影响。 - [orm]
query.order_by() 现在接受 False,这会取消 Query 上任何现有的 order_by() 状态,允许调用后续不支持 ORDER BY 的生成方法。这与已经存在的传递 None 的功能不同,后者会抑制任何现有的 order_by() 设置,包括在映射器上配置的设置。False 会使 order_by() 就好像从未调用过一样,而 None 是一个活跃的设置。 - [orm]
当一个被移至“瞬态”状态的实例具有不完整或缺失的主键属性集,并且包含过期属性时,如果访问了一个过期属性,将会引发 InvalidRequestError,而不是递归溢出。 - [orm]
make_transient() 函数现在在生成的文档中。 - [orm]
make_transient() 会将所有“loader”可调用函数从被设置为瞬态的状态中移除,将任何“过期”状态重置为未定义的、None/空值。
sql
- [sql]
当 convert_unicode=True 时,Unicode 和 String 类型发出的警告不再嵌入传递的实际值。这样做是为了避免 Python 警告注册表继续增长,警告根据警告过滤器设置只发出一次,并且大字符串值不会污染输出。
参考:#1822 - [sql]
修复了一个 bug,该 bug 会阻止对“带注”的表达式元素进行重写子句编译,这些表达式元素通常由 ORM 生成。 - [sql]
LIKE 操作符或类似操作符的“ESCAPE”参数会通过 render_literal_value() 进行处理,该函数可能会实现反斜杠的转义。
参考:#1400 - [sql]
修复了 Enum 类型的一个 bug,当与 TypeDecorators 或其他适配场景一起使用时,会破坏 native_enum 标志。 - [sql]
当 Inspector 被调用时,会调用 bind.connect() 来确保 initialize 已被调用。内部名称“.conn”被更改为“.bind”,因为那才是它的实际名称。 - [sql]
修改了“列注释”的内部机制,使得自定义 Column 子类可以安全地重写 _constructor 返回 Column,用于创建不涉及代理等的“配置”列类。 - [sql]
Column.copy() 包括“unique”属性在内,修复了关于声明性 mixin 的问题
参考:#1829
postgresql
- [postgresql]
render_literal_value() 被重写以转义反斜杠,目前适用于 LIKE 和类似表达式的 ESCAPE 子句。最终,这将需要检测“standard_conforming_strings”的值以实现完整的行为。
参考:#1400 - [postgresql]
如果在 PG 版本低于 8.3 上使用 types.Enum,则不会生成“CREATE TYPE” / “DROP TYPE” - supports_native_enum 标志将被完全遵守。
参考:#1836
mysql
- [mysql]
MySQL 方言在检测到 MySQL 版本小于 4.0.2 时不会发出 CAST()。这允许在连接时进行 unicode 检查。
参考:#1826 - [mysql]
MySQL 方言现在检测到 NO_BACKSLASH_ESCAPES sql 模式,除了 ANSI_QUOTES。 - [mysql]
覆盖了 render_literal_value(),它会转义反斜杠,目前适用于 LIKE 和类似表达式的 ESCAPE 子句。��行为源自检测 NO_BACKSLASH_ESCAPES 的值。
参考:#1400
mssql
- [mssql]
如果 server_version_info 超出通常范围(8, )、(9, )、(10, ),则会发出警告,建议检查 FreeTDS 版本配置是否使用 7.0 或 8.0,而不是 4.2。
参考:#1825
oracle
- [oracle]
修复了 ora-8 兼容性标志,使其不会缓存在第一次数据库连接之前的过时值。
参考:#1819 - [oracle]
当列嵌入子查询时,Oracle 的“本地十进制”元数据开始返回关于数值的模糊类型信息,以及当在子查询中查询 ROWNUM 时,我们用于 limit/offset 时。我们已将这些模糊条件添加到 cx_oracle 的“转换为 Decimal()”处理程序中,以便在更多情况下将数值作为 Decimal 而不是浮点数接收。然后,如果需要,将其转换为 Integer 或 Float,否则保留为无损 Decimal。
参考:#1840
杂项
- [firebird]
修复了 do_execute() 中的错误签名,该错误在 0.6.1 中引入。
参考:#1823 - [firebird]
Firebird 方言添加了接受“charset”标志的 CHAR、VARCHAR 类型,以支持 Firebird 的“CHARACTER SET”子句。
参考:#1813 - [声明式]
添加了对 @classproperty 的支持,以从声明性混合中提供任何类型的模式/映射构造,包括具有外键、关系、column_property、deferred 的列。如果在混合中指定任何 MapperProperty 子类而不使用 @classproperty,则会引发错误。
参考:#1751, #1796, #1805 - [声明式]
现在,一个混合类可以定义一个与子类上定义的 table 上存在的列匹配的列。但是,它不能定义一个在 table 中不存在的列,现在的错误消息可以正常工作。
参考:#1821 - [编译器] [扩展]
当覆盖内置子句构造的编译时,“default”编译器会自动复制过去,因此如果调用不同后端的编译,不会引发 KeyError。
参考:#1838 - [文档]
为 Inspector 添加了文档。
参考:#1820 - [文档]
修复了@memoized_property 和@memoized_instancemethod 装饰器,以便 Sphinx 文档捕获这些属性和方法,例如 ResultProxy.inserted_primary_key。
参考:#1830
orm
- [orm]
Query.join()将检查是否调用了 query.join(target, clause_expression)形式的调用,即缺少元组,并引发一个信息性错误消息,说明这是错误的调用形式。 - [orm]
修复了关于自引用双向多对多关系刷新的错误,其中在一个刷新中使两个对象相互引用将无法为双方插入行。从 0.5 版本开始的回归。
参考:#1824 - [orm]
relationship()的 post_update 功能在架构上进行了重新设计,以更紧密地与新的 0.6 工作单元集成。更改的动机是,多个影响同一行的不同外键列的“post update”调用将在单个 UPDATE 语句中执行,而不是每列每行一个 UPDATE 语句。多行更新也尽可能批量处理为 executemany(),同时保持一致的行顺序。 - [orm]
Query.statement,Query.subquery()等现在将绑定参数的值,即由 query.params()指定的值,传输到生成的 SQL 表达式中。以前,这些值不会被传输,绑定参数将变为 None。 - [orm]
子查询预加载现在可以与包括 params()的 Query 对象一起工作,以及 get()查询。 - [orm]
现在可以在通过多对一引用的父对象引用的实例上调用 make_transient(),而不会将父对象的外键值临时设置为 None - 这是“检测主键切换”刷新处理程序的功能。现在它会忽略不再处于“持久”状态的对象,并且父对象的外键标识符不受影响。 - [orm]
query.order_by()现在接受 False,取消 Query 上的任何现有 order_by()状态,允许调用不支持 ORDER BY 的后续生成方法。这与已存在的传递 None 的功能不同,后者会抑制任何现有的 order_by()设置,包括在映射器上配置的设置。False 将使 order_by()好像从未被调用过,而 None 是一个活动设置。 - [orm]
将移至“瞬态”状态的实例,具有不完整或缺失的主键属性集,并包含已过期属性,如果访问了已过期属性,将引发 InvalidRequestError,而不是出现递归溢出。 - [orm]
make_transient()函数现在在生成的文档中。 - [orm]
make_transient()从被转换为瞬态状态的状态中删除所有“加载器”可调用项,删除任何“过期”状态 - 所有未加载的属性在访问时重置为未定义,None/空。
sql
- [sql]
当 convert_unicode=True 时,Unicode 和 String 类型发出的警告不再嵌入传递的实际值。这样做是为了防止 Python 警告注册表继续增长,根据警告过滤器设置,警告只发出一次,并且大字符串值不会污染输出。
引用:#1822 - [sql]
修复了一个错误,该错误会阻止“annotated”表达式元素的覆盖子句编译正常工作,这些元素通常由 ORM 生成。 - [sql]
LIKE 运算符或类似的“ESCAPE”的参数通过 render_literal_value()传递,该函数可能会实现反斜杠的转义。
引用:#1400 - [sql]
Enum 类型中的错误修复了当与 TypeDecorators 或其他适配场景一起使用时会取消 native_enum 标志的情况。 - [sql]
当调用 Inspector 时,确保 initialize 已被调用。内部名称“.conn”更改为“.bind”,因为这就是它的名称。 - [sql]
修改了“列注释”的内部,使得自定义的 Column 子类可以安全地覆盖 _constructor 返回 Column,用于创建“配置型”列类,这些类不涉及代理等。 - [sql]
Column.copy()在其他属性中带有“unique”属性,修复有关声明性混合的问题
引用:#1829
postgresql
- [postgresql]
render_literal_value()被覆盖,其转义反斜杠,当前适用于 LIKE 及类似表达式的 ESCAPE 子句。最终这将需要检测“standard_conforming_strings”的值以实现完整的行为。
引用:#1400 - [postgresql]
如果在 8.3 之前的 PG 版本上使用 types.Enum,则不会生成“CREATE TYPE”/“DROP TYPE” - supports_native_enum 标志完全受到尊重。
引用:#1836
mysql
- [mysql]
MySQL 方言不会为检测到的 MySQL 版本< 4.0.2 发出 CAST()。这允许在连接时进行 unicode 检查。
引用:#1826 - [mysql]
MySQL 方言现在检测到 NO_BACKSLASH_ESCAPES sql 模式,除了 ANSI_QUOTES 之外。 - [mysql]
render_literal_value()被覆盖,其转义反斜杠,当前适用于 LIKE 及类似表达式的 ESCAPE 子句。此行为源自检测 NO_BACKSLASH_ESCAPES 的值。
引用:#1400
mssql
- [mssql]
如果 server_version_info 在常规范围之外(8,),(9,),(10,),则会发出警告,建议检查 FreeTDS 版本配置是否使用 7.0 或 8.0,而不是 4.2。
引用:#1825
oracle
- [oracle]
修复了 ora-8 兼容性标志,使其不会缓存第一个数据库连接实际发生之前的过时值。
参考:#1819 - [oracle]
当列嵌入子查询时,Oracle 的“本机小数”元数据开始返回关于数值的模糊类型信息,以及当子查询中咨询 ROWNUM 时,我们对于 limit/offset 所做的情况。我们已将这些模糊条件添加到 cx_oracle 的“转换为 Decimal()”处理程序中,以便我们在更多情况下将数值作为 Decimal 而不是作为浮点数接收。然后,如果请求,将其转换为 Integer 或 Float,否则保留为无损 Decimal。
参考:#1840
杂项
- [firebird]
修复了 do_execute() 中的错误签名,这是在 0.6.1 中引入的错误。
参考:#1823 - [firebird]
Firebird 方言添加了 CHAR、VARCHAR 类型,它们接受一个“charset”标志,以支持 Firebird 的“CHARACTER SET”子句。
参考:#1813 - [声明式]
添加了对 @classproperty 的支持,以从声明式混合中提供任何类型的模式/映射构造,包括具有外键、关系、column_property、deferred 的列。如果在混合中指定任何 MapperProperty 子类而不使用 @classproperty,则会引发错误。
参考:#1751, #1796, #1805 - [声明式]
现在一个混合类可以定义一个与子类上定义的 table 上存在的列相匹配的列。但是,它不能定义一个在 table 中不存在的列,这里的错误消息现在可以工作。
参考:#1821 - [编译器] [扩展]
当覆盖内置子句结构的编译时,默认编译器会自动复制过来,因此如果用户定义的编译器特定于某些后端,并且为不同后端调用了编译,就不会引发 KeyError。
参考:#1838 - [文档]
添加了 Inspector 的文档。
参考:#1820 - [文档]
修复了 @memoized_property 和 @memoized_instancemethod 装饰器,使 Sphinx 文档能够捕获这些属性和方法,例如 ResultProxy.inserted_primary_key。
参考:#1830
0.6.1
发布日期:2010 年 5 月 31 日(星期一)
orm
- [orm]
修复了 0.6.0 中引入的关于可变属性不正确历史记录的回归。
参考:#1782 - [orm]
修复了在 0.6.0 工作单元重构中引入的回归问题,导致带有 post_update=True 的双向 relationship() 更新失败。
参考:#1807 - [orm]
session.merge() 不会使返回的实例上的属性过期,如果该实例处于 “pending” 状态。
参考:#1789 - [orm]
修复了 CollectionAdapter 的 setstate 方法,在父 InstanceState 尚未反序列化时不会失败。
参考:#1802 - [orm]
在实例没有完整主键的情况下,如果发生过期并且被要求刷新,则会添加内部警告。
参考:#1797 - [orm]
对映射器在使用 UPDATE、INSERT 和 DELETE 表达式时进行了更积极的缓存。假设语句没有附加到每个对象的 SQL 表达式,那么在第一次创建后,映射器会将表达式对象缓存,并将其编译形式持久存储在与相关 Engine 相关联的缓存字典中。对于极少数情况下,如果映射器接收到极高数量的不同列模式作为 UPDATE,缓存将是一个 LRUCache。
sql
- [sql]
expr.in_() 现在接受 text() 结构作为参数。自动添加了分组括号,即使用方式类似于 col.in_(text(“select id from table”))。
参考:#1793 - [sql]
_Binary 类型的列(即 LargeBinary、BLOB 等)也会将右侧的 “basestring” 强制转换为 _Binary,以便进行必要的 DBAPI 处理。 - [sql]
添加了 table.add_is_dependent_on(othertable),允许手动在两个 Table 对象之间放置依赖规则,供 create_all()、drop_all()、sorted_tables 使用。
参考:#1801 - [sql]
修复了阻止具有包含零的复合主键的隐式 RETURNING 正常运行的错误。
参考:#1778 - [sql]
修复了生成具有命名 UNIQUE 约束的 ADD CONSTRAINT 时错误的空格字符。 - [sql]
修复了 ForeignKeyConstraint 构造函数中 “table” 参数的问题。
参考:#1571 - [sql]
修复了连接池游标包装器中的错误,即如果游标在 close() 时抛出异常,则消息的记录将失败。
参考:#1786 - [sql]
ColumnClause 和 Column 的 _make_proxy() 方法现在使用 self.class 来确定要返回的对象类,而不是硬编码到 ColumnClause/Column,这使得更容易生成在别名/子查询情况下工作的特定子类。 - [sql]
func.XXX() 不会意外解析为非函数类(例如修复了 func.text())。
参考:#1798
mysql
- [mysql]
func.sysdate() 在 MySQL 上发出“SYSDATE()”,即带有结尾括号。
参考:#1794
sqlite
- [sqlite]
修复了在 SQLite AUTOINCREMENT 关键字被渲染时,将“PRIMARY KEY”约束移动到列级别时约束的连接。
参考:#1812
oracle
- [oracle]
添加了对低于 5 版本的 cx_oracle 的检查,在这种情况下,不兼容的“输出类型处理程序”将不会被使用。这将影响小数精度和一些 Unicode 处理问题。
参考:#1775 - [oracle]
修复了 use_ansi=False 模式,该模式在几乎所有情况下都会产生损坏的 WHERE 子句。
参考:#1790 - [oracle]
重新建立了对 Oracle 8 的 cx_oracle 支持,包括将 use_ansi 自动设置为 False,不为 Unicode 渲染 NVARCHAR2 和 NCLOB,不会导致“本地 Unicode”检查失败,禁用 cx_oracle 的“本地 Unicode”模式,以字节计数形式发出 VARCHAR()。
参考:#1808 - [oracle]
在正常的 Python 2.x 模式下,oracle_xe 5 不接受 Python unicode 对象作为其连接字符串 - 因此我们直接将其强制转换为 str()。由于我们不知道可以使用的编码,因此这里的连接字符串不支持非 ASCII 字符。
参考:#1670 - [oracle]
当使用 limit/offset 时,在语法上正确的位置发出 FOR UPDATE,即 ROWNUM 子查询。但是,Oracle 实际上无法处理带有 ORDER BY 或子查询的 FOR UPDATE,因此它仍然无法使用,但至少 SQLA 可以将 SQL 传递给 Oracle 解析器。
参考:#1815
misc
- [engines]
修复了在 Python 2.4 上构建 C 扩展的问题。
参考:#1781 - [engines]
在 dispose()发生后,池类将重用相同的“pool_logging_name”设置。 - [engines]
Engine 增加了一个“execution_options”参数和 update_execution_options()方法,将应用于此引擎生成的所有连接。 - [firebird]
在 has_table() 和 has_sequence() 中使用的查询中添加了一个标签,以适应不提供结果列标签的旧版本 Firebird。
参考:#1521 - [firebird]
当通过查询字符串传递时,将整数强制转换为“type_conv”属性,以便 Kinterbasdb 正确解释它。
参考:#1779 - [firebird]
将“连接关闭”添加到指示连接中断的异常字符串列表中。
参考:#1646 - [sqlsoup]
SqlSoup 构造函数接受一个 base 参数,该参数指定用于映射类的基类,默认为 object。
参考:#1783
orm
- [orm]
修复了在 0.6.0 版本中引入的涉及可变属性不正确历史记录的回归问题。
参考:#1782 - [orm]
修复了在 0.6.0 版本中引入的回归问题,该问题破坏了具有 post_update=True 的双向 relationship()的更新。
参考:#1807 - [orm]
��果返回的实例是“pending”,session.merge()将不会使实例上的属性过期。
参考:#1789 - [orm]
修复了 CollectionAdapter 的 setstate 方法,在反序列化时不会因为父 InstanceState 尚未反序列化而失败。
参考:#1802 - [orm]
在实例没有完整主键的情况下,如果实例被过期并要求刷新,则会添加内部警告。
参考:#1797 - [orm]
对 mapper 在使用 UPDATE、INSERT 和 DELETE 表达式时进行了更积极的缓存。假设语句没有附加到每个对象的 SQL 表达式,那么在第一次创建后,mapper 会将表达式对象缓存,并且它们的编译形式将持久地存储在与相关 Engine 相关的缓存字典中。缓存是一个 LRUCache,用于极少数情况下 mapper 接收到极高数量的不同列模式作为 UPDATE。
sql
- [sql]
expr.in_()现在接受一个 text()构造作为参数。自动添加分组括号,即使用方式类似于 col.in_(text(“select id from table”)).
参考:#1793 - [sql]
_Binary 类型的列(即 LargeBinary、BLOB 等)将右侧的“basestring”强制转换为 _Binary,以便进行必要的 DBAPI 处理。 - [sql]
添加了 table.add_is_dependent_on(othertable),允许在 create_all()、drop_all()、sorted_tables 中手动设置两个 Table 对象之间的依赖规则。
参考:#1801 - [sql]
修复了阻止具有包含零的复合主键的隐式 RETURNING 正常运行的错误。
参考:#1778 - [sql]
修复了为命名 UNIQUE 约束生成 ADD CONSTRAINT 时生成的额外空格字符。 - [sql]
修复了 ForeignKeyConstraint 构造函数上的“table”参数。
参考:#1571 - [sql]
修复了连接池游标包装器中的错误,即如果游标在 close()时抛出异常,则消息的记录将失败。
参考:#1786 - [sql]
ColumnClause 和 Column 的 _make_proxy() 方法现在使用 self.class 来确定要返回的对象类,而不是硬编码为 ColumnClause/Column,这使得在别名/子查询情况下更容易生成特定的子类。 - [sql]
func.XXX() 不会错误地解析为非 Function 类(例如修复了 func.text())。
参考:#1798
mysql
- [mysql]
func.sysdate() 在 MySQL 上发出“SYSDATE()”,即带有结束括号。
参考:#1794
sqlite
- [sqlite]
修复了当“PRIMARY KEY”约束由于 SQLite AUTOINCREMENT 关键字被渲染而移动到列级别时的约束连接。
参考:#1812
oracle
- [oracle]
添加了一个检查,用于低于版本 5 的 cx_oracle 版本,如果是这种情况,则不会使用不兼容的“output type handler”。这将影响十进制精度和一些 Unicode 处理问题。
参考:#1775 - [oracle]
修复了 use_ansi=False 模式,在几乎所有情况下都会产生错误的 WHERE 子句。
参考:#1790 - [oracle]
重新建立了对 Oracle 8 的 cx_oracle 支持,包括自动将 use_ansi 设置为 False,对 Unicode 不渲染 NVARCHAR2 和 NCLOB,不会因为“native unicode”检查失败,禁用 cx_oracle 的“native unicode”模式,用字节计数而不是字符计数发出 VARCHAR()。
参考:#1808 - [oracle]
在正常的 Python 2.x 模式下,oracle_xe 5 不接受 Python unicode 对象作为其连接字符串 - 因此我们直接强制转换为 str()。这里不支持连接字符串中的非 ASCII 字符,因为我们不知道可以使用什么编码。
参考:#1670 - [oracle]
当使用 limit/offset 时,FOR UPDATE 被放置在语法正确的位置,即 ROWNUM 子查询。然而,Oracle 实际上无法处理带有 ORDER BY 或子查询的 FOR UPDATE,因此仍然不太可用,但至少 SQLA 能够将 SQL 传递给 Oracle 解析器。
参考:#1815
misc
- [engines]
修复了在 Python 2.4 上构建 C 扩展的问题。
参考:#1781 - [engines]
在 dispose() 发生后,Pool 类将重用相同的“pool_logging_name”设置。 - [engines]
Engine 增加了“execution_options”参数和 update_execution_options()方法,将应用于此 engine 生成的所有连接。 - [firebird]
在 has_table() 和 has_sequence() 中使用的查询添加了一个标签,以便与不提供结果列标签的旧版本 Firebird 一起使用。
参考:#1521 - [firebird]
在通过查询字符串传递“type_conv”属性时,添加了整数强制转换,以便 Kinterbasdb 正确解释它。
参考:#1779 - [firebird]
将“连接关闭”添加到指示连接中断的异常字符串列表中。
参考:#1646 - [sqlsoup]
SqlSoup 构造函数接受一个 base 参数,该参数指定用于映射类的基类,默认为 object。
参考:#1783
0.6.0
发布日期:2010 年 4 月 18 日星期日
orm
- [orm]
工作单元内部已经重写。具有大量相互依赖对象的工作单元现在可以在没有递归溢出的情况下刷新,因为不再依赖递归调用。对于特定会话状态,内部结构的数量现在保持恒定,无论映射上存在多少关系。事件流现在对应于由映射器和基于实际工作的关系生成的线性步骤列表,通过单个拓扑排序进行正确排序。刷新操作使用更少的步骤和更少的内存进行组装。
参考:#1081,#1742 - [orm]
除了 UOW 重写之外,这还解决了 0.6beta3 中关于具有长依赖循环的工作单元的拓扑循环检测的问题。我们现在使用 Guido 编写的算法(感谢 Guido!)。 - [orm]
一对多关系现在在刷新时维护一个正的父子关联列表,防止之前标记为已删除的父项对这些子对象进行级联删除或设置为 NULL 外键,尽管最终用户没有从旧关联中移除子项。
参考:#1764 - [orm]
集合的延迟加载将关闭反向的多对一端的默认急加载,因为根据定义,该加载是不必要的。
参考:#1495 - [orm]
Session.refresh()现在首先对给定实例执行等效的 expire(),以便“refresh-expire”级联被传播。以前,refresh()不受“refresh-expire”级联的影响。这是与 0.6beta2 的行为不同之处,其中传递给 refresh()的“lockmode”标志会导致版本检查发生。由于实例首先被过期,refresh()总是将对象升级到最新版本。 - [orm]
“refresh-expire”级联在到达挂起对象时,如果级联还包括“delete-orphan”,则会将对象清除;否则,将简单地分离它。
参考:#1754 - [orm]
在 topological.py 中不再内部使用 id(obj),因为排序函数现在仅需要可哈希对象。
参考:#1756 - [orm]
ORM 现在默认将所有生成的描述符的文档字符串设置为 None。可以使用‘doc’进行覆盖(或者如果使用 Sphinx,属性文档字符串也可以)。 - [orm]
对所有映射器属性可调用的 Column()添加了 kw 参数‘doc’。将字符串‘doc’组装为描述符上的‘doc’属性。 - [orm]
在支持 cursor.rowcount 执行()但不支持 executemany()的后端上,现在在发出删除时可以使用 version_id_col(已经适用于保存,因为这些不使用 executemany())。对于根本不支持 cursor.rowcount 的后端,会发出与保存相同的警告。
参考:#1761 - [orm]
当刷新所有同一类对象列表时,ORM 现在会短期缓存 insert()和 update()构造的“编译”形式,从而避免在单个 flush()调用中每个 INSERT/UPDATE 都进行冗余编译。 - [orm]
ColumnProperty、CompositeProperty、RelationshipProperty 上的内部 getattr()、setattr()、getcommitted()方法已被下划线标记(即为私有),签名已更改。
示例
- [examples]
更新了 attribute_shard.py 示例,使用更健壮的方法搜索 Query,比较列与文字值的二进制表达式。
sql
- [sql]
从 0.5 版本中恢复了一些绑定标签逻辑,确保具有与另一列重叠的列名的表,如“_”,在 UPDATE 期间使用 column._label 作为绑定名称时不会产生错误。添加了 0.5 版本中不存在的测试覆盖率。
参考:#1755 - [sql]
somejoin.select(fold_equivalents=True)不再被弃用,并最终将被整合到更全面的功能版本中。
参考:#1729 - [sql]
当 Numeric 类型预期将浮点数转换为来自返回浮点数的 DBAPI 的 Decimal 时,会引发巨大警告。这包括 SQLite、Sybase、MS-SQL。
参考:#1759 - [sql]
修复了表达式类型化中的错误,导致具有两个 NULL 类型的表达式出现无限循环。 - [sql]
修复了 execution_options()功能中的错误,即父连接中现有的事务和其他状态信息不会传播到子连接。 - [sql]
添加了新的‘compiled_cache’执行选项。一个字典,在 Connection 将一个子句表达式编译成特定于方言和参数的 Compiled 对象时,Compiled 对象将被缓存。用户有责任管理这个字典的大小,它将具有对应于方言、子句元素、INSERT 或 UPDATE 语句的 VALUES 或 SET 子句中的列名称,以及 INSERT 或 UPDATE 语句的“批量”模式的键。 - [sql]
添加了 get_pk_constraint()到 reflection.Inspector,类似于 get_primary_keys(),但返回一个包括约束名称的字典,用于支持的后端(目前为 PG)。
参考:#1769 - [sql]
Table.create()和 Table.drop()不再应用于元数据级别的创建/删除事件。
参考:#1771
postgresql
- [postgresql]
现在,当序列的名称更改后,PostgreSQL 会正确地反映与 SERIAL 列关联的序列名称。感谢 Kumar McMillan 提供的补丁。
参考:#1071 - [postgresql]
修复了在接收到未知数字时,psycopg2._PGNumeric 类型中缺少的导入。 - [postgresql]
psycopg2/pg8000 方言现在知道 REAL[]、FLOAT[]、DOUBLE_PRECISION[]、NUMERIC[]返回类型,而不会引发异常。 - [postgresql]
如果存在,则 PostgreSQL 反映主键约束的名称。
参考:#1769
oracle
- [oracle]
现在使用 cx_oracle 输出转换器,以便 DBAPI 原生返回我们喜欢的值类型: - [oracle]
具有正精度+标度的 NUMBER 值将转换为 cx_oracle.STRING,然后转换为 Decimal。这样在使用 cx_oracle 时,Numeric 类型可以完美精确。
参考:#1759 - [oracle]
STRING/FIXED_CHAR 现在本地转换为 unicode。因此,SQLAlchemy 的 String 类型不需要应用任何类型的转换。
杂项
- [engines]
现在 C 扩展还适用于使用自定义序列作为行(而不仅仅是元组)的 DBAPI。
参考:#1757 - [ext]
编译器扩展现在允许在扩展到子类的基类上使用@compiles 装饰器,在子类上使用@compiles 装饰器不会被基类上的@compiles 装饰器破坏。 - [ext]
如果在基于字符串的 relationship()参数中引用了非映射类属性,Declarative 将引发信息性错误消息。 - [ext]
进一步重新设计了 Declarative 中的“mixin”逻辑,以允许 mapper_args 作为 mixin 上的@classproperty,例如动态分配 polymorphic_identity。 - [firebird]
在每个引擎上可以通过在 create_engine() 上设置 ‘enable_rowcount=False’ 来禁用 result.rowcount 的功能。通常,在任何 UPDATE 或 DELETE 语句之后无条件地调用 cursor.rowcount,因为然后游标被关闭,而 Firebird 需要一个打开的游标才能获得行数。然而,这个调用稍微昂贵,所以可以禁用它。要在每个执行基础上重新启用,可以使用 ‘enable_rowcount=True’ 执行选项。
orm
- [orm]
工作单元内部已被重写。具有大量相互依赖对象的工作单元现在可以在没有递归溢出的情况下刷新,因为不再依赖于递归调用。对于特定的会话状态,内部结构的数量现在保持不变,无论映射上存在多少关系。事件的流现在对应于由映射器和基于实际工作的关系生成的线性步骤列表,通过单个拓扑排序进行正确排序。刷新操作使用更少的步骤和更少的内存进行组装。
参考:#1081, #1742 - [orm]
伴随 UOW 重写,这还解决了在 0.6beta3 中引入的有关拓扑循环检测的问题,针对具有长依赖循环的工作单元。我们现在使用由 Guido 编写的算法(感谢 Guido!)。 - [orm]
一对多关系现在在刷新期间维护一个正父子关联的列表,防止以前标记为已删除的父项从级联删除或将空外键集设置在这些子对象上,尽管最终用户没有从旧关联中删除子项。
参考:#1764 - [orm]
集合的延迟加载将关闭反向的多对一端上的默认急加载,因为该加载从定义上来说是不必要的。
参考:#1495 - [orm]
现在,Session.refresh() 首先对给定的实例执行等效的 expire(),以便“refresh-expire”级联被传播。之前,refresh() 在任何方式上都不受“refresh-expire”级联的影响。这与 0.6beta2 的行为不同,在那里传递给 refresh() 的“lockmode”标志会导致版本检查发生。由于实例首先过期,因此 refresh() 总是将对象升级到最新版本。 - [orm]
当“refresh-expire”级联到达挂起的对象时,如果级联还包括“delete-orphan”,则将清除该对象;否则,将简单地分离它。
参考:#1754 - [orm]
id(obj) 不再在 topological.py 内部使用,因为排序函数现在仅需要可哈希对象。
参考:#1756 - [orm]
ORM 现在默认将所有生成的描述符的文档字符串设置为 None。可以使用‘doc’进行覆盖(或者如果使用 Sphinx,则属性文档字符串也有效)。 - [ORM]
对所有 mapper 属性可调用对象以及 Column()添加了 kw 参数‘doc’。将字符串‘doc’组装为描述符的‘doc’属性。 - [ORM]
在支持 cursor.rowcount 用于 execute()但不支持 executemany()的后端上,现在在发出删除时使用 version_id_col 可以正常工作(对于保存已经可以正常工作,因为它们不使用 executemany())。对于根本不支持 cursor.rowcount 的后端,与保存一样会发出警告。
参考:#1761 - [ORM]
当刷新相同类别对象列表时,ORM 现在会短期缓存 insert()和 update()构造的“编译”形式,从而避免在单个 flush()调用中每个 INSERT/UPDATE 都进行冗余编译。 - [ORM]
ColumnProperty、CompositeProperty、RelationshipProperty 上的内部 getattr()、setattr()、getcommitted()方法已被下划线标记(即为私有),签名已更改。
示例
- [示例]
更新了 attribute_shard.py 示例,以使用更健壮的方法搜索 Query,该方法将列与文字值进行比较。
sql
- [sql]
从 0.5 版本中恢复了一些绑定标签逻辑,确保具有与另一列重叠的列名的表在 UPDATE 期间使用 column._label 作为绑定名称时不会产生错误。已添加 0.5 中不存在的测试覆盖率。
参考:#1755 - [sql]
somejoin.select(fold_equivalents=True)不再被弃用,并最终将被合并到更全面的功能版本中。
参考:#1729 - [sql]
当 Numeric 类型预期将浮点数转换为 Decimal 时,如果来自返回浮点数的 DBAPI(包括 SQLite、Sybase、MS-SQL)会引发巨大警告。
参考:#1759 - [sql]
修复了表达式类型化中的错误,该错误导致具有两个 NULL 类型的表达式陷入无限循环。 - [sql]
修复了 execution_options()功能中的错误,该错误导致父连接中的现有事务和其他状态信息无法传播到子连接。 - [sql]
添加了新的‘compiled_cache’执行选项。一个字典,当 Connection 将一个子句表达式编译成特定于方言和参数的 Compiled 对象时,Compiled 对象将被缓存。用户有责任管理这个字典的大小,它将具有与方言、子句元素、INSERT 或 UPDATE 的 VALUES 或 SET 子句中的列名以及 INSERT 或 UPDATE 语句的“batch”模式相对应的键。 - [sql]
在 reflection.Inspector 中添加了 get_pk_constraint(),类似于 get_primary_keys(),但返回一个包含约束名称的字典,适用于支持的后端(目前仅支持 PG)。
参考:#1769 - [sql]
Table.create() 和 Table.drop() 不再应用于元数据级别的创建/删除事件。
参考:#1771
postgresql
- [postgresql]
PostgreSQL 现在正确反映了与 SERIAL 列关联的序列名称,序列名称已更改后。感谢 Kumar McMillan 提交的补丁。
参考:#1071 - [postgresql]
修复了在接收到未知数字时 psycopg2._PGNumeric 类型中缺少的导入。 - [postgresql]
psycopg2/pg8000 方言现在能够识别 REAL[]、FLOAT[]、DOUBLE_PRECISION[]、NUMERIC[] 返回类型,而不会引发异常。 - [postgresql]
如果存在主键约束,PostgreSQL 将反映主键约束的名称。
参考:#1769
oracle
- [oracle]
现在使用 cx_oracle 输出转换器,以便 DBAPI 本地返回我们更喜欢的值类型: - [oracle]
具有正精度 + 标度的 NUMBER 值转换为 cx_oracle.STRING,然后转换为 Decimal。这允许在使用 cx_oracle 时 Numeric 类型具有完美的精度。
参考:#1759 - [oracle]
STRING/FIXED_CHAR 现在本地转换为 unicode。因此,SQLAlchemy 的 String 类型不需要应用任何类型的转换。
杂项
- [引擎]
C 扩展现在还可以与使用自定义序列作为行的 DBAPI 一起使用(不仅仅是元组)。
参考:#1757 - [ext]
编译器扩展现在允许在扩展到子类的基类上使用 @compiles 装饰器,在子类上使用 @compiles 装饰器不会被基类上的 @compiles 装饰器破坏。 - [扩展]
如果在基于字符串的 relationship() 参数中引用了非映射类属性,声明式将引发一个信息性错误消息。 - [ext]
进一步重新调整了声明式中的“mixin”逻辑,还允许在 mixin 上作为 @classproperty 动态分配 polymorphic_identity,例如 mapper_args。 - [firebird]
可以通过在 create_engine() 上设置 ‘enable_rowcount=False’ 来在每个引擎上禁用 result.rowcount 的功能。通常,在任何 UPDATE 或 DELETE 语句之后无条件地调用 cursor.rowcount,因为然后游标将被关闭,而 Firebird 需要一个打开的游标才能获取行数。但是,这个调用稍微昂贵,因此可以禁用。要在每次执行时重新启用,可以使用 ‘enable_rowcount=True’ 执行选项。
0.6beta3
发布日期:2010 年 3 月 28 日 星期日
orm
- [orm]
主要特性:为 relationship()添加了新的“subquery”加载功能。这是一种急切加载选项,为查询中表示的每个集合生成第二个 SELECT,跨所有父级一次性加载。该查询重新发出原始的最终用户查询,包装在一个子查询中,将连接应用到目标集合,并一次性完全加载所有这些集合的结果,类似于“joined”急切加载,但使用所有内连接,不会重复重新获取完整的父行(即使跳过列,大多数 DBAPI 似乎也会这样做)。子查询加载在映射器配置级别使用“lazy=‘subquery’”和在查询选项级别使用“subqueryload(props…)”,“subqueryload_all(props…)”可用。
参考:#1675 - [orm]
为了适应现在有两种可用的急加载的事实,eagerload()和 eagerload_all()的新名称是 joinedload()和 joinedload_all()。旧名称将作为可预见的将来的同义词保留。 - [orm]
relationship()函数上的“lazy”标志现在接受字符串参数,用于所有种类的加载:“select”、“joined”、“subquery”、“noload”和“dynamic”,其中默认值现在为“select”。True/False/None 的旧值仍保留其通常含义,并将作为可预见的将来的同义词。 - [orm]
向 Query()构造添加了 with_hint()方法。这直接调用 select().with_hint(),并且还接受实体以及表和别名。请参见下面 SQL 部分中的 with_hint()。
参考:#921 - [orm]
修复了 Query 中的一个 bug,即调用 q.join(prop).from_self(…). join(prop)会在内部连接的相同条件上连接第二个连接时,未能在子查询之外呈现第二个连接。 - [orm]
修复了 Query 中的一个 bug,即在 q.from_self()或 q.select_from()生成的子查询中引用 aliased()构造会失败,如果引用了底层表(但实际别名未被引用)。 - [orm]
修复了影响所有 eagerload()和类似选项的 bug,即“remote”急切加载,即从延迟加载中进行急切加载,例如 query(A).options(eagerload(A.b, B.c))不会急切加载任何内容,但使用 eagerload(“b.c”)将正常工作。 - [orm]
Query 获得了一个 add_columns(*columns)方法,这是 add_column(col)的多版本。add_column(col)将来将被弃用。 - [orm]
Query.join()将检测最终结果是否为“FROM A JOIN A”,如果是,则会引发错误。 - [orm]
Query.join(Cls.propname, from_joinpoint=True)将更仔细地检查“Cls”是否与当前连接点兼容,并在这方面与 Query.join(“propname”, from_joinpoint=True)表现相同。
sql
- [sql]
向 select()构造添加了 with_hint()方法。指定表/别名、提示文本和可选的方言名称,“hints”将在语句中适当的位置呈现。适用于 Oracle、Sybase、MySQL。
参考:#921 - [sql]
修复了在 0.6beta2 中引入的 bug,其中列标签会在已分配标签的列表达式内部呈现。
参考:#1747
postgresql
- [postgresql]
psycopg2 方言将通过“sqlalchemy.dialects.postgresql”记录 NOTICE 消息。
参考:#877 - [postgresql]
时间和时间戳类型现在可以直接从 postgresql 方言中使用,这为两者都添加了 PG 特定参数‘precision’。‘precision’和‘timezone’对于时间和时区类型都正确反映。
参考:#997
mysql
- [mysql]
不再猜测 TINYINT(1)应该是 BOOLEAN 当反射时 - 返回 TINYINT(1)。在表定义中使用 Boolean/BOOLEAN 以获得布尔转换行为。
参考:#1752
oracle
- [oracle]
Oracle 方言将使用字符计数发出 VARCHAR 类型定义,即 VARCHAR2(50 CHAR),因此列的大小是以字符而不是字节为单位。字符类型的列反射还将使用 ALL_TAB_COLUMNS.CHAR_LENGTH 而不是 ALL_TAB_COLUMNS.DATA_LENGTH。这些行为在服务器版本为 9 或更高版本时生效 - 对于版本 8,将使用旧行为。
参考:#1744
杂项
- [declarative]
如果 mixin 实现了不可预测的 getattribute(),即 Zope 接口,使用 mixin 不会出错。
参考:#1746 - [declarative]
现在在 mixin 上使用@classdecorator 等来定义 tablename、table_args 等,如果方法引用了最终子类上的属性,现在可以正常工作。
参考:#1749 - [declarative]
在声明性 mixin 上不允许有带有外键的关系和列,抱歉。
参考:#1751 - [ext]
sqlalchemy.orm.shard 模块现在成为扩展,sqlalchemy.ext.horizontal_shard。旧的导入会有一个弃用警告。
orm
- [orm]
主要功能:为 relationship()添加了新的“subquery”加载功能。这是一种急切加载选项,为查询中表示的每个集合生成第二个 SELECT,跨所有父级一次性加载。查询重新发出原始的最终用户查询,包装在一个子查询中,应用连接到目标集合,一次性完全加载所有这些集合的结果,类似于“joined”急切加载,但使用所有内连接,不会重复重新获取完整的父行(即使跳过列,大多数 DBAPI 似乎也会这样做)。子查询加载在映射器配置级别使用“lazy=‘subquery’”和在查询选项级别使用“subqueryload(props…)”,“subqueryload_all(props…)”可用。
参考:#1675 - [orm]
为了适应现在有两种可用的 eager loading,eagerload() 和 eagerload_all() 的新名称分别为 joinedload() 和 joinedload_all()。旧名称将在可预见的未来保留为同义词。 - [orm]
relationship() 函数上的 “lazy” 标志现在接受字符串参数用于所有加载类型:“select”、“joined”、“subquery”、“noload” 和 “dynamic”,其中默认值现在为 “select”。True/False/None 的旧值仍保留其通常含义,并将在可预见的未来保留为同义词。 - [orm]
向 Query() 构造添加了 with_hint() 方法。这直接调用 select().with_hint(),并且还接受实体以及表和别名。请参见下面 SQL 部分中的 with_hint()。
参考:#921 - [orm]
修复了 Query 中的 bug,调用 q.join(prop).from_self(…).join(prop) 将无法在与内部相同的条件上连接第二个 join 到子查询之外时失败。 - [orm]
修复了 Query 中的 bug,如果在 q.from_self() 或 q.select_from() 生成的子查询中引用了基础表(但实际别名未被引用),则使用 aliased() 构造将失败。 - [orm]
修复了影响所有 eagerload() 和类似选项的 bug,即“远程” eager loads,即从延迟加载(如 query(A).options(eagerload(A.b, B.c))中的 eagerloads 不会加载任何内容,但使用 eagerload(“b.c”) 将正常工作。 - [orm]
Query 增加了 add_columns(*columns) 方法,这是 add_column(col) 的多版本。add_column(col) 将被未来弃用。 - [orm]
Query.join() 将检测结果是否为 “FROM A JOIN A”,如果是,则会引发错误。 - [orm]
Query.join(Cls.propname, from_joinpoint=True) 将更仔细地检查 “Cls” 是否与当前连接点兼容,并在这方面与 Query.join(“propname”, from_joinpoint=True) 表现相同。
sql
- [sql]
添加了 with_hint() 方法到 select() 构造中。指定表/别名、提示文本和可选的方言名称,“提示”将在语句中适当的位置呈现。适用于 Oracle、Sybase、MySQL。
参考:#921 - [sql]
修复了在 0.6beta2 中引入的 bug,其中列标签会呈现在已分配标签的列表达式内部。
参考:#1747
postgresql
- [postgresql]
psycopg2 方言将通过 “sqlalchemy.dialects.postgresql” 记录 NOTICE 消息。
参考:#877 - [postgresql]
TIME 和 TIMESTAMP 类型现在可以直接从 postgresql 方言中使用,这为两者添加了 PG 特定的参数 ‘precision’。‘precision’ 和 ‘timezone’ 对于 TIME 和 TIMEZONE 类型都正确反映。
参考:#997
mysql
- [mysql]
不再猜测 TINYINT(1) 应该在反射时转换为 BOOLEAN - 返回的是 TINYINT(1)。在表定义中使用 Boolean/ BOOLEAN 可以获得布尔转换行为。
参考:#1752
oracle
- [oracle]
Oracle 方言将使用字符计数发出 VARCHAR 类型定义,即 VARCHAR2(50 CHAR),因此列的大小是以字符而不是字节为单位。字符类型的列反射也将使用 ALL_TAB_COLUMNS.CHAR_LENGTH 而不是 ALL_TAB_COLUMNS.DATA_LENGTH。这些行为在服务器版本为 9 或更高时生效 - 对于版本 8,将使用旧的行为。
参考:#1744
杂项
- [declarative]
如果 mixin 实现了不可预测的 getattribute(),即 Zope 接口,使用 mixin 不会出错。
参考:#1746 - [declarative]
在 mixins 上使用 @classdecorator 和类似方法来定义 tablename、table_args 等现在可以正常工作,如果方法引用了最终子类的属性。
参考:#1749 - [declarative]
不允许在声明性 mixins 上使用带有外键的关系和列,抱歉。
参考:#1751 - [ext]
sqlalchemy.orm.shard 模块现在成为扩展,sqlalchemy.ext.horizontal_shard。旧的导入会有弃用警告。
SqlAlchemy 2.0 中文文档(六十七)(5)https://developer.aliyun.com/article/1560844