0.6 变更日志
0.6.9
发布日期:2012 年 5 月 5 日星期六
一般
- [general]
调整了“importlater”机制,该机制在内部用于解决导入循环,使得在导入 sqlalchemy 或 sqlalchemy.orm 之后完成对 import 的使用,从而避免在应用程序启动新线程后继续使用 import,修复了问题。
参考:#2279
orm
- [orm] [bug]
修复了在查询.get()中对用户映射对象在布尔上下文中的不当评估。
参考:#2310 - [orm] [bug]
修复了当意外传递元组给 session.query() 时引发的错误格式化。
参考:#2297 - [orm]
修复了一个错误,即由 query.join() 使用的源子句在针对将多个实体组合在一起的列表达式时会不一致。
参考:#2197 - [orm]
修复了仅在 Python 3 中显现的错误,即在 flush 期间对持久性 + 待处理对象进行排序会产生非法比较,如果持久性对象的主键不是单个整数。
参考:#2228 - [orm]
修复了一个错误,即在从具有 join 条件的子表到自身的 joined-inh 结构上使用 query.join() + aliased=True 时,将不适当地将主实体转换为连接实体。
参考:#2234 - [orm]
修复了一个错误,即 mapper.order_by 属性在子查询急加载中的“内部”查询中将被忽略。
参考:#2287 - [orm]
修复了一个错误,即如果映射类重新定义了 hash() 或 eq() 为非标准内容,这是一个受支持的用例,因为 SQLA 不应该查询这些内容,如果该类是“复合”(即非单个实体)结果集的一部分,则会查询这些方法。
参考:#2215 - [orm]
修复了一个微妙的错误,导致如果出现:column_property()针对子查询 + joinedload + LIMIT + 按列属性排序,则 SQL 会崩溃。
参考:#2188 - [orm]
由 with_parent 生成的连接条件以及针对父级使用“dynamic”关系时将生成唯一的 bindparams,而不是错误地重复相同的 bindparam。
参考:#2207 - [orm]
修复了 Query 中的“无语句条件”断言,如果在调用 from_statement() 后调用生成方法,则会尝试引发异常。
参考:#2199 - [orm]
Cls.column.collate(“some collation”) 现在可用。
参考:#1776
示例
- [示例]
调整 dictlike-polymorphic.py 示例以应用 CAST,使其在 PG 和其他数据库上运行。
参考:#2266
引擎
- [引擎]
回溯了在 0.7.4 中引入的修复,确保在尝试在保存点和两阶段事务上调用 rollback()/prepare()/release() 之前连接处于有效状态。
参考:#2317
SQL
- [SQL]
修复了两个关于在可选择的列中的列对应的微妙错误,一个是重复使用相同标记的子查询,另一个是当标记被“分组”并丢失时。影响。
参考:#2188 - [SQL]
修复了当与某些方言一起使用 String 类型时,“warn on unicode” 标志会被设置的 bug。这个 bug 不在 0.7 版本中。 - [SQL]
修复了 Select 的 with_only_columns() 方法如果传递了可选择的话会失败的 bug。然而,这里的 FROM 行为仍然不正确,所以无论如何你需要 0.7 版本才能使用这种用例。
参考:#2270
模式
- [模式]
当 ForeignKeyConstraint 引用父级中未找到的列名时,添加了一个信息性错误消息。
PostgreSQL
MySQL
- [mysql]
修复了 OurSQL 方言在 XA 命令中使用 ansi-neutral 引号符“’”而不是‘”’的问题。
参考:#2186 - [mysql]
CREATE TABLE 将在 CHARSET 之后放置 COLLATE 选项,这似乎是 MySQL 关于它是否实际上会起作用的任意规则的一部分。
参考:#2225
MSSQL
- [mssql] [bug]
在检索索引名称列表和这些索引中的列名时解码传入的值。
参考:#2269
Oracle
- [oracle]
将 ORA-00028 添加到断开代码中,使用 cx_oracle _Error.code 来获取代码。
参考:#2200 - [oracle]
修复了未生成正确 DDL 的 Oracle.RAW 类型。
参考:#2220 - [oracle]
将 CURRENT 添加到保留字列表中。
参考:#2212
0.6.8
发布日期:2011 年 6 月 5 日 星期日
ORM
- [ORM]
对基于列的实体调用 query.get() 是无效的,现在会引发弃用警告。
参考:#2144 - [ORM]
非主映射器将继承主映射器的 _identity_class。这样,针对通常处于继承映射中的类建立的非主映射器将产生与主映射器兼容的标识映射结果。
参考:#2151 - [orm]
回溯了 0.7 的标识映射实现,该实现不在删除周围使用互斥体。由于一些用户尽管在 0.6.7 中进行了调整仍然遇到死锁问题;0.7 不使用互斥体的方法似乎不会产生“字典更改大小”问题,这是互斥体的最初理由。
参考:#2148 - [orm]
修复了“无法为目标列‘q’执行同步规则;映射‘X’未映射此列”发出的错误消息,以引用正确的映射器。
参考:#2163 - [orm]
修复了确定“自引用”关系时出现的错误,对于没有与自身相关的 joined-inh 子类或与没有在连接条件中的子子类中的列相关的 joined-inh 子类,没有解决方法。
参考:#2149 - [orm]
在确定父类和子类之间的继承条件时,mapper()将忽略与不相关表的未配置外键。这等同于已应用于声明性的行为。请注意,0.7 有一个更全面的解决方案,改变了 join()本身如何确定 FK 错误。
参考:#2153 - [orm]
修复了映射到匿名别名的映射器如果使用日志记录将失败的错误,因为别名中的未转义%符号。
参考:#2171 - [orm]
修改了在刷新时未检测到“identity”键时出现的消息文本,包括常见原因,即列未正确设置以检测自动增量。
参考:#2170 - [orm]
修复了事务级别的“已删除”集合不会清除已删除状态的错误,如果它们后来变为瞬态,则会引发错误。
参考:#2182
引擎
- [engine]
调整了 RowProxy 结果行的 contains()方法,使其在内部不生成异常抛出;无论列构造是否可以强制转换为字符串,NoSuchColumnError()也将生成其消息。
参考:#2178
sql
- [sql]
修复了如果将 FetchedValue 传递给列 server_onupdate,则其父“列”不会被分配的错误,为所有列默认分配模式添加了��试覆盖。
参考:#2147 - [sql]
修复了将 select() 的标签嵌套在另一个标签中会产生不正确导出列的 bug。其中之一是这会破坏针对另一个 column_property() 的 ORM column_property() 映射。
参考:#2167
postgresql
- [postgresql]
修复了影响 PG 9 的 bug,即反射索引会失败,如果反射的列名已更改。
参考:#2141 - [postgresql]
修复了关于数字数组、MATCH 运算符的一些单元测试修复。修复了潜在的浮点不准确性问题,并且目前某�� MATCH 运算符的测试仅在 EN 本地环境中执行。
参考:#2175
mssql
- [mssql]
修复了 MSSQL 方言中的 bug,即应用于模式限定表的别名会泄漏到封闭的 select 语句中。
参考:#2169 - [mssql]
修复了 DATETIME2 类型在结果集或绑定参数中使用时在“适应”步骤中失败的 bug。此问题不在 0.7 版本中。
参考:#2159
0.6.7
发布日期:2011 年 4 月 13 日(星期三)
orm
- [orm]
加强了关于标识映射迭代与删除的互斥锁,试图减少极其罕见的重新进入 gc 操作导致死锁的机会。可能会在 0.7 版本中移除互斥锁。
参考:#2087 - [orm]
向 Query.subquery() 添加了一个 name 参数,以允许为别名对象分配固定名称。
参考:#2030 - [orm]
当连接表继承的映射器在本地映射表上没有主键(但在超类表上有主键)时,会发出警告。
参考:#2019 - [orm]
修复了多态层次结构中的“中间”类如果没有指定“polymorphic_identity”也没有“polymorphic_on”列时会出现奇怪错误的 bug,导致在查询该目标时加载错误的类。在使用单表继承时也会发出正确的 WHERE 条件。
参考:#2038 - [orm]
修复了具有 SQL 或服务器端默认值的列,如果使用 include_properties 或 exclude_properties 从映射中排除,将导致 UnmappedColumnError 的 bug。
参考:#1995 - [orm]
在罕见情况下,如果在父对象被取消引用后发生了追加或类似事件的情况,会发出警告,这会阻止将父对象标记为会话中的“脏”状态。这将在 0.7 版本中成为异常。
参考:#2046 - [orm]
修复了 query.options() 中的一个 bug,其中应用于使用字符串键的延迟加载的路径可能会与错误的实体上的同名属性重叠。注意,0.7 版本已更新了此修复版本。
参考文献:#2098 - [orm]
重写了尝试刷新非多态子类时引发的异常的异常信息。
参考文献:#2063 - [orm]
关于反向引用的状态处理进行了一些修复,通常在 autoflush=False 时,当反向引用的集合没有真正处理没有净变化的添加/删除时。感谢 Richard Murri 提供了测试用例 + 补丁。
参考文献:#2123 - [orm]
如果使用 from_self(),则“having”子句将从内部复制到外部查询中。
参考文献:#2130
examples
- [examples]
Beaker 缓存示例允许在 query_callable() 函数中使用 “query_cls” 参数。
参考文献:#2090
engine
- [engine]
修复了 QueuePool、SingletonThreadPool 中的错误,在溢出或定期 cleanup() 时丢弃的连接未显式关闭,导致垃圾回收任务未执行。这通常只影响像 Jython 和 PyPy 这样的非引用计数后端。感谢 Jaimy Azle 发现了这个问题。
参考文献:#2102
sql
- [sql]
Column.copy(),如在 table.tometadata() 中使用,将复制 ‘doc’ 属性。
参考文献:#2028 - [sql]
在 resultproxy.c 扩展中添加了一些 defs,以便扩展能够在 Python 2.4 上编译和运行。
参考文献:#2023 - [sql]
编译器扩展现在支持重写 expression._BindParamClause 的默认编译,包括 insert()/update() 语句中 VALUES/SET 子句中的自动生成绑定也将使用新的编译规则。
参考文献:#2042 - [sql]
为 ResultProxy 添加了访问器 “returns_rows”、“is_insert”
参考文献:#2089 - [sql]
select() 中的 limit/offset 关键字以及传递给 select.limit()/offset() 的值将被强制转换为整数。
参考文献:#2116
postgresql
- [postgresql]
当显式序列执行派生 SERIAL 列的自动生成序列的名称时,目前只有在 implicit_returning=False 时才会发生,现在会适应如果表名 + 列名大于 63 个字符,则使用与 PostgreSQL 相同的逻辑。
参考文献:#1083 - [postgresql]
将一个额外的 libpq 消息添加到“断开连接”异常列表中,“无法从服务器接收数据”
参考:#2044 - [postgresql]
添加了 postgresql 方言的 RESERVED_WORDS。
参考:#2092 - [postgresql]
修复了 BIT 类型,允许“length”参数和“varying”参数。反射也修复了。
参考:#2073
MySQL
- [mysql]
在 create_engine()中,oursql 方言接受与 MySQLdb 相同的“ssl”参数。
参考:#2047
SQLite
- [sqlite]
修复了没有列名创建的外键反射失败的错误。
参考:#2115
MSSQL
- [mssql]
重写了用于获取视图定义的查询,通常在使用 Inspector 接口时,使用 sys.sql_modules 而不是信息模式,从而允许完全返回超过 4000 个字符的视图定义。
参考:#2071
Oracle
- [oracle]
现在正确地将对 cx_oracle 的绑定参数键进行转换,以便与会引起列本身需要引号或者是为列生成的绑定参数,例如具有特殊字符、下划线、非 ASCII 字符的名称。
参考:#2100 - [oracle]
Oracle 方言添加了 use_binds_for_limits=False create_engine()标志,将 LIMIT/OFFSET 值内联呈现,而不是作为绑定,据说修改了 Oracle 使用的执行计划。
参考:#2116
其他
- [informix]
添加了 informix 方言的 RESERVED_WORDS。
参考:#2092 - [firebird]
如果将“implicit_returning”标志设置为 False,则在 create_engine()上将其视为有效。
参考:#2083 - [ext]
horizontal_shard ShardedSession 类接受公共 Session 参数“query_cls”作为构造函数参数,以启用对 ShardedQuery 的进一步子类化。
参考:#2090 - [declarative]
添加了对在声明类的列属性上使用名称‘metadata’的情况的明确检查。
参考:#2050 - [declarative]
修复错误消息引用旧的@classproperty 名称以引用@declared_attr
参考:#2061 - [declarative]
mapper_args 中的参数如果不是“可哈希的”,则不会被错误地视为总是可哈希的,可能是列参数。
参考:#2091 - [documentation]
记录了 SQLite DATE/TIME/DATETIME 类型。
参考:#2029
0.6.6
发布日期:2011 年 1 月 8 日(星期六)
orm
- [orm]
修复了一个 bug,即在干净的对象上发生非“mutable”属性修改事件,除了之前的可变属性更改之外,对象将无法强引用自身在标识映射中。这将导致对象被垃圾回收,丢失任何之前未保存在“mutable changes”字典中的更改。 - [orm]
修复了“passive_deletes=‘all’”未在 flush 期间向懒加载器传递正确符号的 bug,从而导致不必要的加载。
参考:#2013 - [orm]
修复了阻止复合映射属性在映射选择语句中使用的 bug。请注意,复合的工作方式在 0.7 中将发生重大变化。
参考:#1997 - [orm]
active_history 标志也添加到 composite()。该标志在 0.6 中没有效果,而是一个用于向前兼容性的占位符标志,因为它在 0.7 中适用于复合物。
参考:#1976 - [orm]
修复了 uow bug,即传递给 Session.delete()的过期对象在删除对象时不会考虑未加载的引用或集合,尽管 passive_deletes 保持默认值 False。
参考:#2002 - [orm]
当在继承映射器上指定 version_id_col 时,如果继承的映射器已经有一个,并且这些列表达式不相同时,会发出警告。
参考:#1987 - [orm]
如果在 joinedload()连接链中的先前连接是外连接,则“innerjoin”标志不会沿着连接链生效,从而允许正确返回没有引用子行的主行。
参考:#1954 - [orm]
修复了关于“subqueryload”策略的错误,即如果实体是 aliased()构造,则策略将失败。
参考:#1964 - [orm]
修复了关于“subqueryload”策略的 bug,即如果使用形式为 A->joined-subclass->C 的多级加载,则连接将失败。
参考:#2014 - [orm]
修复了通过-1 对 Query 对象进行索引的错误。它错误地转换为导致 IndexError 的空切片-1:0。
参考:#1968 - [orm]
映射器参数“primary_key”可以作为单个列传递,也可以作为列表或元组传递。以标量值为例的文档示例已更改为列表。
参考:#1971 - [orm]
向 relationship()和 column_property()添加了 active_history 标志,强制属性事件始终加载“旧”值,以便 attributes.get_history()可以访问它。
参考:#1961 - [orm]
如果复合键中的参数数量过大或过小,Query.get() 将会引发异常。
参考:#1977 - [orm]
从 0.7 中回溯了“优化获取”修复,改善了联合继承“加载过期行”行为的生成。
参考:#1992 - [orm]
在“primaryjoin”错误中添加了更多详细信息,对于一个异常条件,join 条件对于 viewonly 工作但对于非 viewonly 不工作,且未使用 foreign_keys - 在建议中添加“foreign_keys”。还将“foreign_keys”添加到一般的“direction”错误的建议中。
示例
- [examples]
版本示例现在支持检测关联关系()中的更改。
引擎
- [engine]
当显式使用 Unicode 类型时,只有当 convert_unicode=True 用于引擎或 String 类型时,才会引发针对非 Unicode 绑定数据的“unicode warning”,而不是当 convert_unicode=True 用于引擎或 String 类型时。 - [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.copy() 期间复制了 Column 的‘info’属性,即在声明性 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 的“十进制检测”逻辑,用于具有模糊数值特征的结果集列,现在使用由区域设置/ 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]
修复了递归 bug,当将一个对象从一个引用移动到另一个引用时可能发生,涉及到反向引用,其中发起父类是以前父类的子类(具有自己的 mapper)。 - [orm]
修复了 0.6.4 中的一个回归,如果您在 mapper()上传递一个空列表给“include_properties”。
参考:#1918 - [orm]
修复了 Query 中的标签错误,如果任何列表达式未标记,则 NamedTuple 会错误应用标签。 - [orm]
修复了一个问题,即 query.join()会不适当地将右侧适应为左侧连接的右侧
参考:#1925 - [orm]
Query.select_from()已经加强,以确保后续调用 query.join()将使用 select_from()实体,假设它是一个映射实体而不是一个普通可选择的实体,作为默认的“左”侧,而不是 Query 对象的实体列表中的第一个实体。 - [orm]
当在子事务回滚后(这是在 autocommit=False 模式下刷新失败时发生的情况)继续使用 Session 时引发的异常现在已经重新表述(这是“由于子事务回滚而处于非活动状态”消息)。特别是,如果回滚是由于刷新期间的异常引起的,则消息会说明这种情况,并重申在刷新期间发生的原始异常的字符串形式。如果会话由于显式使用子事务而关闭(这种情况并不常见),消息只会说明这种情况。 - [orm]
当 Mapper 在初始化失败后重复请求其初始化时引发的异常不再假定“hasattr”情况,因为还有其他情况会发出此消息,并且消息也不会多次叠加 - 每次尝试使用时都会得到相同的消息。误称“编译”正在被“初始化”替换。 - [orm]
修复了 query.update()中的 bug,其中‘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”行为进行了轻微改进;文档已澄清 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
- [engine]
修复了 0.6.4 中的一个回归,其中允许一致地引发游标错误的更改破坏了 result.lastrowid 访问器。为 result.lastrowid 添加了测试覆盖范围。请注意,lastrowid 仅由 Pysqlite 和一些 MySQL 驱动程序支持,因此在一般情况下并不是特别有用。 - [engine]
当连接首次被使用时,引擎发出的日志消息现在是“BEGIN (implicit)”,以强调 DBAPI 没有显式的 begin()。 - [engine]
添加了“views=True”选项到 metadata.reflect(),将向正在反映的视图列表中添加可用视图。
参考:#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]
如果给定的表已经存在于目标 MetaData 中,则 Table.tometadata()会发出警告 - 将返回现有的 Table 对象。 - [sql]
如果尚未为列分配名称(即在声明时),则在将其导出到封闭的 select()构造的列集合或在分配名称之前编译包含该列的任何构造的上下文中使用列,将引发一个信息性错误消息。 - [sql]
as_scalar(),label()可以在包含尚未命名列的可选项上调用。
参考:#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
- [tests]
NoseSQLAlchemyPlugin 已移至新包“sqlalchemy_nose”,该包与“sqlalchemy”一起安装。这样���“nosetests”脚本仍然可以正常工作,但也允许在导入 SQLAlchemy 模块之前打开覆盖率,从而使覆盖率能够正常工作。
misc
- [declarative]
@classproperty(即将/现在@declared_attr)对于不是 mixin 的基类以及 mixins 上的 mapper_args,table_args,tablename 生效。
参考:#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]
在标识映射中添加了一个互斥锁,该互斥锁对迭代方法中的删除操作进行了互斥,这些方法现在在返回可迭代对象之前进行了预缓冲。这是因为异步 gc 可以随时通过 gc 线程删除项目。
参考:#1891 - [orm]
Session 类现在存在于 sqlalchemy.orm.* 中。我们正在摆脱使用 create_session(),该函数具有非标准默认值,用于需要一步构造会话的情况。然而,大多数用户应该坚持使用 sessionmaker() 进行一般用途。 - [orm]
query.with_parent() 现在接受瞬态对象,并将使用它们的 pk/fk 属性的非持久化值来制定条件。文档也澄清了 with_parent() 的目的。 - [orm]
include_properties 和 exclude_properties 参数现在接受 Column 对象作为成员,而不仅仅是字符串。这样,可以消除 join() 中的同名 Column 对象等歧义。 - [orm]
如果针对包含多个具有相同名称的列的 join 或其他单个可选择的映射器创建了一个映射器,并且这些列没有明确命名为相同或不同的属性(或排除),则现在会发出警告。在 0.7 中,此警告将是一个异常。请注意,当组合发生时,不会发出此警告作为继承的结果,因此属性仍然允许自然覆盖。在 0.7 中,这将进一步改进。
参考:#1896 - [orm]
mapper() 的 primary_key 参数现在可以指定一系列列,这些列仅是映射可选择的计算“主键”列的子集,而不会引发错误。这有助于在可选择的有效主键比实际标记为“主键”的可选择的列数更简单的情况下,例如在两个表的主键列上进行连接时。
参考:#1896 - [orm]
已删除的对象现在会得到一个名为 ‘deleted’ 的标志,这将阻止该对象被重新添加到会话中,因为以前该对象将悄悄地存在于标识映射中,直到其属性被访问。make_transient() 函数现在重置此标志以及“key”标志。 - [orm]
make_transient() 可以安全地在已经瞬态的实例上调用。 - [orm]
在 mapper() 中如果 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]
在 flush 期间,如果从一个集合中移动一个 o2m 对象到另一个集合,或者通过更改 m2o 引用的对象,其中外键也是主键的成员,现在将更加谨慎地检查,如果“多”一侧的外键值的更改是由于“一”侧主键的更改引起的,或者如果“一”侧只是一个不同的对象。在一种情况下,可进行级联的 DB 已经级联了该值,我们需要查看“新”PK 值以进行 UPDATE,在另一种情况下,我们需要继续查看“旧”的 PK。我们现在查看“旧”的 PK,假设 passive_updates=True,除非我们知道触发更改的是 PK 切换。
参考资料:#1856 - [orm]
可以手动更改 version_id_col 的值,这将导致行的 UPDATE。版本化的 UPDATE 和 DELETE 现在使用 version_id_col 的“committed”值而不是待定的更改值作为 WHERE 子句,并且如果属性上存在手动更改,则版本生成器也会被绕过。
参考资料:#1857 - [orm]
修复了在与具体继承的映射器一起使用 merge() 时的使用情况。这种映射器经常具有所谓的“具体”属性,即“禁用”从父级传播的子类属性 - 这些属性需要允许 merge() 操作通过而不产生效果。 - [orm]
对于 column_mapped_collection 的非列基础参数的指定,包括 string、text() 等,将会引发一个错误消息,明确要求列元素,不再误导关于 text() 或 literal() 的错误信息。
参考:#1863 - [orm]
类似地,对于 relationship()、foreign_keys、remote_side、order_by - 所有基于列的表达式都受到强制约束 - 明确禁止使用字符串列表,因为这是一个非常常见的错误 - [orm]
动态属性不支持集合填充 - 当调用 set_committed_value() 时添加了一个断言,以及当对动态属性应用 joinedload() 或 subqueryload() 选项时,而不是失败 / 静默失败。
参考:#1864 - [orm]
修复了一个 bug,该 bug 导致从一个具有不同标签名重复的同一列的查询派生的查询,在一些 UNION 情况下通常会失败,无法完全传播内部列到外部查询。
参考:#1852 - [orm]
当提供一个未映射实例时,object_session() 现在会引发正确的 UnmappedInstanceError。
参考:#1881 - [orm]
对计算的 Mapper 属性进一步进行了记忆化处理,在高度多态映射配置中显著减少了(约 90%)运行时 mapper.py 的调用次数。 - [orm]
被版本示例使用的 mapper _get_col_to_prop 私有方法已被弃用;现在使用 mapper.get_property_by_column(),该方法将保持对此的公共访问。 - [orm]
现在版本示例在以前为 NULL 的列上进行版本控制时工作正常。
示例
- [examples]
beaker_caching 示例已重新组织,使 Session、cache 管理器、declarative_base 成为环境的一部分,并且自定义缓存代码是可移植的,现在在“caching_query.py”中。这使得示例更容易“插入”到现有项目中。 - [examples]
当复制列时,history_meta 版本控制示例设置“unique=False”,以便版本控制表处理具有重复值的多行。
参考:#1887
engine
- [engine]
对已经耗尽、已关闭或不是返回结果的结果执行 fetchone() 或类似操作现在会在所有情况下引发 ResourceClosedError,这是 InvalidRequestError 的子类,无论后端如何。以前,一些 DBAPI 会引发 ProgrammingError(例如 pysqlite),其他会返回 None,导致下游断裂(例如 MySQL-python)。 - [engine]
修复了在Connection
中的一个错误,即如果在第一个连接池连接的“初始化”阶段发生“断开连接”事件,那么当Connection
尝试使 DBAPI 连接无效时将引发AttributeError
。
参考:#1894 - [engine]
对于所有“此连接/事务/结果已关闭”的错误类型,Connection
、ResultProxy
以及Session
现在使用ResourceClosedError
。 - [engine]
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” 标志时,更改了用于生成截断的“自动”索引名称的方案。截断仅针对自动生成的名称进行,而不是用户定义的名称(会引发错误),截断方案本身现在基于标识符名称的 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”中计数自身与其包含列的代理集的并集,而不是直接返回包含列的代理集。这允许依赖于 _Labels 本身身份的列对应操作返回正确的结果。 - [sql]
修复 ORM bug。
参考:#1852
postgresql
- [postgresql]
修复了 psycopg2 方言,使用其 set_isolation_level() 方法而不是依赖基本的 “SET SESSION ISOLATION” 命令,因为否则 psycopg2 在每个新事务中重置隔离级别。
mssql
- [mssql]
修复了与 pymssql 后端一起使用 “default schema” 查询的问题。
oracle
- [oracle]
在 Oracle 方言中添加了 ROWID 类型,用于那些可能需要显式 CAST 的情况。
参考:#1879 - [oracle]
Oracle 索引反映已经调整,以便反映包含一些或全部主键列的索引,但不包含与主键相同的列集的索引。在反映中跳过包含与主键相同列的索引,因为在这种情况下假定该索引是自动生成的主键索引。以前,任何包含 PK 列的索引都会被跳过。感谢 Kent Bower 提供的补丁。
参考:#1867 - [oracle]
Oracle 现在反映主键约束的名称 - 还要感谢 Kent Bower。
参考:#1868
杂项
- [declarative]
如果 @classproperty 与常规的类绑定映射器属性属性一起使用,它将在初始化期间被调用以获取实际属性值。目前,在声明类的列或关系属性上使用 @classproperty 没有任何优势 - 评估与未使用 @classproperty 时同时进行。但至少在这里我们允许它按预期运行。 - [declarative]
修复了“无法添加额外列”消息显示错误名称的 bug。 - [firebird]
修复了一个 bug,即如果 “default” 关键字为小写,则列默认值将无法反映。 - [informix]
应用了来自的补丁,以再次使基本 Informix 功能正常运行。我们依赖最终用户测试来确保 Informix 在某种程度上正常工作。
参考:#1904 - [documentation]
文档已重新组织,使“API 参考”部分消失 - 所有公共 API 的文档字符串都移动到主要文档部分的上下文中。主文档分为 “SQLAlchemy Core” 和 “SQLAlchemy ORM” 部分,映射器/关系文档已拆分出来。许多部分已被重写和/或重新组织。
0.6.3
发布日期:2010 年 7 月 15 日
orm
- [orm]
移除了在单元操作中触发的多对多加载错误,该错误在过期/未加载的集合上不必要地触发。现在,只有在 passive_updates 为 False 且父主键已更改,或者 passive_deletes 为 False 且父项已删除时,才会进行此加载。
参考:#1845 - [orm]
列实体(即 query(Foo.id))在从自身派生的查询更全面地复制其状态时,以及从自身 + 可选择的查询(即 from_self()、union() 等)派生的查询,以便 join() 等操作具有正确的状态。
参考:#1853 - [orm]
修复了 Query.join() 在查询非 ORM 列然后在已经存在 FROM 子句的情况下没有加入 on 子句时会失败的错误,现在会像在没有子句的情况下一样引发一个经过检查的异常。
参考:#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。这里的优势是,int 以 int 返回,而无需涉及 SQLA 类型对象,也无需先转换为 Decimal。
不幸的是,一些奇特的子查询情况甚至可以在单个结果行之间看到不同类型,因此当 Numeric 处理程序被指示返回 Decimal 时,无法充分利用“本机十进制”模式,必须对每个值运行 isinstance() 来检查其是否已经是 Decimal。重新打开
参考:#1840
0.6.2
发布日期:Tue Jul 06 2010
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()等现在将查询.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 会阻止“annotated”表达式元素的重写子句编译正常工作,这些表达式元素通常由 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”属性在内,修复了关于声明性混合的问题
参考:#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 而不是浮点数接收。然后,如果需要,这些数值将被转换为整数或浮点数,否则将保留为无损 Decimal。
参考:#1840
misc
- [firebird]
修复了 do_execute() 中的错误签名,在 0.6.1 中引入的错误。
参考:#1823 - [firebird]
Firebird 方言添加了接受“charset”标志的 CHAR、VARCHAR 类型,以支持 Firebird 的“CHARACTER SET”子句。
参考:#1813 - [declarative]
添加了对 @classproperty 的支持,以从声明性 mixin 提供任何类型的模式/映射构造,包括具有外键、关系、column_property、deferred 的列。如果在 mixin 上指定了任何 MapperProperty 子类,而不使用 @classproperty,则会引发错误。
参考:#1751, #1796, #1805 - [declarative]
一个 mixin 类现在可以定义一个与子类中定义的 table 上存在的列相匹配的列。然而,它不能定义一个在 table 中不存在的列,这里的错误消息现在已经可以正常工作。
参考:#1821 - [compiler] [extension]
当覆盖内置子句构造的编译时,“default”编译器会自动复制过去,因此如果用户定义的编译器特定于某些后端,并且调用了不同后端的编译,就不会引发 KeyError。
参考:#1838 - [documentation]
为 Inspector 添加了文档。
参考:#1820 - [documentation]
修复了 @memoized_property 和 @memoized_instancemethod 装饰器,以便 Sphinx 文档能够捕捉到这些属性和方法,例如 ResultProxy.inserted_primary_key。
参考:#1830
0.6.1
发布日期:Mon May 31 2010
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]
对映射器在使用 UPDATE、INSERT 和 DELETE 表达式时增加了更积极的缓存。假设语句没有附加每个对象的 SQL 表达式,表达式对象在第一次创建后会被映射器缓存,并且它们的编译形式会持久地存储在与相关引擎的持续时间相关的缓存字典中。对于极少数情况下,如果映射器接收到大量不同的列模式作为 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),允许在 create_all()、drop_all()、sorted_tables 中手动放置两个 Table 对象之间的依赖规则。
参考:#1801 - [sql]
修复了一个 bug,该 bug 阻止了包含零的复合主键的隐式 RETURNING 功能正常运行。
参考:#1778 - [sql]
修复了为命名的 UNIQUE 约束生成 ADD CONSTRAINT 时出现的额外空格字符。 - [sql]
修复了 ForeignKeyConstraint 构造函数中“table”参数的 bug
参考:#1571 - [sql]
修复了连接池游标包装器中的 bug,即如果游标在 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 版本的检查,如果是这种情况,将不使用不兼容的“输出类型处理程序”。这将影响十进制精度和一些 Unicode 处理问题。
参考:#1775 - [oracle]
修复了 use_ansi=False 模式,在几乎所有情况下都会产生错误的 WHERE 子句。
参考:#1790 - [oracle]
重新支持使用 cx_oracle 的 Oracle 8,包括自动将 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
杂项
- [引擎]
修复了在 Python 2.4 上构建 C 扩展的问题。
参考:#1781 - [引擎]
在 dispose() 发生后,池类将重用相同的“pool_logging_name”设置。 - [引擎]
引擎获得了一个“execution_options”参数和 update_execution_options() 方法,将应用于此引擎生成的所有连接。 - [firebird]
在 has_table() 和 has_sequence() 中使用的查询中添加了一个标签,以便与不提供结果列标签的旧版本 Firebird 一起使用。
参考:#1521 - [firebird]
在通过查询字符串传递“type_conv”属性时,添加了整数强制转换,以便由 Kinterbasdb 正确解释。
参考:#1779 - [firebird]
将“连接关闭”添加到异常字符串列表中,表示连接已断开。
参考:#1646 - [sqlsoup]
SqlSoup 构造函数接受一个 base 参数,指定用于映射类的基类,默认为 object。
参考:#1783
0.6.0
发布日期:Sun Apr 18 2010
orm
- [orm]
工作单元内部已经重写。具有大量相互依赖对象的工作单元现在可以在没有递归溢出的情况下刷新,因为不再依赖递归调用。对于特定会话状态,内部结构的数量现在保持恒定,而不管映射上存在多少关系。事件流现在对应于由映射器和基于实际工作的关系生成的线性步骤列表,通过单个拓扑排序进行正确排序。刷新操作使用的步骤更少,占用更少的内存。
参考:#1081, #1742 - [orm]
随着 UOW 重写,这也解决了 0.6beta3 中关于具有长依赖循环的工作单元的拓扑循环检测问题。我们现在使用 Guido 编写的算法(感谢 Guido!)。 - [orm]
一对多关系现在在 flush 中维护一个正的父子关联列表,防止之前标记为已删除的父项在级联删除或在旧关联中未将子项从中删除的情况下设置 NULL 外键。
参考:#1764 - [orm]
集合的延迟加载将关闭反向多对一端的默认急加载,因为该加载在定义上是不必要的。
参考:#1495 - [orm]
现在 Session.refresh() 首先对给定实例执行等效的 expire(),以便“刷新-过期”级联被传播。以前,refresh() 不受“刷新-过期”级联的任何影响。这是与 0.6beta2 的行为不同之处,其中传递给 refresh() 的“lockmode”标志会导致版本检查发生。由于实例首先被过期,refresh() 总是将对象升级到最新版本。 - [orm]
当“刷新-过期”级联到达待处理对象时,如果级联还包括“删除孤儿”,则会将对象删除;否则,将简单分离它。
参考:#1754 - [orm]
不再在 topological.py 内部使用 id(obj),因为排序函数现在仅需要可哈希对象。
参考:#1756 - [orm]
ORM 现在默认将所有生成的描述符的文档字符串设置为 None。可以使用 ‘doc’ 进行覆盖(或者如果使用 Sphinx,则属性文档字符串也有效)。 - [orm]
在所有映射器属性可调用以及 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() 方法已经被下划线标记为私有(即私有),签名已更改。
示例
- [examples]
更新了 attribute_shard.py 示例,使用了更健壮的方法来搜索查询中将列与文字值进行比较的二进制表达式。
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’执行选项。一个字典,当连接将一个子句表达式编译成特定于方言和参数的 Compiled 对象时,Compiled 对象将被缓存。用户有责任管理这个字典的大小,它将具有与方言、子句元素、INSERT 或 UPDATE 语句的 VALUES 或 SET 子句中的列名以及 INSERT 或 UPDATE 语句的“批处理”模式相对应的键。 - [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 类型不需要应用任何类型的转换。
misc
- [engines]
C 扩展现在也适用于使用自定义序列作为行(而不仅仅是元组)的 DBAPI。
参考:#1757 - [ext]
编译器扩展现在允许在扩展到子类的基类上使用 @compiles 装饰器,在子类上使用 @compiles 装饰器不会被基类上的 @compiles 装饰器破坏。 - [ext]
当在基于字符串的 relationship() 参数中引用非映射类属性时,Declarative 将引发一个信息性错误消息。 - [ext]
进一步重新调整了 declarative 中的“mixin”逻辑,还允许在 mixin 上作为 @classproperty 动态分配 polymorphic_identity 等参数。 - [firebird]
可以通过在 create_engine() 上设置 ‘enable_rowcount=False’ 来在每个引擎上禁用 result.rowcount 的功能。通常,在任何 UPDATE 或 DELETE 语句之后无条件地调用 cursor.rowcount,因为然后游标被关闭,而 Firebird 需要一个打开的游标才能获取 rowcount。然而,这个调用略微昂贵,因此可以禁用。要在每次执行时重新启用,可以使用 ‘enable_rowcount=True’ 执行选项。
0.6beta3
发布日期:Sun Mar 28 2010
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]
添加了 with_hint() 方法到 Query() 构造中。这直接调用 select().with_hint(),并且还接受实体以及表和别名。请参见下面 SQL 部分中的 with_hint()。
参考:#921 - [orm]
修复了 Query 中的一个 bug,即调用 q.join(prop).from_self(…). join(prop) 时,当在内部使用相同的条件进行连接时,第二个连接未能在子查询之外呈现。 - [orm]
修复了 Query 中的一个 bug,即在使用 aliased() 构造时,如果在 q.from_self() 或 q.select_from() 生成的子查询中引用了基础表(但实际别名未被引用),则会失败。 - [orm]
修复了一个 bug,该 bug 影响了所有 eagerload() 和类似选项,即“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]
添加了 with_hint() 方法到 select() 构造中。指定表/别名、提示文本和可选的方言名称,“hints” 将在语句中的适当位置呈现。适用于 Oracle、Sybase、MySQL。
参考:#921 - [sql]
修复了在 0.6beta2 中引入的 bug,该 bug 会导致列标签在已分配标签的列表达式内部呈现。
参考:#1747
postgresql
- [postgresql]
psycopg2 方言将通过 “sqlalchemy.dialects.postgresql” 记录器名称记录 NOTICE 消息。
参考:#877 - [postgresql]
TIME 和 TIMESTAMP 类型现在直接从 postgresql 方言中可用,这两个类型都添加了 PG 特定参数 ‘precision’。 对于 TIME 和 TIMEZONE 类型,‘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
杂项
- [声明式]
如果 mixin 实现了一个不可预测的 getattribute(),即 Zope 接口,使用 mixin 将不会出错。
参考:#1746 - [声明式]
在 mixins 上使用 @classdecorator 和类似方法来定义 tablename、table_args 等,如果该方法引用了最终子类的属性,现在可以正常工作。
参考:#1749 - [声明式]
在声明式 mixins 上不允许有带外键的关系和列,抱歉。
参考:#1751 - [扩展]
sqlalchemy.orm.shard 模块现在成为扩展,即 sqlalchemy.ext.horizontal_shard。 旧的导入将带有弃用警告。
0.6beta2
发布日期:Sat Mar 20 2010
ORM
- [ORM]
关系() 函数的官方名称现在是 relationship(),以消除对关系代数术语的混淆。 relation() 但是在可预见的将来仍将以相同的功能提供。
参考:#1740 - [ORM]
在 Mapper 中添加了 “version_id_generator” 参数,这是一个可调用对象,给定 “version_id_col” 的当前值,返回下一个版本号。 可用于替代版本控制方案,如 uuid、时间戳。
参考:#1692 - [ORM]
向 Session.refresh()添加了“lockmode”kw 参数,将字符串值传递给 Query 与 with_lockmode()中的相同值,还将对启用了 version_id_col 的映射进行版本检查。 - [orm]
修复了在连接继承情景中调用 query(A).join(A.bs).add_entity(B)会双重添加 B 作为目标并产生无效查询的 bug。
参考:#1188 - [orm]
修复了 session.rollback()中的一个 bug,涉及在将“已删除”对象重新整合到会话之前未删除以前“待定”对象的问题,通常出现在自然主键中。如果它们之间存在主键冲突,删除的附加将在内部失败。现在首先清除了以前“待定”的对象。
参考:#1674 - [orm]
删除了很多没人真正关心的日志记录,剩下的日志记录将响应日志级别的实时更改。不会增加显著的开销。
参考:#1719 - [orm]
修复了 session.merge()中的一个 bug,该 bug 导致类似字典的集合无法合并。 - [orm]
session.merge()与明确不包括“merge”在其级联选项中的关系一起工作-目标将被完全忽略。 - [orm]
如果目标具有该属性的值,session.merge()将不会使现有目标上的现有标量属性过期,即使传入的合并对象没有该属性的值也是如此。这可以防止对现有项进行不必要的加载。但是,如果目标没有该属性,仍会将属性标记为过期,这样就可以满足某些延迟列的约定。
参考:#1681 - [orm]
“allow_null_pks”标志现在称为“allow_partial_pks”,默认为 True,再次起到 0.5 中的作用。除此之外,它也在 merge()内实现,如果标志为 False,则不会为具有部分 NULL 主键的传入实例发出 SELECT。
参考:#1680 - [orm]
修复了 0.6 重新制定的“多对一”优化中的一个 bug,使得对远程表上的非主键列(即针对唯一列的外键)进行更改时,将“旧”值从数据库中拉入,因为如果它在会话中,我们将需要它来进行正确的历史/反向引用账务,而在非主键列上无法从本地标识图中拉取。
参考:#1737 - [orm]
修复了在单表继承关系上调用 has()或类似复杂表达式时可能发生的内部错误。
参考:#1731 - [orm]
query.one()不再对查询应用 LIMIT,以确保完全计算结果中存在的所有对象标识,即使在连接可能隐藏两个或更多行的多个标识的情况下也是如此。作为奖励,由于不再修改查询,现在也可以使用从 from_statement()开始的查询调用 one()。
参考:#1688 - [orm]
现在如果查询一个在标识映射中具有不同类别的标识符的对象,则 query.get()会返回 None,即在使用多态加载时。
参考:#1727 - [orm]
在 query.join()中进行了重大修复,当“on”子句是 aliased()构造的属性时,但已经存在一个指向兼容目标的现有连接时,query 会正确地连接到正确的 aliased()构造,而不是粘附到现有连接的右侧。
参考:#1706 - [orm]
对于不需要在所谓的“行切换”操作期间不必要地更新主键列的修复进行了轻微改进,即在添加+删除具有相同 PK 的两个对象时。
参考:#1362 - [orm]
现在在属性加载或刷新操作由于对象从任何会话中分离而失败时,使用 sqlalchemy.orm.exc.DetachedInstanceError。UnboundExecutionError 特定于绑定到会话和语句的引擎。 - [orm]
在表达式上下文中调用的查询将在所有情况下呈现消除歧义的标签。请注意,这不适用于现有的.statement 和.subquery()访问器/方法,它仍然遵循默认为 False 的.with_labels()设置。 - [orm]
Query.union()在返回的语句中保留了消除歧义的标签,从而避免了由于列名冲突而导致的各种 SQL 组合错误。
参考:#1676 - [orm]
修复了属性历史中的错误,无意中在映射实例上调用了 eq。 - [orm]
对对象加载的一些内部优化使大结果的速度提高了一点,估计约为 10-15%。对“state”内部进行了彻底的清理,减少了复杂性,数据成员,方法调用,空字典的创建。 - [orm]
对 query.delete()进行了文档澄清
参考:#1689 - [orm]
修复了在 many-to-one relation()中的级联错误,当属性设置为 None 时,在 r6711 中引入(在 add()期间将删除的项目级联到会话中)。 - [orm]
现在在调用 query.order_by()或 query.distinct()之前调用 query.select_from()、query.with_polymorphic()或 query.from_statement()会引发异常,而不是悄悄地丢弃这些条件。
参考:#1736 - [orm]
query.scalar() 现在如果返回多行将会引发异常。所有其他行为保持不变。
参考:#1735 - [orm]
修复了一个 bug,导致“行切换”逻辑(即 INSERT 和 DELETE 被替换为 UPDATE)在使用 version_id_col 时失败。
参考:#1692
示例
- [examples]
稍微修改了 beaker 缓存示例,为延迟加载缓存添加了一个单独的 RelationCache 选项。这个对象通过将多个潜在属性分组到一个共同的结构中,更有效地进行查找。FromCache 和 RelationCache 单独使用更简单。
sql
- [sql]
join() 现在默认会模拟自然连接(NATURAL JOIN)。也就是说,如果左侧是一个连接,它将尝试将右侧连接到左侧最右侧的一侧,即使在左侧的其余部分有进一步的连接目标时也不会引发任何关于模糊连接条件的异常。
参考:#1714 - [sql]
最常见的结果处理器转换函数已移至新的“processors”模块。鼓励方言作者在符合其需求时使用这些函数,而不是实现自定义函数。 - [sql]
SchemaType 和其子类 Boolean、Enum 现在是可序列化的,包括它们的 ddl 监听器和其他事件可调用对象。
参考:#1694, #1698 - [sql]
现在一些平台将会将某些文字值解释为非绑定参数,直接呈现到 SQL 语句中。这是为了支持一些平台(包括 MS-SQL 和 Sybase)强制执行的严格 SQL-92 规则。在这种模式下,绑定参数不允许出现在 SELECT 的列子句中,也不允许出现一些模糊的表达式如“?=?”。当启用此模式时,基础编译器将会将绑定参数呈现为内联文字,但仅限于字符串和数字值。其他类型如日期将会引发错误,除非方言子类为其定义了文字呈现函数。绑定参数必须已经包含嵌入的文字值,否则将引发错误(即不适用于直接的 bindparam(‘x’))。方言还可以扩展绑定不被接受的领域,比如在函数的参数列表中(当使用本地 SQL 绑定时在 MS-SQL 上不起作用)。 - [sql]
向 String、Unicode 等添加了“unicode_errors”参数。行为类似于标准库的 string.decode() 函数的‘errors’关键字参数。此标志要求 convert_unicode 设置为“force” - 否则,不能保证 SQLAlchemy 处理 Unicode 转换的任务。请注意,对于已经原生返回 Unicode 对象的后端(大多数 DBAPI 都是如此),此标志会给行提取操作带来显著的性能开销。此标志应仅作为从具有不同或损坏编码的列中读取字符串的绝对最后手段使用,这仅适用于首先接受无效编码的数据库(即 MySQL,不是 PG、Sqlite 等)。 - [sql]
添加了数学取反运算符支持,-x。 - [sql]
FunctionElement 子类现在可以直接执行,方式与任何 func.foo() 构造一样,在传递给 execute() 时会自动应用 SELECT。 - [sql]
func.foo() 构造函数的“type”和“bind”关键字参数现在局限于“func.”构造中,并不是 FunctionElement 基类的一部分,允许“type”在自定义构造函数或类级变量中处理。 - [sql]
将 keys() 方法恢复到 ResultProxy。 - [sql]
类型/表达式系统现在更完整地确定表达式的返回类型以及将 Python 运算符适应为 SQL 运算符,基于给定表达式的完整左/右/运算符。特别是为 PostgreSQL EXTRACT 创建的日期/时间/间隔系统现在已经泛化为类型系统。以前经常发生的表达式“column + literal”强制“literal”类型与“column”相同的行为现在通常不会发生 - “literal” 的类型首先从字面量的 Python 类型派生,假设标准的本机 Python 类型 + 日期类型,然后回退到表达式另一侧的已知类型。如果“回退”类型兼容(即从 String 到 CHAR),则字面量一侧将使用该类型。TypeDecorator 类型默认覆盖此行为,无条件地强制“literal”一侧,可以通过实现 coerce_compared_value() 方法进行更改。还有一部分。
参考:#1647, #1683 - [sql]
将 sqlalchemy.sql.expressions.Executable 设为公共 API 的一部分,用于可以发送到 execute() 的任何表达式构造。FunctionElement 现在继承 Executable,以便获得 execution_options(),这些选项也传播到 execute() 中生成的 select()。Executable 又继承自 _Generative,标记任何支持 @_generative 装饰器的 ClauseElement - 这些也可能在某个时候成为编译器扩展的“公共”部分。 - [sql]
对于 - 直接与更新/插入的 SET 或 VALUES 子句生成的与列命名绑定直接冲突的最终用户定义的绑定参数名称进行了解决方案更改,会生成编译错误。这减少了调用次数,并消除了一些仍然可能发生不良名称冲突的情况。
参考:#1579 - [sql]
如果 Column() 没有外键,则需要一个类型(这不是新功能)。如果 Column() 没有类型和外键,则现在会引发错误。
参考:#1705 - [sql]
在将返回的浮点值强制转换为字符串时,Numeric() 类型的“scale”参数将被尊重 - 这允许在 SQLite、MySQL 上功能的准确性。
参考:#1717 - [sql]
Column 的 copy() 方法现在会复制未初始化的“在表附加”事件。有助于新的声明式“mixin”功能。
mysql
- [mysql]
修复了反射错误,即当 COLLATE 存在时,将不会反映出可空标志和服务器默认值。
参考:#1655 - [mysql]
修复了对带有整数标志(如 UNSIGNED)定义的 TINYINT(1)“boolean”列的反射。 - [mysql]
进一步修复了 mysql-connector 方言的问题。
参考:#1668 - [mysql]
在 InnoDB 上的 Composite PK 表中,“autoincrement” 列不是第一列将在 CREATE TABLE 中发出显式的 “KEY” 短语,从而避免错误。
参考:#1496 - [mysql]
为广泛的 MySQL 关键字添加了反射/创建表格支持。
参考:#1634 - [mysql]
修复了在 Windows 主机上反射表时可能出现的导入错误。
参考:#1580
sqlite
- [sqlite]
在 create_engine() 中添加了“native_datetime=True”标志。这将导致 DATE 和 TIMESTAMP 类型跳过所有绑定参数和结果行处理,假设已在连接上启用了 PARSE_DECLTYPES。请注意,这与“func.current_date()”不完全兼容,它将作为字符串返回。
参考:#1685
mssql
- [mssql]
重新建立了对 pymssql 方言的支持。 - [mssql]
对于隐式返回、反射等进行了各种修复 - 0.6 版本中的 MS-SQL 方言还不完全(但接近完善) - [mssql]
添加了对 mxODBC 的基本支持。
参考:#1710 - [mssql]
删除了 text_as_varchar 选项。
oracle
- [oracle]
“out” 参数需要一个由 cx_oracle 支持的类型。如果找不到 cx_oracle 类型,则会引发错误。 - [oracle]
Oracle 的‘DATE’现在不执行任何结果处理,因为 Oracle 中的 DATE 类型存储完整的日期+时间对象,这就是你会得到的。请注意,通用的 types.Date 类型仍将在传入值上调用 value.date()。在反射表时,反射的类型将是‘DATE’。 - [Oracle]
增加了对 Oracle 的 WITH_UNICODE 模式的初步支持。至少这为 Python 3 中的 cx_Oracle 建立了初始支持。当在 Python 2.xx 中使用 WITH_UNICODE 模式时,会发出一个大而可怕的警告,要求用户认真考虑这种困难的操作模式的使用。
参考:#1670 - [Oracle]
except_()方法现在在 Oracle 上呈现为 MINUS,这在该平台上更或多是等效的。
参考:#1712 - [Oracle]
添加了对渲染和反射 TIMESTAMP WITH TIME ZONE,即 TIMESTAMP(timezone=True)的支持。
参考:#651 - [Oracle]
Oracle INTERVAL 类型现在可以反射。
杂项
- [py3k]
改进了关于 Python 3 的安装/测试设置,现在 Distribute 在 Py3k 上运行。现在包含 distribute_setup.py。请参阅 README.py3k 以获取 Python 3 的安装/测试说明。 - [引擎]
添加了一个可选的 C 扩展,通过重新实现 RowProxy 和最常见的结果处理器来加速 sql 层。实际的加速将严重依赖于您的 DBAPI 和表中使用的数据类型的混合,并且可以从 30%的改进到 200%以上。对于大查询,它还为 ORM 速度提供了适度的(~15-20%)间接改进。请注意,默认情况下不构建/安装它。请参阅 README 以获取安装说明。 - [引擎]
在“自动提交”场景中,在调用 DBAPI 连接上的 commit()之前,执行顺序会从游标中提取所有的 rowcount/last inserted ID 信息。这有助于 mxodbc 处理 rowcount,并且总体上可能是一个好主意。 - [引擎]
稍微放宽了日志记录,以便更频繁地调用 isEnabledFor(),这样对引擎/池的日志级别的更改将在下次连接时反映出来。这增加了一点方法调用开销。这是微不足道的,将使所有在调用 create_engine()之后配置日志记录的情况变得更加容易。
参考:#1719 - [引擎]
assert_unicode 标志已被弃用。在要求对非 Unicode Python 字符串进行编码时,SQLAlchemy 将在所有情况下引发警告,以及当显式传递字节字符串给 Unicode 或 UnicodeType 类型时。String 类型对于已经接受 Python Unicode 对象的 DBAPI 不会执行任何操作。 - [引擎]
绑定参数以元组形式发送,而不是列表。一些后端驱动程序不接受绑定参数作为列表。 - [引擎]
threadlocal 引擎在 close() 时没有正确关闭连接 - 已修复。 - [引擎]
如果事务对象不是“活动”的话,就不会回滚或提交,允许更准确地嵌套 begin/rollback/commit。 - [引擎]
Python unicode 对象作为绑定结果会产生 Unicode 类型,而不是字符串,从而消除了在不支持 unicode 绑定的驱动程序上的某类 unicode 错误。 - [引擎]
在 create_engine()、Pool() 构造函数以及 create_engine() 中添加了“logging_name”参数,该参数会传递到 Pool 中的“pool_logging_name”参数。在日志消息的“name”字段中发出给定的字符串名称,而不是默认的十六进制标识符字符串。
参考:#1555 - [引擎]
Dialect 的 visit_pool() 方法被移除,并替换为 on_connect()。该方法返回一个可调用对象,在每次创建原始 DBAPI 连接后接收该连接。如果非 None,则该可调用对象会被连接策略组装成一个 first_connect/connect 池监听器。为方言提供了更简单的接口。 - [引擎]
StaticPool 现在在不打开新连接的情况下初始化、释放和重新创建 - 只有在首次请求时才会打开连接。dispose() 现在也适用于 AssertionPool。
参考:#1728 - [元数据] [票号: 1673]
添加了在使用“tometadata”时去除模式信息的功能,方法是通过传递“schema=None”作为参数。如果未指定模式,则保留表的模式。 - [声明性]
DeclarativeMeta 专门使用 cls.dict(而不是 dict_)作为类信息的来源;as_declarative 专门使用传递给它的 dict 作为类信息的来源(当使用 DeclarativeMeta 时,这是 cls.dict)。理论上,这应该使得自定义元类更容易修改传递给 _as_declarative 的状态。 - [声明性]
现在 declarative 直接接受 mixin 类,作为在所有子类上提供常见功能和基于列的元素的手段,以及传播一组固定的 table_args 或 mapper_args 到子类的手段。对于从继承的 mixin 到本地的 table_args/mapper_args 的自定义组合,现在可以使用描述符。新的详细信息都在声明性文档中。感谢 Chris Withers 在这方面对我的痛苦的包容。
参考:#1707 - [声明性]
当传播到子类时,mapper_args 字典会被复制,并直接从类 dict 中取出,以避免从父类传播。映射器继承已经传播了你从父映射器中想要的东西。
参考:#1393 - [声明性]
当单表子类指定已经存在于基类上的列时,会引发异常。
参考:#1732 - [sybase]
实现了一个初步可用的 Sybase 方言,包括对 Python-Sybase 和 Pyodbc 的子实现。处理表的创建/删除和基本的往返功能。尚未包括反射或全面支持 unicode/特殊表达式等。 - [documentation]
在文档中进行了大量清理工作,将类、函数和方法名称链接到 API 文档中。
参考:#1700
SqlAlchemy 2.0 中文文档(六十七)(2)https://developer.aliyun.com/article/1560838