SqlAlchemy 2.0 中文文档(六十七)(2)https://developer.aliyun.com/article/1560838
0.6.6
发布日期:2011 年 1 月 8 日星期六
orm
- [orm]
修复了非“mutable”属性修改事件发生在干净对象上,除了之前保存在“mutable changes”字典中的更改之外,将无法强引用自身在标识映射中。这将导致对象被垃圾回收,丢失任何之前未保存在“mutable changes”字典中的更改。 - [orm]
修复了“passive_deletes=‘all’”在 flush 期间未将正确符号传递给懒加载程序的错误,从而导致不必要的加载。
参考:#2013 - [orm]
修复了阻止复合映射属性在映射的选择语句中使用的错误。请注意,复合的工作方式在 0.7 中将发生重大变化。
参考:#1997 - [orm]
还向 composite()添加了 active_history 标志。该标志在 0.6 中没有效果,而是一个用于向前兼容的占位符标志,因为它在 0.7 中适用于 composites。
参考:#1976 - [orm]
修复了 uow 错误,即当传递到 Session.delete()的过期对象在删除对象时不考虑未加载的引用或集合时,尽管 passive_deletes 保持默认值 False。
参考:#2002 - [orm]
当继承的映射器上已经指定 version_id_col 时,在继承的映射器上指定 version_id_col 时会发出警告,如果这些列表达式不相同。
参考:#1987 - [orm]
如果在 joinedload()连接链中的先前连接是外连接,则“innerjoin”标志不会沿着连接链生效,因此允许正确返回没有引用子行的主行结果。
参考:#1954 - [orm]
修复了关于“subqueryload”策略的错误,即如果实体是一个 aliased()构造,则策略将失败。
参考:#1964 - [orm]
修复了关于“subqueryload”策略的错误,即如果使用形式为从 A->joined-subclass->C 的多级加载,则连接将失败。
参考:#2014 - [orm]
修复了通过-1 对 Query 对象进行索引的错误。它错误地转换为空切片-1:0,导致 IndexError。
参考:#1968 - [orm]
mapper 参数“primary_key”可以传递为单个列,也可以传递为列表或元组。文档中将其示例更改为列表。
参考:#1971 - [orm]
向 relationship()和 column_property()添加了 active_history 标志,强制属性事件始终加载“旧”值,以便它在 attributes.get_history()中可用。
参考:#1961 - [ORM]
如果复合键中的参数数量过大或过小,Query.get() 将引发异常。
参考:#1977 - [ORM]
从 0.7 中回退了“优化的获取”修复,改进了联合继承“加载过期行”行为的生成。
参考:#1992 - [ORM]
在视图只读时 join 条件“有效”但在非视图只读时不起作用的异常条件下,为“primaryjoin”错误添加了更多描述,且未使用 foreign_keys - 在建议中添加了“foreign_keys”。还为通用“direction”错误的建议添加了“foreign_keys”。
示例
- [示例]
版本示例现在支持检测关联关系中的更改。
引擎
- [引擎]
当显式使用 Unicode 类型时,只有在引擎或字符串类型上使用 convert_unicode=True 时才会引发“unicode 警告”;而不是在绑定数据为非 Unicode 时。 - [引擎]
修复了 Decimal 结果处理器的 C 版本中的内存泄漏。
参考:#1978 - [引擎]
为 RowProxy 的 C 版本实现了序列检查功能,以及对 RowProxy 的 2.7 风格“collections.Sequence”注册。
参考:#1871 - [引擎]
Threadlocal 引擎方法 rollback()、commit()、prepare() 在没有事务进行时不会引发异常;这是 0.6 中引入的一个回归。
参考:#1998 - [引擎]
Threadlocal 引擎在 begin()、begin_nested() 后返回自身;然后引擎实现上下文管理器方法,以允许“with”语句。
参考:#2004
SQL
- [SQL]
修复了单个非关联运算符链的运算符优先级规则。即“x - (y - z)”将编译为“x - (y - z)”而不是“x - y - z”。也适用于标签,即“x - (y - z).label(‘foo’)”
参考:#1984 - [SQL]
Column 的 ‘info’ 属性在 Column.copy() 期间被复制,即在声明性 mixin 中使用列时发生的情况。
参考:#1967 - [SQL]
为布尔值添加了一个绑定处理器,将其强制转换为 int,用于像 pymssql 这样的 DBAPI,在值上天真地调用 str()。 - [SQL]
CheckConstraint 将在 copy()/tometadata() 中复制其‘initially’、‘deferrable’和‘_create_rule’属性。
参考:#2000
PostgreSQL
- [PostgreSQL]
IN 子句中的单个元组表达式正确地加括号,也来自
参考:#1984 - [PostgreSQL]
确保 psycopg2 和 pg8000 的“numeric”基本类型识别每个数字、浮点数、整数代码、标量 + 数组。
引用:#1955 - [postgresql]
对 UUID 类型添加了 as_uuid=True 标志,将接收和返回值作为 Python UUID()对象而不是字符串。目前,UUID 类型只能与 psycopg2 一起使用。
引用:#1956 - [postgresql]
修复了在池处理+重新创建后,非 ENUM 支持的 PG 版本会出现 KeyError 的错误。
引用:#1989
mysql
- [mysql]
修复了 Jython + zxjdbc 的错误处理,使 has_table()属性再次起作用。这是从 0.6.3 开始的回归(我们没有 Jython 构建机,抱歉)
引用:#1960
sqlite
- [sqlite]
在 CREATE TABLE 中包含对具有相同模式名称的另一个表的远程模式的 REFERENCES 子句现在呈现远程名称而不包含模式子句,这是 SQLite 所要求的。
引用:#1851 - [sqlite]
在相同的主题上,在 CREATE TABLE 中包含对不同模式的远程模式的 REFERENCES 子句不会呈现,因为似乎不支持跨模式引用。
mssql
- [mssql]
对索引反射的重写不幸地没有经过正确测试,并返回了不正确的结果。这个回归现在已经修复。
引用:#1770
oracle
- [oracle]
cx_oracle 的“十进制检测”逻辑,对于具有模糊数值特征的结果集列,现在使用由 locale/NLS_LANG 设置确定的小数点字符,使用首次连接时检测此字符。在使用非句点小数点 NLS_LANG 设置时,还需要 cx_oracle 5.0.3 或更高版本。
引用:#1953
杂项
- [firebird]
Firebird 数值类型现在明确检查 Decimal,让 float()直接通过,从而允许特殊值如 float(‘inf’)。
引用:#2012 - [declarative]
如果 table_args 不是元组或字典格式,并且不是 None,则会引发错误。
引用:#1972 - [sqlsoup]
向 SqlSoup 添加了“map_to()”方法,这是一个“主”方法,接受每个可选择对象和映射的显式参数,包括每个映射的基类。
引用:#1975 - [sqlsoup]
与 map()、with_labels()、join()方法一起使用的映射可选择对象不再将给定参数放入内部“缓存”字典中。特别是因为 join()和 select()对象是在方法本身中创建的,这几乎是一种纯粹的内存泄漏行为。
orm
- [orm]
修复了一个 bug,即在干净的对象上发生的非“mutable”属性修改事件,除了之前保存在“mutable changes”字典中的更改之外,不会强引用自身在标识映射中。这将导致对象被垃圾回收,丢失任何之前未保存在“mutable changes”字典中的更改的跟踪。 - [orm]
修复了一个 bug,即“passive_deletes=‘all’”在 flush 期间未将正确的符号传递给 lazy loaders,从而导致不必要的加载。
参考:#2013 - [orm]
修复了一个 bug,阻止了复合映射属性在映射的选择语句中使用。请注意,复合的工作方式在 0.7 中将发生重大变化。
参考:#1997 - [orm]
active_history 标志也添加到 composite()。该标志在 0.6 中没有效果,而是一个用于向前兼容性的占位符标志,因为它在 0.7 中适用于 composites。
参考:#1976 - [orm]
修复了一个 uow bug,即当传递到 Session.delete() 的过期对象在删除对象时不考虑未加载的引用或集合,尽管 passive_deletes 仍保持默认值 False。
参考:#2002 - [orm]
当继承的映射器上指定 version_id_col 时,如果继承的映射器已经有一个,并且这些列表达式不相同时,将发出警告。
参考:#1987 - [orm]
如果链中的先前连接是外连接,则“innerjoin”标志不会沿着 joinedload() 连接链生效,从而允许正确返回没有引用子行的主行结果。
参考:#1954 - [orm]
修复了关于“subqueryload”策略的 bug,即如果实体是 aliased() 构造,则策略将失败。
参考:#1964 - [orm]
修复了关于“subqueryload”策略的 bug,即如果使用形式从 A->joined-subclass->C 的多级加载,则连接将失败。
参考:#2014 - [orm]
修复了对 Query 对象按 -1 进行索引的错误。它错误地转换为空切片 -1:0,导致 IndexError。
参考:#1968 - [orm]
mapper 参数“primary_key”可以传递为单个列,也可以传递为列表或元组。文档中以标量值示例的示例已更改为列表。
参考:#1971 - [orm]
在 relationship() 和 column_property() 中添加了 active_history 标志,强制属性事件始终加载“旧”值,以便它在 attributes.get_history() 中可用。
参考:#1961 - [orm]
如果复合键中的参数数量过大或过小,Query.get()将引发异常。
参考:#1977 - [orm]
从 0.7 中回退了“优化的获取”修复,改进了联合继承“加载过期行”行为的生成。
参考:#1992 - [orm]
在“primaryjoin”错误中增加了更多描述,对于一个不寻常的情况,即连条件对于 viewonly 有效但对于非 viewonly 无效,并且未使用 foreign_keys - 在建议中添加了“foreign_keys”。还在通用的“direction”错误建议中添加了“foreign_keys”。
示例
- [examples]
版本示例现在支持检测关联关系中的更改。
engine
- [engine]
“unicode 警告”只有在显式使用 Unicode 类型时才会引发,而不是在引擎或 String 类型上使用 convert_unicode=True 时。 - [engine]
修复了 Decimal 结果处理器的 C 版本中的内存泄漏。
参考:#1978 - [engine]
为 RowProxy 的 C 版本实现了序列检查功能,以及对 RowProxy 的 2.7 风格“collections.Sequence”注册。
参考:#1871 - [engine]
Threadlocal 引擎方法 rollback()、commit()、prepare()如果没有事务正在进行,则不会引发异常;这是 0.6 中引入的一个回归。
参考:#1998 - [engine]
Threadlocal 引擎在 begin()、begin_nested()时返回自身;然后引擎实现了上下文管理器方法,以允许“with”语句。
参考:#2004
sql
- [sql]
修复了单个非关联运算符链的运算符优先级规则。即“x - (y - z)”将编译为“x - (y - z)”而不是“x - y - z”。也适用于标签,即“x - (y - z).label(‘foo’)”
参考:#1984 - [sql]
Column 的‘info’属性在 Column.copy()期间被复制,即在声明性 mixin 中使用列时发生的情况。
参考:#1967 - [sql]
为布尔值添加了一个绑定处理器,将其强制转换为 int,用于像 pymssql 这样的 DBAPI,它们会简单地对值调用 str()。 - [sql]
CheckConstraint 将在 copy()/tometadata()中复制其‘initially’、‘deferrable’和‘_create_rule’属性
参考:#2000
postgresql
- [postgresql]
单元素元组表达式在 IN 子句中正确地加括号,也来自
参考:#1984 - [postgresql]
确保每个数字、浮点数、整数代码、标量+数组都被 psycopg2 和 pg8000 的“numeric”基本类型识别。
引用:#1955 - [postgresql]
添加了 as_uuid=True 标志到 UUID 类型,将接收和返回 Python UUID()对象而不是字符串。目前,UUID 类型只能与 psycopg2 一起使用。
引用:#1956 - [postgresql]
修复了在池销毁+重新创建后,对不支持 ENUM 的 PG 版本会出现 KeyError 的错误。
引用:#1989
mysql
- [mysql]
修复了 Jython + zxjdbc 的错误处理,使 has_table()属性再次有效。从 0.6.3 开始的退化(我们没有 Jython buildbot,抱歉)
引用:#1960
sqlite
- [sqlite]
在包含远程模式的 CREATE TABLE 中的 REFERENCES 子句指向具有相同模式名称的另一表时,现在呈现远程名称而不带模式子句,这是 SQLite 所要求的。
引用:#1851 - [sqlite]
在同一主题下,包含远程模式的 CREATE TABLE 中的 REFERENCES 子句指向与父表不同的模式,由于不支持跨模式引用,因此根本不会呈现。
mssql
- [mssql]
不幸地,索引反射的重写没有经过正确测试,返回了不正确的结果。这个退化现在已经修复。
引用:#1770
oracle
- [oracle]
cx_oracle 的“十进制检测”逻辑,用于具有模糊数值特征的结果集列,现在使用由 locale/NLS_LANG 设置确定的小数点字符,使用首次连接时检测此字符。在使用非句点小数点 NLS_LANG 设置时,还需要 cx_oracle 5.0.3 或更高版本。
引用:#1953
杂项
- [firebird]
Firebird 数字类型现在明确检查 Decimal,让 float()直接通过,从而允许特殊值如 float(‘inf’)。
引用:#2012 - [declarative]
如果 table_args 不是元组或字典格式,并且不是 None,则会引发错误。
引用:#1972 - [sqlsoup]
向 SqlSoup 添加了“map_to()”方法,这是一个“主”方法,接受每个可选择和映射的显式参数,包括每个映射的基类。
引用:#1975 - [sqlsoup]
与 map()、with_labels()、join()方法一起使用的映射可选择现在不再将给定参数放入内部“缓存”字典中。特别是由于 join()和 select()对象是在方法本身中创建的,这几乎是一种纯粹的内存泄漏行为。
0.6.5
发布日期:2010 年 10 月 24 日星期日
orm
- [orm]
添加了一个新的“lazyload”选项“immediateload”。当对象被填充时,自动执行常规的“lazy”加载操作。这里的用例是当加载对象以放置在离线缓存中,或在会话不可用后使用对象时,以及希望使用直接的‘select’加载而不是‘joined’或‘subquery’时。
参考:#1914 - [orm]
新的 Query 方法:query.label(name)、query.as_scalar(),返回查询的语句作为标量子查询,带/不带标签;query.with_entities(*ent),用新的实体替换查询的 SELECT 列表。与 query.values() 的生成形式大致等效,接受映射实体以及列表达式。
参考:#1920 - [orm]
修复了递归错误,当将对象从一个引用移动到另一个引用时,涉及到反向引用,其中启动父类是前一个父类的子类(带有自己的映射器)时,可能会出现递归错误。 - [orm]
修复了在 0.6.4 中出现的一个回归,如果你在 mapper() 上传递一个空列表给“include_properties”,就会出现这个问题。
参考:#1918 - [orm]
修复了 Query 中的标记错误,即如果任何列表达式未标记,则 NamedTuple 会错误地应用标签。 - [orm]
修补了一个情况,其中 query.join() 会不适当地将右侧适应为左侧连接的右侧
参考:#1925 - [orm]
Query.select_from() 已经增强,以确保后续对 query.join() 的调用将使用 select_from() 实体,假设它是一个映射实体而不是一个普通的可选择对象,作为默认的“左”侧,而不是查询对象的实体列表中的第一个实体。 - [orm]
当会话在子事务回滚后(这是在 autocommit=False 模式下发生刷新失败时发生的情况)被用于后续操作时,会话引发的异常现在已经被重新表述了(这是“由于子事务中的回滚而无效”消息)。特别是,如果回滚是由于刷新期间的异常引起的,消息将说明这是情况,并重申在刷新期间发生的原始异常的字符串形式。如果会话由于显式使用子事务而关闭(这种情况并不常见),消息只说明这是情况。 - [orm]
当初始化已经失败后,如果对 Mapper 进行重复请求,则不再假设“hasattr”情况,因为这个消息被发出的其他场景,并且消息也不会多次叠加 - 每次尝试使用时都会得到相同的消息。误用的“compiles”正在被“initialize”替换。 - [orm]
修复了在 query.update() 中的错误,在这里‘evaluate’或‘fetch’过期将失败,如果列表达式键是具有不同键名的类属性作为实际列名。
参考:#1935 - [orm]
在 flush 过程中添加了一个断言,确保“新持久化”对象上没有生成持有 NULL 的标识键。当用户定义的代码无意中触发了对未完全加载的对象的 flush 时,就会出现这种情况。 - [orm]
当关系属性的延迟加载使用当前状态而不是“已提交”状态的外键和主键属性发出 SQL 时,如果没有进行 flush,则现在会使用当前状态。以前,只会使用数据库已提交的状态。特别是,这会导致许多对一的 get()-on-lazyload 操作失败,因为在这些加载时不会触发自动 flush,当确定属性时,“已提交”状态可能不可用。
参考:#1910 - [orm]
relationship() 上的一个新标志 load_on_pending,允许延迟加载器在未进行 flush 的情况下对待待定对象进行触发,以及手动“附加”到会话的瞬态对象。请注意,此标志在加载对象时阻止属性事件发生,因此直到 flush 之后才可用反向引用。该标志仅用于非常特定的用例。 - [orm]
另一个 relationship() 上的新标志 cascade_backrefs,在“反向”关系的事件被初始化时禁用“save-update”级联。这是一种更干净的行为,使得可以在瞬态对象上设置许多对一,而不会被吸入子对象的会话,同时仍允许前向集合级联。我们可能会在 0.7 中将其默认设置为 False。 - [orm]
在关系的“passive_updates=False”行为略有改进,当仅放在关系的多对一侧时;文档已经澄清 passive_updates=False 应该真正放在一对多侧。 - [orm]
在多对一上放置 passive_deletes=True 会发出警告,因为您可能打算将其放在一对多侧。 - [orm]
修复了一个 bug,该 bug 会导致“subqueryload”与子类的关系在单表继承中无法正常工作 - “where type in (x, y, z)” 只会放在内部,而不是重复出现。 - [orm]
在使用 from_self() 与单表继承时,“where type in (x, y, z)” 只会放在查询的外部,而不是重复出现。可能会对此进行一些调整。 - [orm]
当 configure() 被调用时,scoped_session 会发出警告,如果已经存在一个 Session(仅检查当前线程)
参考:#1924 - [orm]
重新设计了 mapper.cascade_iterator() 的内部结构,在某些情况下减少了约 9% 的方法调用。
参考:#1932
引擎
- [engine]
修复了 0.6.4 中的一个回归,即允许一致引发游标错误的更改破坏了 result.lastrowid 访问器。为 result.lastrowid 添加了测试覆盖。请注意,lastrowid 仅受 Pysqlite 和一些 MySQL 驱动程序支持,因此在一般情况下并不是特别有用。 - [engine]
当首次使用连接时,引擎发出的日志消息现在是“BEGIN (implicit)”,以强调 DBAPI 没有显式的 begin()。 - [engine]
在 metadata.reflect()中添加了“views=True”选项,将添加可用视图列表到被反射的视图中。
参考:#1936 - [engine]
engine_from_config()现在接受‘debug’作为‘echo’,‘echo_pool’的‘force’,‘convert_unicode’的布尔值作为‘use_native_unicode’。
参考:#1899
sql
- [sql]
修复了 TypeDecorator 中的错误,其中特定于方言的类型被拉入以生成给定类型的 DDL,这并不总是返回正确的结果。 - [sql]
TypeDecorator 现在可以将一个完全构造的类型指定为其“impl”,而不仅仅是一个类型类。 - [sql]
TypeDecorator 现在将自身放置为二进制表达式的结果类型,其中类型强制转换规则通常会返回其 impl 类型 - 以前,将返回 impl 类型的副本,该副本将 TypeDecorator 嵌入其中作为“dialect” impl,这可能是实现所需效果的无意的方式。 - [sql]
TypeDecorator.load_dialect_impl()默认返回“self.impl”,即不返回“self.impl”的方言实现类型。这是为了正确支持编译。行为可以像以前一样被用户覆盖,产生相同的效果。 - [sql]
添加了 type_coerce(expr, type_)表达式元素。在评估表达式和处理结果行时,将给定表达式视为给定类型,但不影响 SQL 的生成,除了一个匿名标签。 - [sql]
Table.tometadata()现在也复制与 Table 关联的 Index 对象。 - [sql]
Table.tometadata()如果给定的 Table 已经存在于目标 MetaData 中,则会发出警告 - 返回现有的 Table 对象。 - [sql]
如果一个尚未分配名称的列(即在声明中)在导出到封闭 select()构造的列集合的上下文中使用,或者在分配其名称之前编译涉及该列的任何构造时,将引发一个信息性错误消息。 - [sql]
as_scalar(),label()可以在包含尚未命名的列的可选择项上调用。
参考:#1862 - [sql]
修复了在操作两个类型均为“NullType”但不是单例 NULLTYPE 实例时可能发生的递归溢出。
参考:#1907
postgresql
- [postgresql]
为 ARRAY 类型添加了“as_tuple”标志,返回结果作为元组而不是列表以允许哈希。 - [postgresql]
修复了阻止从自定义类型(如“enum”)构建的“domain”被反射的错误。
参考:#1933
mysql
- [mysql]
修复了涉及使用 ON UPDATE 子句的 CURRENT_TIMESTAMP 默认值的反射错误,感谢 Taavi Burns。
参考:#1940
mssql
- [mssql]
修复了未正确处理未知类型反射的错误。
参考:#1946 - [mssql]
修复了使用“schema”别名表时无法正确编译的错误。
参考:#1943 - [mssql]
重写了索引的反射,使用 sys.目录,以便可以反射任何配置的列名称(空格、嵌入逗号等)。请注意,反射索引需要 SQL Server 2005 或更高版本。
参考:#1770 - [mssql]
mssql+pymssql 方言现在尊重 URL 中的“port”分,而不是丢弃它。
参考:#1952
oracle
- [oracle]
现在无论检测到的 Oracle 版本如何,create_engine()中的 implicit_returning 参数都会被尊重。以前,如果服务器版本信息<10,则该标志将被强制为 False。
参考:#1878
测试
- [测试]
NoseSQLAlchemyPlugin 已移至新包“sqlalchemy_nose”,与“sqlalchemy”一起安装。这样,“nosetests”脚本仍然可以正常工作,但也允许在导入 SQLAlchemy 模块之前打开覆盖率,从而使覆盖率能够正确工作。
杂项
- [声明式]
@classproperty(即将/现在 @declared_attr)对于不是混合类的基类上的 mapper_args、table_args、tablename 以及混合类都生效。
参考:#1922 - [声明式]
@classproperty 在声明式中的官方名称/位置是 sqlalchemy.ext.declarative.declared_attr。虽然是同一件事情,但由于它更像是一个特定于声明式的“标记”,而不仅仅是一个属性技术,所以将其移动到那里。
参考:#1915 - [声明式]
修复了混合类上的列无法正确传播到单表或联接表继承方案的错误,其中属性名称与列的名称不同。
参考:#1930,#1931 - [声明式]
现在混合类可以指定一个列,该列覆盖了与超类关联的同名列。感谢 Oystein Haaland。 - [informix]
对 Informix 方言进行了重大清理/现代化,感谢 Florian Apolloner。
引用:#1906 - 【杂项】
CircularDependencyError 现在具有 .cycles 和 .edges 成员,它们是一个或多个循环中涉及的元素集合,以及 2 元组的边集合。
引用:#1890
orm
- 【orm】
添加了一个新的“lazyload”选项“immediateload”。在对象填充时自动发出通常的“lazy”加载操作。这里的用例是在加载要放置在离线缓存中的对象或在会话不可用后使用,并且希望进行直接的“select”加载,而不是“joined”或“subquery”。
引用:#1914 - 【orm】
新的 Query 方法:query.label(name),query.as_scalar(),将查询的语句返回为带有/不带有标签的标量子查询;query.with_entities(*ent),用新实体替换查询的 SELECT 列表。大致相当于 query.values() 的生成形式,它接受映射实体以及列表达式。
引用:#1920 - 【orm】
修复了递归错误,该错误可能在将对象从一个引用移动到另一个引用时发生,并涉及反向引用,其中发起父级是前一个父级的子类(具有自己的映射器)。 - 【orm】
修复了在 0.6.4 中发生的回归,如果您将空列表传递给“include_properties”在 mapper() 上
引用:#1918 - 【orm】
修复了查询中的标签错误,在其中,如果任何列表达式未标记,则命名元组会错误地应用标签。 - 【orm】
修复了 query.join() 在不适当地将右侧适应为左侧连接的右侧的情况下的情况
引用:#1925 - 【orm】
Query.select_from() 已经得到加强,以确保后续调用 query.join() 将使用 select_from() 实体,假设它是一个映射实体而不是一个普通可选择项,并且默认“左”侧,而不是查询对象的实体列表中的第一个实体。 - 【orm】
当 Session 在子事务回滚后(这是在 autocommit=False 模式下刷新失败时发生的情况)后续使用时引发的异常已经被重新措辞(这是“由于子事务回滚而不活跃”消息)。特别地,如果回滚是由于刷新期间发生异常引起的,则消息说明了这一点,并且重申了在刷新期间发生的原始异常的字符串形式。如果会话由于明确使用子事务而关闭(并不常见),则消息只是说明了这一点。 - 【orm】
当 Mapper 在初始化失败后再次对其进行重复请求时,引发的异常不再假定“hasattr”情况,因为还有其他情况会导致该消息被发出,并且该消息也不会多次复合 - 每次尝试使用时都会得到相同的消息。误称“compiles”正在被“initialize”交换。 - [orm]
修复了在 query.update() 中的一个 bug,即当列表达式键是一个具有不同键名的类属性时,“evaluate”或“fetch”过期会失败。
参考:#1935 - [orm]
在刷新过程中添加了一个断言,确保“新持久化”对象上没有生成包含 NULL 的标识键。当用户定义的代码无意中触发了对尚未完全加载的对象的刷新时,就会发生这种情况。 - [orm]
当发出 SQL 时,关系属性的惰性加载现在使用当前状态,而不是“已提交”状态,如果刷新未在进行中。以前,只会使用数据库提交的状态。特别是,这将导致许多对一的 get()-on-lazyload 操作失败,因为这些加载时不会触发自动刷新,并且可能无法使用“已提交”状态。
参考:#1910 - [orm]
在 relationship() 上的一个新标志,load_on_pending,允许懒加载器在不进行刷新的情况下对待挂起的对象进行处理,以及手动“附加”到会话的临时对象。请注意,当加载对象时,此标志会阻止属性事件发生,因此在刷新后才能使用反向引用。该标志仅用于非常特定的用例。 - [orm]
在 relationship() 上的另一个新标志,cascade_backrefs,在双向关系的“反向”一侧启动事件时禁用了“save-update”级联。这是一种更清晰的行为,以便可以在临时对象上设置多对一,而不会被吸入到子对象的会话中,同时仍允许向前集合进行级联。我们可能会在 0.7 中将其默认设置为 False。 - [orm]
当 passive_updates=False 仅放置在关系的多对一一侧时,对“passive_updates=False”的行为进行了轻微改进;文档已经澄清,passive_updates=False 实际上应该放在一对多的一侧。 - [orm]
在多对一上放置 passive_deletes=True 会发出警告,因为您可能打算将其放在一对多的一侧。 - [orm]
修复了一个 bug,该 bug 会阻止“subqueryload”与单表继承一起使用时正常工作,即从子类到关系的关系 - “where type in (x, y, z)” 只会放置在内部,而不是重复出现。 - [orm]
在使用单表继承时,from_self()中的“where type in (x, y, z)”仅放在查询的外部,而不是重复出现。可能需要对此进行一些调整。 - [orm]
如果已经存在一个 Session(仅检查当前线程),则 scoped_session 在调用 configure()时会发出警告。
参考:#1924 - [orm]
重新设计了 mapper.cascade_iterator()的内部结构,在某些情况下减少了约 9%的方法调用。
参考:#1932
引擎
- [engine]
修复了 0.6.4 中的一个回归问题,即允许一致引发游标错误的更改破坏了 result.lastrowid 访问器。为 result.lastrowid 添加了测试覆盖。请注意,lastrowid 仅由 Pysqlite 和一些 MySQL 驱动程序支持,在一般情况下并不是特别有用。 - [engine]
当连接首次被使用时,引擎发出的日志消息现在是“BEGIN (implicit)”,以强调 DBAPI 没有显式的 begin()。 - [engine]
在 metadata.reflect()中添加了“views=True”选项,将可用视图列表添加到要反射的视图中。
参考:#1936 - [engine]
engine_from_config()现在接受‘debug’作为‘echo’的‘echo_pool’,‘force’作为‘convert_unicode’,布尔值作为‘use_native_unicode’。
参考:#1899
sql
- [sql]
修复了 TypeDecorator 中的一个错误,即方言特定类型被引入以生成给定类型的 DDL,这并不总是返回正确的结果。 - [sql]
TypeDecorator 现在可以指定一个完全构造的类型作为其“impl”,而不仅仅是一个类型类。 - [sql]
TypeDecorator 现在会将自身作为二进制表达式的结果类型,其中类型强制转换规则通常会返回其实现类型 - 以前,会返回一个 impl 类型的副本,其中 TypeDecorator 被嵌入其中作为“方言”实现,这可能是一种无意中实现所需效果的方式。 - [sql]
TypeDecorator.load_dialect_impl()默认返回“self.impl”,即不返回“self.impl”的方言实现类型。这样可以支持正确的编译。行为可以像以前一样被用户覆盖,产生相同的效果。 - [sql]
添加了 type_coerce(expr, type_)表达式元素。在评估表达式和处理结果行时,将给定表达式视为给定类型,但不影响 SQL 的生成,除了一个匿名标签。 - [sql]
Table.tometadata()现在也会复制与 Table 相关联的 Index 对象。 - [sql]
Table.tometadata()如果给定的 Table 已经存在于目标 MetaData 中,则会发出警告 - 返回现有的 Table 对象。 - [sql]
如果一个尚未分配名称的 Column,在声明时使用,在导出到封闭的 select() 构造的 columns 集合中使用,或者在分配名称之前编译涉及该列的任何构造时,会引发一个信息性错误消息。 - [sql]
as_scalar()
、label()
可以在包含尚未命名的 Column 的可选对象上调用。
参考:#1862 - [sql]
修复了操作两个类型均为 “NullType” 的表达式时可能发生的递归溢出,但不是单例 NULLTYPE 实例。
参考:#1907
postgresql
- [postgresql]
在 ARRAY 类型中添加了 “as_tuple” 标志,返回结果为元组而不是列表,以允许哈希。 - [postgresql]
修复了一个 bug,阻止了从自定义类型(如 “enum”)构建的 “domain” 反射。
参考:#1933
mysql
- [mysql]
修复了与 ON UPDATE 子句一起使用的 CURRENT_TIMESTAMP 默认值的反射 bug,感谢 Taavi Burns。
参考:#1940
mssql
- [mssql]
修复了一个反射 bug,未能正确处理未知类型的反射。
参考:#1946 - [mssql]
修复了带有 “schema” 别名的表的别名化可能无法正确编译的 bug。
参考:#1943 - [mssql]
重写了索引的反射,以使用 sys. 目录,以便可以反射任何配置的列名(空格,嵌入逗号等)。请注意,反射索引需要 SQL Server 2005 或更高版本。
参考:#1770 - [mssql]
mssql+pymssql 方言现在会尊重 URL 中的 “port” 部分,而不是将其丢弃。
参考:#1952
oracle
- [oracle]
现在,不管 Oracle 检测到的版本如何,create_engine()
的implicit_returning
参数都会被正确处理。以前,如果服务器版本信息小于 10,则该标志会被强制设为 False。
参考:#1878
测试
- [tests]
NoseSQLAlchemyPlugin 已移至新包 “sqlalchemy_nose”,该包随 “sqlalchemy” 一起安装。这样,“nosetests” 脚本仍然可以正常工作,但也允许使用 --with-coverage 选项在导入 SQLAlchemy 模块之前打开覆盖,从而使覆盖工作正常。
misc
- [declarative]
@classproperty(即将/现在 @declared_attr)对于不是 mixin 的基类上的 mapper_args、table_args、tablename 以及 mixins 都生效。
参考:#1922 - [declarative]
@classproperty 的官方名称/位置,用于与 declarative 一起使用的是 sqlalchemy.ext.declarative.declared_attr。虽然是同一件事情,但由于它更像是一个特定于 declarative 的“标记”,而不仅仅是一个属性技术,所以将其移动到那里。
参考:#1915 - [declarative]
修复了一个 bug,即 mixin 上的列无法正确传播到单表或联合表继承方案中,其中属性名称与列的名称不同。
参考:#1930, #1931 - [declarative]
现在 mixin 可以指定一个列,该列覆盖了与超类关联的同名列。感谢 Oystein Haaland。 - [informix]
重大清理/现代化 Informix 方言为 0.6,由 Florian Apolloner 提供。
参考:#1906 - [misc]
CircularDependencyError 现在具有.cycles 和.edges 成员,它们是一个或多个循环中涉及的元素集合,以及作为 2 元组的边集合。
参考:#1890
0.6.4
发布日期:Tue Sep 07 2010
orm
- [orm]
ConcurrentModificationError 的名称已更改为 StaleDataError,并且描述性错误消息已经修订,以准确反映问题所在。在可预见的未来,这两个名称都将保持可用,以供可能在“except:”子句中指定 ConcurrentModificationError 的方案使用。 - [orm]
向 identity map 添加了一个互斥锁,该互斥锁对迭代方法中的删除操作进行了互斥,现在在返回可迭代对象之前会预先缓冲。这是因为异步 gc 可以随时通过 gc 线程删除项目。
参考:#1891 - [orm]
Session 类现在存在于 sqlalchemy.orm.*中。我们正在摆脱 create_session()的使用,该方法具有非标准的默认值,用于那些需要一步构造 Session 的情况。然而,大多数用户应该继续使用 sessionmaker()进行一般用途。 - [orm]
query.with_parent()现在接受瞬态对象,并将使用它们的主键/外键属性的非持久化值来制定条件。文档也对 with_parent()的目的进行了澄清。 - [orm]
mapper()的 include_properties 和 exclude_properties 参数现在除了字符串外,还接受列对象作为成员。这样,可以消除 join()中的同名列对象等情况。 - [orm]
如果对包含多个具有相同名称的列的 join 或其他单个可选择项创建了映射器,并且这些列没有明确命名为相同或不同的属性(或排除),则现在会发出警告。在 0.7 版本中,此警告将变为异常。请注意,当组合发生在继承的结果时,不会发出此警告,因此属性仍然可以自然地被覆盖。在 0.7 版本中,这将进一步改进。
参考:#1896 - [orm]
mapper()的 primary_key 参数现在可以指定一系列列,这些列仅是映射可选择项的计算“主键”列的子集,而不会引发错误。这有助于处理情况,其中可选择项的有效主键比实际标记为“主键”的可选择项中的列数更简单,例如在两个表的主键列上进行连接。
参考:#1896 - [orm]
现在已删除的对象会得到一个名为‘deleted’的标志,这会阻止将对象重新添加到会话中,因为以前对象会在其属性被访问之前悄悄地存在于标识映射中。make_transient()函数现在会重置此标志以及“key”标志。 - [orm]
make_transient()可以安全地在已经是瞬态实例上调用。 - [orm]
如果在 mapper()中没有在映射的可选择项中或在 with_polymorphic 可选择项中以直接或派生形式存在 polymorphic_on 列,则会发出警告,而不是默默地忽略它。预计在 0.7 版本中将变为异常。 - [orm]
当 relationship()配置具有模糊参数时,再次查看发出的一系列错误消息。现在不再提到“foreign_keys”设置,因为几乎不需要,最好用户设置正确的 ForeignKey 元数据,这是现在的建议。如果使用了‘foreign_keys’并且不正确,消息会建议该属性可能是不必要的。增加了属性的文档。这是因为 ML 上所有困惑的 relationship()用户似乎都试图使用 foreign_keys,因为消息只会让他们更加困惑,因为 Table 元数据更加清晰。 - [orm]
如果“secondary”表没有 ForeignKey 元数据并且没有设置 foreign_keys,即使用户传递了错误的信息,也假定 primary/secondaryjoin 表达式应仅考虑“secondary”中的所有列为外键。在任何情况下,“secondary”中的外键都不可能在其他地方。现在发出警告而不是错误,并且映射成功。
参考:#1877 - [orm]
将一个 o2m 对象从一个集合移动到另一个集合,或者通过 m2o 更改引用对象,其中外键也是主键的成员,现在在 flush 期间将更加仔细地检查,如果“多”一侧的外键值的变化是由于“一”一侧主键的变化引起的,或者如果“一”只是一个不同的对象。在一个情况下,具有级联功能的数据库可能已经级联了该值,我们需要查看“新”的 PK 值来执行 UPDATE,在另一种情况下,我们需要继续查看“旧”的 PK 值。我们现在查看“旧”的 PK 值,假设 passive_updates=True,除非我们知道触发更改的是 PK 切换。
参考:#1856 - [orm]
version_id_col 的值可以手动更改,这将导致行的 UPDATE。版本化的 UPDATE 和 DELETE 现在使用 version_id_col 的“已提交”值作为 WHERE 子句,而不是挂起的更改值。如果属性上存在手动更改,则版本生成器也会被绕过。
参考:#1857 - [orm]
修复了与具体继承映射器一起使用 merge()时的问题。这样的映射器经常具有所谓的“具体”属性,即“禁用”从父类传播的子类属性 - 这些属性需要允许 merge()操作无效。 - [orm]
为 column_mapped_collection 指定非基于列的参数,包括字符串、text()等,将引发一个错误消息,明确要求一个列元素,不再提供关于 text()或 literal()的错误信息。
参考:#1863 - [orm]
同样地,对于 relationship()、foreign_keys、remote_side、order_by 等 - 所有基于列的表达式都是强制执行的 - 字符串列表明确禁止,因为这是一个非常常见的错误。 - [orm]
动态属性不支持集合填充 - 当调用 set_committed_value()时添加了一个断言,以及当将 joinedload()或 subqueryload()选项应用于动态属性时,而不是失败/静默失败。
参考:#1864 - [orm]
修复了一个 bug,即从一个具有相同列但具有不同标签名称的 Query 生成的 Query,在某些 UNION 情况下通常会失败,无法完全将内部列传播到外部查询。
参考:#1852 - [orm]
当提供一个未映射的实例时,object_session()会引发正确的 UnmappedInstanceError。
参考:#1881 - [orm]
对计算的 Mapper 属性应用了进一步的记忆化,显著减少了在高度多态映射配置中的运行时 mapper.py 调用次数(约 90%)。 - [orm]
由版本控制示例使用的 mapper _get_col_to_prop 私有方法已经过时;现在请使用 mapper.get_property_by_column(),这将保持为此公共方法。 - [ORM]
如果在以前是 NULL 的列上进行版本控制,那么版本示例现在可以正确地工作了。
示例
- [示例]
beaker_caching 示例已经重新组织,使得 Session、缓存管理器、declarative_base 成为环境的一部分,并且自定义的缓存代码是可移植的,现在在“caching_query.py”中。这样可以让示例更容易“插入”到现有项目中。 - [示例]
history_meta 版本控制示例在复制列时设置了“unique=False”,这样版本控制表就可以处理具有重复值的多行。
参考:#1887
引擎
- [引擎]
对已经耗尽、已经关闭或者不是返回结果的结果集调用 fetchone() 或类似方法现在会在所有情况下都引发 ResourceClosedError 错误,这是 InvalidRequestError 的子类,无论后端如何。以前,一些 DBAPI 会引发 ProgrammingError(例如 pysqlite),其他一些则会返回 None,导致下游出现故障(例如 MySQL-python)。 - [引擎]
修复了 Connection 中的一个 bug,即如果在第一个连接池连接的“初始化”阶段发生了“断开”事件,那么当 Connection 尝试使 DBAPI 连接无效时会引发 AttributeError。
参考:#1894 - [引擎]
Connection、ResultProxy 以及 Session 现在对于所有“此连接/事务/结果已关闭”类型的错误使用 ResourceClosedError。 - [引擎]
Connection.invalidate() 可以被多次调用,后续调用不会产生任何效果。
SQL
- [SQL]
对 alias() 构造调用 execute() 方法将在 0.7 版本中待废弃,因为它本身不是一个“可执行”的构造。它当前“代理”其内部元素,并且条件上是“可执行”的,但这不是我们当前喜欢的模糊性。 - [SQL]
ClauseElement 的 execute() 和 scalar() 方法现在已经适当地移动到了 Executable 子类。ClauseElement.execute()/ scalar() 仍然存在,并在 0.7 版本中待废弃,但请注意,如果你不是 Executable(除非你是 alias(),请参阅前面的注释),这些方法总是会引发错误。 - [SQL]
为 Numeric->Integer 添加了基本的数学表达式强制转换,以便无论表达式的方向如何,结果类型都是 Numeric。 - [SQL]
更改了在 Column 上使用“index=True”标志生成截断的“auto”索引名称的方案。截断只对自动生成的名称起作用,不适用于用户定义的名称(会引发错误),截断方案本身现在基于标识符名称的 md5 哈希的片段,这样具有相似名称的多个列的索引仍然具有唯一的名称。
参考:#1855 - [sql]
生成的索引名称也是基于“最大索引名称长度”属性的,这个属性与“最大标识符长度”是分开的 - 这是为了迎合 MySQL,因为 MySQL 对索引名称的最大长度为 64,与其总体最大长度 255 是分开的。
参考:#1412 - [sql]
如果将 text() 构造放置在面向列的情况下,它至少会返回 NULLTYPE 作为其类型,而不是 None,这使得它可以比以前更自由地用于临时列表达式。然而,literal_column() 仍然是更好的选择。 - [sql]
在 ForeignKey 无法解析目标时,错误消息中添加了父表/列、目标表/列的完整描述。 - [sql]
修复了一个 bug,即在反射表中替换复合外键列会导致尝试第二次从表中删除反射的约束,从而引发 KeyError。
参考:#1865 - [sql]
_Label 构造,即每当你说 somecol.label() 时产生的构造,现在在其“proxy_set”中计算自身与其包含列的代理集的并集,而不是直接返回包含列的代理集。这允许依赖于 _Labels 本身身份的列对应操作返回正确的结果。 - [sql]
修复 ORM bug。
参考:#1852
postgresql
- [postgresql]
修复了 psycopg2 方言,使用其 set_isolation_level() 方法,而不是依赖于基本的 “SET SESSION ISOLATION” 命令,因为否则 psycopg2 在每个新事务中重置隔离级别。
mssql
- [mssql]
修复了与 pymssql 后端一起使用“默认模式”查询的问题。
oracle
- [oracle]
在 Oracle 方言中添加了 ROWID 类型,用于那些可能需要显式 CAST 的情况。
参考:#1879 - [oracle]
Oracle 反射索引已经调整,以便反射包含一些或全部主键列的索引,但不包含与主键相同的列集的索引。在反射中跳过包含与主键相同列的索引,因为在这种情况下,该索引被假定为自动生成的主键索引。以前,任何包含 PK 列的索引都会被跳过。感谢 Kent Bower 提供的补丁。
参考:#1867 - [oracle]
Oracle 现在反映主键约束的名称 - 还要感谢 Kent Bower。
参考:#1868
杂项
- [declarative]
如果@classproperty 与常规类绑定的 mapper 属性属性一起使用,它将在初始化期间被调用以获取实际属性值。目前,在不是 mixin 的声明类的列或关系属性上使用@classproperty 没有任何优势 - 评估与未使用@classproperty 时同时进行。但至少在这里,我们允许其按预期运行。 - [声明式]
修复了“无法添加额外列”的错误,显示的名称不正确的问题。 - [Firebird]
修复了一个 bug,即如果“default”关键字为小写,则列默认值将无法反映。 - [Informix]
应用了来自的补丁,以重新启用基本的 Informix 功能。我们依赖最终用户的测试来确保 Informix 在某种程度上正常工作。
参考:#1904 - [文档]
文档已重新组织,删除了“API 参考”部分 - 所有公共 API 的 docstrings 都移动到了讨论它的主要文档部分的上下文中。主要文档分为“SQLAlchemy 核心”和“SQLAlchemy ORM”部分,mapper/relationship 文档已拆分出来。许多部分已被重写和/或重新组织。
ORM
- [ORM]
ConcurrentModificationError 的名称已更改为 StaleDataError,并且描述性错误消息已经修订以准确反映问题所在。在可预见的未来,这两个名称将保持可用,以供在“except:”子句中指定 ConcurrentModificationError 的方案使用。 - [ORM]
向 identity map 添加了互斥锁,该锁用于互斥删除操作,这些操作针对迭代方法,在返回可迭代对象之前现在会预先缓冲。这是因为异步 gc 可以随时通过 gc 线程删除项目。
参考:#1891 - [ORM]
Session 类现在存在于 sqlalchemy.orm.*中。我们正在摆脱使用 create_session(),对于需要一步构造 Session 的情况,它具有非标准的默认值。大多数用户应该继续使用 sessionmaker()进行一般用途,然而。 - [ORM]
query.with_parent()现在接受瞬态对象,并将使用其 pk/fk 属性的非持久化值来制定条件。文档还澄清了 with_parent()的目的。 - [ORM]
mapper()的 include_properties 和 exclude_properties 参数现在除了字符串外还接受列对象作为成员。这样,可以消除在 join()中存在的同名列对象的歧义。 - [ORM]
如果对一个连接或其他单个可选择的映射器创建了一个包含多个具有相同名称的列的警告,而这些列没有明确命名为相同或不同的属性(或排除),则会发出警告。在 0.7 版本中,此警告将变为异常。请注意,当组合发生在继承的结果时,不会发出此警告,因此属性仍然允许自然覆盖。在 0.7 版本中,这将进一步改进。
参考:#1896 - [orm]
mapper()的 primary_key 参数现在可以指定一系列列,这些列仅是映射可选择的“主键”列的子集,而不会引发错误。这对于可选择的有效主键比实际标记为“primary_key”的列数更简单的情况很有帮助,例如在两个表的主键列上进行连接。
参考:#1896 - [orm]
已删除的对象现在会得到一个名为‘deleted’的标志,这会阻止该对象重新添加到会话中,因为以前对象会悄无声息地存在于标识映射中,直到访问其属性。make_transient()函数现在会重置此标志以及“key”标志。 - [orm]
make_transient()现在可以安全地在已经是瞬态实例上调用。 - [orm]
如果在映射器()中发出警告,如果 polymorphic_on 列在映射的可选择中或在 with_polymorphic 可选择中不存在,而不是悄悄地忽略它。在 0.7 版本中,预计这将变为异常。 - [orm]
当 relationship()配置具有模糊参数时,再次通过一系列错误消息。不再提及“foreign_keys”设置,因为几乎从不需要,并且更希望用户设置正确的 ForeignKey 元数据,这现在是推荐的做法。如果使用了‘foreign_keys’并且不正确,消息会建议该属性可能是不必要的。属性的文档得到加强。这是因为所有在 ML 上困惑的 relationship()用户似乎都试图使用 foreign_keys,因为消息只会进一步使他们困惑,而 Table 元数据则更清晰。 - [orm]
如果“secondary”表没有 ForeignKey 元数据并且没有设置 foreign_keys,即使用户传递了错误的信息,也假定主/次级联表达式应仅考虑“secondary”中的所有列为外键。在任何情况下,“secondary”中的外键都不可能在其他地方。现在发出警告而不是错误,并且映射成功。
参考:#1877 - [orm]
将一个 o2m 对象从一个集合移动到另一个集合,或者通过 m2o 更改引用对象,其中外键也是主键的成员,现在在 flush 期间将更加仔细地进行检查,如果“many”一侧的外键值的更改是由于“one”一侧主键的更改导致的,或者如果“one”只是一个不同的对象。在一个情况下,可级联的 DB 已经级联了该值,我们需要查看“new”PK 值来执行 UPDATE,在另一个情况下,我们需要继续查看“old”。我们现在查看“old”,假设 passive_updates=True,除非我们知道它是触发更改的 PK 切换。
参考:#1856 - [orm]
version_id_col 的值可以手动更改,这将导致行的 UPDATE。现在,版本化的 UPDATE 和 DELETE 使用 WHERE 子句中的 version_id_col 的“committed”值,而不是挂起的更改值。如果属性上存在手动更改,则版本生成器也将被绕过。
参考:#1857 - [orm]
修复了在与具体继承的映射器一起使用 merge() 时的使用情况。这样的映射器经常具有所谓的“具体”属性,这些属性是“禁用”从父类传播的子类属性 - 这些属性需要允许 merge() 操作通过而不产生效果。 - [orm]
指定非基于列的参数作为 column_mapped_collection,包括字符串、text() 等,将会触发错误消息,明确要求使用列元素,不再误导使用 text() 或 literal() 关于不正确的信息。
参考:#1863 - [orm]
类似地,对于 relationship()、foreign_keys、remote_side、order_by - 所有基于列的表达式都被强制执行 - 字符串列表明确不允许,因为这是一个非常常见的错误。 - [orm]
动态属性不支持集合填充 - 当调用 set_committed_value() 时,以及将 joinedload() 或 subqueryload() 选项应用于动态属性时,添加了一个断言,而不是失败/静默失败。
参考:#1864 - [orm]
修复了一个错误,即从具有相同列但具有不同标签名称的列重复的 Query 生成的 Query 在某些 UNION 情况下会无法完全传播内部列到外部查询。
参考:#1852 - [orm]
当出现未映射实例时,object_session() 会引发正确的 UnmappedInstanceError。
参考:#1881 - [orm]
对计算的 Mapper 属性应用了更进一步的记忆化,在重度多态映射配置中减少了显著(约 90%)的 runtime mapper.py 调用次数。 - [orm]
版本示例中使用的 mapper _get_col_to_prop 私有方法已被弃用;现在请使用 mapper.get_property_by_column(),这将保持为此公共方法。 - [ORM]
版本示例现在在以前为 NULL 的列上进行版本控制时可以正常工作。
示例
- [示例]
beaker_caching 示例已重新组织,使得 Session、缓存管理器、declarative_base 成为环境的一部分,自定义缓存代码现在在“caching_query.py”中,这使得示例更容易“插入”到现有项目中。 - [示例]
history_meta 版本控制方案在复制列时设置“unique=False”,以便版本控制表处理具有重复值的多行。
参考:#1887
引擎
- [引擎]
在已经耗尽、已关闭或不是返回结果的结果上调用 fetchone()或类似方法现在会在所有情况下引发 ResourceClosedError,这是 InvalidRequestError 的子类,不受后端影响。以前,一些 DBAPI 会引发 ProgrammingError(例如 pysqlite),其他会返回 None 导致下游故障(例如 MySQL-python)。 - [引擎]
修复了 Connection 中的错误,如果在第一个连接池连接的“初始化”阶段发生“断开”事件,那么当 Connection 尝试使 DBAPI 连接无效时会引发 AttributeError。
参考:#1894 - [引擎]
Connection、ResultProxy 以及 Session 现在对所有“此连接/事务/结果已关闭”类型的错误使用 ResourceClosedError。 - [引擎]
Connection.invalidate()可以被多次调用,后续调用不会产生任何效果。
SQL
- [SQL]
在 alias()构造上调用 execute()在 0.7 版本中将被用,因为它本身不是一个“可执行”构造。它当前“代理”其内部元素,并且有条件地“可执行”,但这不是我们现在喜欢的模糊性。 - [SQL]
ClauseElement 的 execute()和 scalar()方法现在适当地移动到了 Executable 子类中。ClauseElement.execute()/scalar()仍然存在,并且在 0.7 版本中将被弃用,但请注意,如果您不是 Executable(除非您是 alias(),请参见前面的说明),这些方法无论如何都会引发错误。 - [SQL]
为 Numeric->Integer 添加了基本的数学表达式强制转换,以便无论表达式的方向如何,结果类型始终为 Numeric。 - [SQL]
更改了在 Column 上使用“index=True”标志生成截断的“auto”索引名称的方案。截断仅在自动生成的名称上进行,而不是在用户定义的名称上(否则会引发错误),截断方案本身现在基于标识符名称的 md5 哈希的片段,以便具有类似名称的列上的多个索引仍具有唯一名称。
参考:#1855 - [sql]
生成的索引名称也基于“最大索引名称长度”属性,该属性与“最大标识符长度”分开 - 这是为了取悦 MySQL,因为 MySQL 对索引名称的最大长度为 64,而总体最大长度为 255。
参考:#1412 - [sql]
如果将 text()构造放置在面向列的情况下,它至少会返回 NULLTYPE 作为其类型,而不是 None,这使得它可以比以前更自由地用于临时列表达式。但是,literal_column()仍然是更好的选择。 - [sql]
在 ForeignKey 无法解析目标时引发错误消息时,添加了父表/列,目标表/列的完整描述。 - [sql]
修复了一个错误,即在反射表中替换复合外键列会导致尝试第二次从表中删除反射的约束,从而引发 KeyError。
参考:#1865 - [sql]
_Label 构造,即每当您说 somecol.label()时产生的构造,现在将其自身计入其“proxy_set”中,与其包含的列的 proxy set 相结合,而不是直接返回包含的列的 proxy set。这允许依赖 _Label 本身身份的列对应操作返回正确的结果。 - [sql]
修复了 ORM 错误。
参考:#1852
postgresql
- [postgresql]
修复了 psycopg2 方言,使用其 set_isolation_level()方法,而不是依赖基本的“SET SESSION ISOLATION”命令,否则 psycopg2 会在每个新事务中重置隔离级别。
mssql
- [mssql]
修复了与 pymssql 后端一起使用“默认模式”查询的问题。
oracle
- [oracle]
在 Oracle 方言中添加了 ROWID 类型,用于那些可能需要显式 CAST 的情况。
参考:#1879 - [oracle]
Oracle 反射索引已经调整,以便反射包含一些或全部主键列,但不包含与主键相同的列集的索引。在反射中跳过包含与主键相同列的索引,因为在这种情况下,该索引被假定为自动生成的主键索引。以前,任何包含 PK 列的索引都会被跳过。感谢 Kent Bower 的补丁。
参考:#1867 - [oracle]
现在 Oracle 反映了主键约束的名称 - 这也要感谢 Kent Bower。
参考:#1868
杂项
- [declarative]
如果 @classproperty 与常规的类绑定映射器属性属性一起使用,则在初始化期间将调用它以获取实际的属性值。目前,在不是 mixin 的声明类的列或关系属性上使用 @classproperty 没有任何优势 - 评估的时间与未使用 @classproperty 时相同。但是在这里,我们至少允许它按预期工作。 - [declarative]
修复了“无法添加额外列”的错误消息显示错误名称的 bug。 - [firebird]
修复了一个 bug,即如果“default”关键字为小写,则列默认值将失败反映。 - [informix]
应用了来自的补丁,以重新启用基本的 Informix 功能。我们依赖最终用户的测试来确保 Informix 在某种程度上正常工作。
参考:#1904 - [documentation]
文档已重新组织,以至于“API 参考”部分已经消失 - 所有从那里的文档字符串中公开的 API 都移动到了主文档部分的上下文中,该部分讨论了它。主文档分为“SQLAlchemy Core”和“SQLAlchemy ORM”两个部分,映射器/关系文档已被拆分。许多部分已被重写和/或重新组织。
SqlAlchemy 2.0 中文文档(六十七)(4)https://developer.aliyun.com/article/1560843