SqlAlchemy 2.0 中文文档(六十四)(1)https://developer.aliyun.com/article/1560871
0.9.1
发布日期:2014 年 1 月 5 日
orm
- [orm] [bug] [events]
修复了一个回归问题,使用functools.partial()
与事件系统会因为在其上使用 inspect.getargspec()来检测某些事件的传统调用签名而导致递归溢出,显然无法在部分对象上执行此操作。我们现在跳过传统检查,假设采用现代风格;现在检查仅在 SessionEvents.after_bulk_update 和 SessionEvents.after_bulk_delete 事件中发生。如果分配给“partial”事件侦听器,则这两个事件将需要新的签名样式。
参考:#2905 - [orm] [bug]
修复了一个 bug,使用新的Session.info
属性会失败,如果.info
参数仅传递给sessionmaker
创建调用,而不传递给对象本身。感谢 Robin Schoonover。 - [orm] [bug]
修复了一个回归问题,当根据名称设置基于名称的 backref 时,我们不检查给定名称与正确的字符串类是否匹配,因此导致错误“too many values to unpack”。这与 Py3k 转换有关。
参考:#2901 - [orm] [bug]
修复了一个回归问题,当说 query(B).join(B.cs)时,我们显然仍然创建一个隐式别名,其中“C”是一个连接的继承类;然而,这个隐式别名仅考虑了直接左侧,而没有考虑同一基类的不同连接继承子类的更长链的连接。只要我们在这种情况下仍然隐式别名,行为就会有所减弱,以便在更广泛的情况下别名右侧。
参考:#2903
orm 声明
- [orm] [declarative] [bug]
修复了一个极不可能的内存问题,当使用DeferredReflection
定义待反射的类时,如果在调用DeferredReflection.prepare()
方法之前丢弃了其中一些类的子集,那么在映射和映射类时,将保留对类的强引用。这个内部的“要映射的类”集合现在使用对类本身的弱引用。 - [orm] [declarative] [bug]
在 0.8 版本中,似乎可以在声明性上设置一个类级属性,直接引用超类或类本身的InstrumentedAttribute
,它更多地充当同义词;在 0.9 版本中,这种设置未能设置足够的记录来跟上更自由化的反向引用逻辑,来源于#2789。即使这种用例从未直接考虑过,现在在“setattr()”级别以及设置子类时,声明性也会检测到,并且镜像/重命名属性现在设置为synonym()
。
参考:#2900
orm 扩展
- [orm] [扩展] [特性]
添加了一个新的、实验性的扩展sqlalchemy.ext.automap
。该扩展扩展了声明性的功能,以及DeferredReflection
类,生成一个基类,根据表元数据自动生成映射类和关系。
另请参阅
自动映射扩展
自动映射
sql
- [sql] [特性]
像and_()
和or_()
这样的连接词现在可以接受 Python 生成器作为单个参数,例如:
and_(x == y for x, y in tuples
- 这里的逻辑查找一个单个参数
*args
,其中第一个元素是types.GeneratorType
的实例。
模式
- [模式] [特性]
Table.extend_existing
和Table.autoload_replace
参数现在可用于MetaData.reflect()
方法。
0.9.0
发布日期:2013 年 12 月 30 日
orm
- [orm] [特性]
StatementError
或与 DBAPI 相关的子类现在可以容纳有关异常“原因”的其他信息;当异常发生在自动刷新中时,Session
现在会为其添加一些细节。采用这种方法是为了与 Python 3 风格的“链接异常”方法相反,以保持与 Py2K 代码以及已经捕获IntegrityError
或类似异常的代码的兼容性。 - [orm] [feature] [backrefs]
向validates()
函数添加了新参数include_backrefs=True
;当设置为 False 时,如果事件是从另一侧的属性操作的反向引用发起的,则不会触发验证事件。
请参见
@validates 的 include_backrefs=False 选项
参考:#1535 - [orm] [feature]
添加了用于指定SELECT
的FOR UPDATE
子句的新 API,通过新的Query.with_for_update()
方法,以补充新的GenerativeSelect.with_for_update()
方法。感谢 Mario Lassnig 的拉取请求。
请参见
在 select(),Query()上新增 FOR UPDATE 支持 - [orm] [bug]
对subqueryload()
策略进行了调整,确保查询在加载过程开始后运行;这样,subqueryload 优先于其他加载器运行,这些加载器可能由于其他错误的时机导致命中相同属性。
此更改也已回溯至:0.8.5
参考:#2887 - [orm] [bug]
修复了从表到基表的联接表继承时,PK 列名称不同的 bug;持久性系统将无法将主键值从基表复制到继承表中进行 INSERT。
此更改也已回溯至:0.8.5
参考:#2885 - [orm] [bug]
当传递的列/属性(名称)不解析为列或映射属性(例如错误的元组)时,composite()
将引发一个信息性错误消息;以前引发一个未绑定的本地错误。
此更改也回溯到:0.8.5
参考:#2889 - [orm] [bug]
修复了由#2818引入的回归,其中生成的 EXISTS 查询会为具有两个同名列的语句产生“正在替换列”的警告,因为内部 SELECT 不会设置 use_labels。
此更改也回溯到:0.8.4
参考:#2818 - [orm] [bug] [collections] [py3k]
在 ORM 集合仪器化系统中添加了对 Python 3 方法list.clear()
的支持;感谢 Eduardo Schettino 的拉取请求。 - [orm] [bug]
对于AliasedClass
构造进行了一些改进,涉及到描述符,如混合体、同义词、复合体、用户定义的描述符等。进行的属性适配更加健壮,这样,如果一个描述符返回另一个被仪器化的属性,而不是一个复合 SQL 表达式元素,则操作仍将进行。此外,“适配”的运算符将保留其类;以前,从InstrumentedAttribute
到QueryableAttribute
(一个超类)的类的更改会与 Python 的运算符系统进行交互,例如aliased(MyClass.x) > MyClass.x
表达式将反转为myclass.x < myclass_1.x
。适配的属性还将引用新的AliasedClass
作为其父类,而以前并不总是这样。
参考:#2872 - [orm] [bug]
relationship()
上的viewonly
标志现在将防止为目标属性代表写入属性历史记录。这导致在对象发生变化时不会将其写入到 Session.dirty 列表中。以前,对象会出现在 Session.dirty 中,但在 flush 期间不会代表修改的属性进行任何更改。属性仍然会发出事件,如反向引用事件和用户定义的事件,并且仍将从反向引用接收变化。
另见
在关系(relationship())上使用viewonly=True
会防止历史记录生效 migration_09.html#migration-2833。
参考:#2833 - [orm] [bug]
为scoped_session
添加了对新Session.info
属性的支持。 - [orm] [bug]
修复了使用新的Bundle
对象将导致Query.column_descriptions
属性失败的错误。 - [orm] [bug] [sql] [sqlite]
修复了由#2369和#2587的连接重写功能引入的回归,其中一个嵌套连接的一侧已经是一个别名选择,将无法正确地转换外部的 ON 子句;在 ORM 中,当使用 SELECT 语句作为“次要”表时,可以看到这种情况。
参考:#2858
orm 声明性
- [orm] [declarative] [bug]
Declarative 额外进行了检查,以检测是否将相同的Column
多次映射到不同的属性下(通常应该是一个synonym()
),或者是否给两个或更多Column
对象赋予了相同的名称,在检测到这种情况时会引发警告。
参考:#2828 - [orm] [declarative] [bug]
DeferredReflection
类已增强,以提供对由relationship()
引用的“次要”表的自动反射支持。“次要”,当指定为字符串表名或只有名称和MetaData
对象的Table
对象时,在调用DeferredReflection.prepare()
时,也将包括在反射过程中。
参考:#2865 - [orm] [declarative] [bug]
修复了 Py2K 中不接受 Unicode 字面量作为声明中使用relationship()
的类或其他参数的字符串名称的 bug。
示例
- [examples] [bug]
修复了阻止 history_meta 配方与超过一级深度的联合继承方案一起使用的错误。
引擎
- [engine] [feature]
engine_from_config()
函数已经改进,以便我们能够从字符串配置字典中解析特定于方言的参数。方言类现在可以提供自己的参数类型列表和字符串转换例程。然而,这个功能目前尚未被内置方言使用。
参考:#2875 - [engine] [bug]
当connect()
方法引发一个不是dbapi.Error
子类(比如TypeError
、NotImplementedError
等)的错误时,DBAPI 将不加修改地传播异常。之前,connect()
方法特定的错误处理会不恰当地通过方言的Dialect.is_disconnect()
方法运行异常,并将其包装在一个sqlalchemy.exc.DBAPIError
中。现在,异常将以与执行过程中相同的方式不加修改地传播。
此更改也被回溯到:0.8.4
参考:#2881 - [engine] [bug] [pool]
QueuePool
已经得到增强,当现有连接尝试阻塞时,不会阻止新的连接尝试。之前,新连接的生成在监视溢出的块内串行化;现在,溢出计数器在连接过程之外的自己的关键部分中被改变。
此更改也被回溯到:0.8.4
参考:#2880 - [engine] [bug] [pool]
对等待可用连接的逻辑进行了轻微调整,对于未指定超时的连接池,每隔半秒就会中断等待以检查所谓的“中止”标志,这允许等待者在整个连接池被释放的情况下中断;通常情况下,等待者应该由notify_all()
中断,但在极少数情况下可能会错过这个notify_all()
。这是在 0.8.0 中首次引入的逻辑的扩展,该问题只在压力测试中偶尔观察到。
此更改也被回溯到:0.8.4
参考:#2522 - [engine] [bug]
修复了一个 bug,在预 DBAPIStatementError
在Connection.execute()
中引发时,SQL 语句会被错误地 ASCII 编码,导致非 ASCII 语句的编码错误。现在字符串化仍然保持在 Python unicode 中,从而避免编码错误。
此更改也已回溯至:0.8.4
参考:#2871 - [engine] [bug]
create_engine()
例程和相关的make_url()
函数不再将+
符号视为密码字段中的空格。在这个区域的解析已经调整得更接近 RFC 1738 处理这些标记的方式,即username
和password
都只期望:
、@
和/
被编码。
参见create_engine()
的“密码”部分不再将 + 号视为编码空格
参考:#2873 - [engine] [bug]
RowProxy
对象现在在 Python 中可排序,就像普通元组一样;这是通过在__eq__()
方法中确保在两侧都进行 tuple() 转换以及添加__lt__()
方法来实现的。
参见
RowProxy 现在具有元组排序行为
参考:#2848
sql
- [sql] [feature]
text()
构造的新改进,包括更灵活的设置绑定参数和返回类型的方式;特别是,现在可以将text()
转换为完整的 FROM 对象,在其他语句中作为别名或 CTE 嵌入,使用新方法TextClause.columns()
。当构造在“文字绑定”上下文中编译时,text()
构造也可以呈现“内联”绑定参数。
参见
新的 text() 功能
参考:#2877, #2882 - [sql] [feature]
使用新的GenerativeSelect.with_for_update()
方法添加了指定SELECT
的FOR UPDATE
子句的新 API。与select()
的for_update
关键字参数相比,该方法支持更直观的设置方言特定选项的系统,并且还包括对 SQL 标准FOR UPDATE OF
子句的支持。ORM 还包括一个新的对应方法Query.with_for_update()
。感谢 Mario Lassnig 的拉取请求。
另请参阅
在 select()、Query()上新增 FOR UPDATE 支持 - [sql] [功能]
当通过字符串将返回的浮点数值强制转换为 PythonDecimal
时使用的精度现在是可配置的。标志decimal_return_scale
现在由所有Numeric
和Float
类型支持,它将确保从原生浮点值中取出这么多位数字时,它被转换为字符串。如果不存在,类型将使用.scale
的值(如果类型支持此设置且不为 None)。否则,将使用原始默认长度 10。
另请参阅
浮点数字符串转换精度可配置为原生浮点数类型
参考:#2867 - [sql] [错误]
修复了一个问题:如果主键列上有一个序列,但列不是“自动增量”列,可能是因为它有一个外键约束或设置了autoincrement=False
,则对于不支持序列的后端,在插入缺少主键值的 INSERT 时,会尝试触发序列。这将在非序列后端(如 SQLite、MySQL)上发生。
此更改也回溯到:0.8.5
参考:#2896 - [sql] [错误]
修复了Insert.from_select()
方法的错误,其中给定名称的顺序在生成 INSERT 语句时不会被考虑,因此与给定 SELECT 语句中的列名不匹配。还注意到,Insert.from_select()
暗示不能使用 Python 端的插入默认值,因为语句没有 VALUES 子句。
此更改也回溯到:0.8.5
参考:#2895 - [sql] [bug]
当给定普通文字值时,cast()
函数现在将根据给定的类型将给定的文字值应用于绑定参数侧,与type_coerce()
函数的方式相同。然而,与type_coerce()
不同的是,只有在将非 clauseelement 值传递给cast()
时才会生效;现有的已经有类型的构造将保留其类型。 - [sql] [bug]
ForeignKey
类更积极地检查给定的列参数。如果不是字符串,则检查对象至少是一个ColumnClause
,或者一个解析为一个的对象,如果.table
属性存在,则它引用一个TableClause
或子类,而不是像Alias
这样的东西。否则,将引发一个ArgumentError
。
参考:#2883 - [sql] [bug]
ColumnOperators.collate()
操作符的优先规则已修改,使得 COLLATE 操作符现在比比较操作符的优先级低。这样做的效果是,应用于比较的 COLLATE 不会在比较周围生成括号,这对于 MSSQL 等后端不解析括号的情况是不兼容的。对于那些通过将Operators.collate()
应用于比较表达式的单个元素而不是整个比较表达式来解决该问题的设置而言,该更改是向后不兼容的。
请参阅
COLLATE 的优先规则已更改
参考:#2879 - [sql] [enhancement]
当编译的语句中存在一个BindParameter
而没有值时引发的异常现在在错误消息中包括绑定参数的键名。
这个改变也被反向移植到:0.8.5
模式
postgresql
- [postgresql] [功能]
添加了对 PostgreSQL JSON 的支持,使用新的JSON
类型。非常感谢 Nathan Rice 实现和测试。
参考:#2581 - [postgresql] [功能]
通过TSVECTOR
类型添加了对 PostgreSQL TSVECTOR 的支持。感谢 Noufal Ibrahim 的拉取请求。 - [postgresql] [错误]
修复了使用 pypostgresql 适配器时索引反射会错误解释 indkey 值的 bug,该适配器将这些值作为列表返回,而不是 psycopg2 的字符串返回类型。
此更改也回溯到:0.8.4
参考:#2855 - [postgresql] [错误]
现在使用 psycopg2 UNICODEARRAY 扩展来处理带有 psycopg2 + 普通“本地 unicode”模式的 unicode 数组,与使用 UNICODE 扩展的方式相同。 - [postgresql] [错误]
修复了 ENUM 中的值未对单引号符号进行转义的 bug。请注意,对于手动转义单引号的现有解决方法来说,这是不兼容的。
另请参阅
PostgreSQL CREATE TYPE AS ENUM 现在对值应用引号
参考:#2878
mysql
- [mysql] [错误]
改进了 SQL 类型在__repr__()
中生成的系统,特别是关于 MySQL 整数/数字/字符类型,这些类型具有各种关键字参数。__repr__()
对于 Alembic autogenerate 很重要,用于在迁移脚本中呈现 Python 代码时使用。
参考:#2893
mssql
- [mssql] [错误] [firebird]
与Float
类型一起使用的“asdecimal”标志现在也适用于 Firebird 以及 mssql+pyodbc 方言;以前未发生十进制转换。
此更改也回溯到:0.8.5 - [mssql] [错误] [pymssql]
将“Net-Lib error during Connection reset by peer”消息添加到 pymssql 方言中检查的“断开”消息列表中。感谢 John Anderson。
此更改也回溯到:0.8.5 - [mssql] [错误]
修复了在 0.8.0 中引入的 bug,如果索引位于备用模式中,则 MSSQL 中的DROP INDEX
语句会错误渲染;模式名/表名将被颠倒。格式也已经修订以匹配当前的 MSSQL 文档。感谢 Derek Harland。
此更改也被回溯到:0.8.4
oracle
- [oracle] [错误]
将 ORA-02396 “最大空闲时间”错误代码添加到具有 cx_oracle 的“is disconnect”代码列表中。
此更改也被回溯到:0.8.4
参考:#2864 - [oracle] [错误]
修复了 Oracle 中给定没有长度的VARCHAR
类型(例如用于CAST
或类似操作)会错误地呈现为None CHAR
或类似情况的 bug。
此更改也被回溯到:0.8.4
参考:#2870
杂项
- [错误] [firebird]
firebird 方言将引用以下划线开头的标识符。感谢 Treeve Jelbert。
此更改也被回溯到:0.8.5
参考:#2897 - [错误] [firebird]
修复了 Firebird 索引反射中列在索引内部没有正确排序的 bug;现在按照 RDB$FIELD_POSITION 的顺序排序。
此更改也被回溯到:0.8.5 - [错误] [declarative]
当发送给relationship()
的字符串参数不能解析为类或映射器时,错误消息已更正为与接收非字符串参数时相同的方式,指示配置错误的关系名称。
此更改也被回溯到:0.8.5
参考:#2888 - [错误] [扩展]
修复了serializer
扩展无法正确处理包含非 ASCII 字符的表或列名称的 bug。
此更改也被回溯到:0.8.4
参考:#2869 - [错误] [firebird]
更改了 Firebird 用于列出表和视图名称的查询,现在从rdb$relations
视图而不是rdb$relation_fields
和rdb$view_relations
视图查询。许多 FAQ 和博客中提到了新旧查询的变体,但新查询直接来自“Firebird FAQ”,这似乎是最官方的信息来源。
参考:#2898 - [已移除]
“informix” 和 “informixdb” 方言已被移除;该代码现在作为一个独立的存储库在 Bitbucket 上提供。自从第一次添加 informixdb 方言以来,IBM-DB 项目提供了生产级的 Informix 支持。
0.9.0b1
发布日期:2013 年 10 月 26 日
通用
- [通用] [特性] [py3k]
C 扩展已移植到 Python 3,并将在任何支持的 CPython 2 或 3 环境下构建。
参考:#2161 - [通用] [特性] [py3k]
代码现在对 Python 2 和 3 “原地”运行,不再需要运行 2to3。兼容性现在针对 Python 2.6 及更高版本。
参考:#2671 - [通用]
大规模的包重构已经重新组织了许多核心模块的导入结构以及一些 ORM 模块的方面。特别是sqlalchemy.sql
已经被拆分成比以前更多的模块,以便将sqlalchemy.sql.expression
的非常庞大的大小削减下来。这一努力主要集中在大幅减少导入循环上。此外,sqlalchemy.sql.expression
和sqlalchemy.orm
中的 API 函数系统已经重新组织,以消除函数与它们产生的对象之间文档中的冗余。
orm
- [orm] [feature]
添加了新选项relationship()
distinct_target_key
。这使得子查询预加载策略可以对最内部的 SELECT 子查询应用 DISTINCT,以帮助解决内部查询生成重复行的情况(尚无解决子查询预加载中重复行问题的通用解决方案,但是当最内部子查询之外的连接产生重复行时)。当标志设置为True
时,DISTINCT 被无条件渲染,当设置为None
时,如果最内部关系目标列不包括完整的主键,则渲染 DISTINCT。该选项在 0.8 中默认为 False(例如,在所有情况下默认关闭),在 0.9 中默认为 None(例如,默认情况下自动)。感谢 Alexander Koval 对此的帮助。
参见
子查询预加载将对某些查询的最内部 SELECT 应用 DISTINCT
此更改也被回溯到:0.8.3
参考:#2836 - [orm] [feature]
现在,当从标量关系中获取标量属性时,关联代理会返回None
,而不是引发AttributeError
。
参见
关联代理缺失标量返回 None
参考:#2810 - [orm] [feature]
添加了新方法AttributeState.load_history()
,类似于AttributeState.history
但也触发加载器可调用。
参见
attributes.get_history()如果值不存在将默认从数据库查询
参考:#2787 - [orm] [feature]
添加了一个新的加载选项load_only()
。这允许指定一系列列名仅加载这些属性,推迟其余属性的加载。
参考:#1418 - [orm] [feature]
现在加载器选项系统已完全重构,建立在更加全面的基础上,即Load
对象。该基础允许任何常见的加载器选项,如joinedload()
、defer()
等,以“链式”样式用于沿着路径指定选项,例如joinedload("foo").subqueryload("bar")
。新系统取代了点分隔路径名的使用、选项中的多个属性以及使用_all()
选项的用法。
另请参阅
新查询选项 API;load_only() 选项
参考:#1418 - [orm] [功能]
当在基于列的Query
中使用时,composite()
构造现在会保持返回对象,而不是展开为单独的列。这利用了内部的新Bundle
功能。此行为是向后不兼容的;要从一个会展开的组合列中进行选择,请使用MyClass.some_composite.clauses
。
另请参阅
组合属性现在在按属性查询时作为它们的对象形式返回
参考:#2824 - [orm] [功能]
添加了一个新的构造Bundle
,它允许对Query
构造中的一组列表达式进行规范。默认情况下,这组列作为单个元组返回。然而,可以覆盖Bundle
的行为,以提供对返回行进行任何类型的结果处理。当组合属性在基于列的Query
中使用时,Bundle
的行为也已嵌入其中。
另请参阅
ORM 查询的列束
组合属性现在在按属性查询时作为它们的对象形式返回
参考:#2824 - [orm] [功能]
Mapper
的version_id_generator
参数现在可以指定依赖于服务器生成的版本标识符,使用触发器或其他数据库提供的版本控制功能,或通过设置version_id_generator=False
来使用可选的程序值。当使用服务器生成的版本标识符时,ORM 将在可用时使用 RETURNING 立即加载新的版本值,否则将发出第二个 SELECT。
参考:#2793 - [orm] [feature]
Mapper
的eager_defaults
标志现在将允许使用内联 RETURNING 子句获取新���成的默认值,而不是使用第二个 SELECT 语句,对于支持 RETURNING 的后端。
参考:#2793 - [orm] [feature]
添加了一个新的属性Session.info
到Session
;这是一个字典,应用程序可以将任意数据存储在与Session
相关的本地数据中。Session.info
的内容也可以使用Session
或sessionmaker
的info
参数进行初始化。 - [orm] [feature]
现在已实现事件监听器的移除。该功能通过remove()
函数提供。
另请参阅
事件移除 API
参考:#2268 - [orm] [feature]
属性事件通过AttributeImpl
传递的机制已更改为一个“initiator”标记,现在对象是一个名为Event
的特定于事件的对象。此外,属性系统不再根据匹配的“initiator”标记停止事件;这一逻辑已移至特定于 ORM 反向引用事件处理程序的地方,这些处理程序是重新传播属性事件到后续附加/设置/移除操作的典型来源。模拟反向引用处理程序行为的最终用户代码现在必须确保递归事件传播方案被停止,如果该方案不使用反向引用处理程序。使用这个新系统,当对象被附加到集合中,与新的多对一关联,与之前的多对一解除关联,然后从之前的集合中移除时,反向引用处理程序现在可以执行“两跳”操作。在这个改变之前,从之前的集合中移除的最后一步将不会发生。
另请参阅
反向引用处理程序现在可以传播多个级别
参考:#2789 - [orm] [feature]
关于 ORM 如何构建右侧本身是 JOIN 或 LEFT OUTER JOIN 的连接的重大变更。ORM 现在配置为允许形式为a JOIN (b JOIN c ON b.id=c.id) ON a.id=b.id
的连接的简单嵌套,而不是强制右侧成为SELECT
子查询。这应该允许大多数后端实现显着的性能改进,尤其是 MySQL。多年来一直阻碍此更改的一个数据库后端,SQLite,现在通过将SELECT
子查询的生成从 ORM 移动到 SQL 编译器来解决;因此,在 SQLite 上的右侧嵌套连接最终仍将以SELECT
呈现,而所有其他后端不再受此解决方法的影响。
作为这一变更的一部分,aliased()
、Join.alias()
和with_polymorphic()
函数中添加了一个新参数flat=True
,允许生成一个 JOIN 的“别名”,该别名对加入的每个组件表应用匿名别名,而不是生成子查询。
另请参阅
许多 JOIN 和 LEFT OUTER JOIN 表达式将不再被包装在(SELECT * FROM …) AS ANON_1 中
参考:#2587 - [orm] [bug]
修复了列表插入操作insert(0, item)
无法正确表示[0:0]
的切片的错误,特别是在使用关联代理时可能发生。由于 Python 集合中的某些怪癖,该问题在 Python 3 中更有可能发生。
此更改还回溯到:0.8.3, 0.7.11
参考:#2807 - [orm] [bug]
修复了在使用remote()
或foreign()
等注释在与父Table
关联之前可能会产生与父表在连接中未呈现相关的问题的错误,这是由注释执行的固有复制操作引起的。
此更改还回溯到:0.8.3
参考:#2813 - [orm] [bug]
修复了Query.exists()
在没有任何 WHERE 条件的情况下无法正常工作的错误。感谢 Vladimir Magamedov。
此更改还回溯到:0.8.3
参考:#2818 - [orm] [bug]
修复了 ORM 使用的有序序列实现中的潜在问题,该问题用于迭代映射器层次结构;在 Jython 解释器下,即使 cPython 和 PyPy 保持了排序,该实现也没有排序。
此更改还 被后移 到:0.8.3
参考:#2794 - [orm] [bug]
修复了 ORM 级别事件注册中的错误,其中在某些“未映射的基类”配置中,“原始”或“传播”标志可能会被错误配置。
此更改还 被后移 到:0.8.3
参考:#2786 - [orm] [bug]
与加载映射实体时使用defer()
选项相关的性能修复。在加载时将每个对象的延迟可调用函数应用到实例的函数开销明显高于仅从行中加载数据的函数开销(请注意,defer()
旨在减少 DB/网络开销,而不一定是函数调用计数);在所有情况下,函数调用开销现在都小于从列加载数据的开销。每次加载从 N(结果中的总延迟值)减少到 1(延迟列的总数)的“惰性可调用”对象的数量也有所减少。
此更改还 被后移 到:0.8.3
参考:#2778 - [orm] [bug]
修复了属性历史函数的错误,当我们使用make_transient()
函数将对象从“持久”移动到“待定”时,涉及基于集合的反向引用的操作会失败。
此更改还 被后移 到:0.8.3
参考:#2773 - [orm] [bug]
尝试刷新继承类的对象时,如果多态识别器已分配给对该类无效的值,则会发出警告。
此更改还 被后移 到:0.8.2
参考:#2750 - [orm] [bug]
修复了多态 SQL 生成中的错误,在针对相同基类的多个连接继承实体相互连接的情况下,如果连接字符串超过两个实体,则不会独立跟踪基表上的列。
此更改还 被后移 到:0.8.2
参考:#2759 - [orm] [bug]
修复了将复合属性发送到Query.order_by()
会产生一些数据库不接受的带括号的表达式的错误。
此更改还 被后移 到:0.8.2
参考:#2754 - [orm] [bug]
修复了复合属性与aliased()
函数之间的交互。以前,在应用别名时,复合属性在比较操作中无法正常工作。
此更改也回溯到:0.8.2
参考:#2755 - [orm] [bug] [ext]
修复了MutableDict
在调用clear()
时未报告更改事件的错误。
此更改也回溯到:0.8.2
参考:#2730 - [orm] [bug]
当与标量列映射属性一起使用时,get_history()
现在将遵守传递给它的“被动”标志;由于默认为PASSIVE_OFF
,如果值不存在,默认情况下该函数将查询数据库。这与 0.8 相比是一种行为变化。
另请参阅
attributes.get_history()将默认从数据库查询值不存在的情况
参考:#2787 - [orm] [bug] [associationproxy]
对于与标量值一起使用的==,!=比较器,添加了额外的条件,用于将与 None 进行比较的情况考虑到也要考虑到关联记录本身不存在,除了现有的测试关联记录上的标量端点是否为 NULL。以前,比较Cls.scalar == None
将返回Cls.associated
存在且Cls.associated.scalar
为 None 的记录,但不会返回Cls.associated
不存在的行。更重要的是,相反的操作Cls.scalar != None
会返回Cls
行,其中Cls.associated
不存在。Cls.scalar != 'somevalue'
的情况也修改为更像直接的 SQL 比较;只返回Cls.associated
存在且Associated.scalar
非 NULL 且不等于'somevalue'
的行。以前,这将是一个简单的NOT EXISTS
。
还添加了一个特殊用例,当Cls.scalar
是基于列的值时,您可以调用Cls.scalar.has()
而不带参数 - 这将返回Cls.associated
是否有任何行存在,而不管Cls.associated.scalar
是否为 NULL。
另请参阅
关联代理 SQL 表达式改进和修复
参考:#2751 - [orm] [bug]
修复了一个晦涩的错误,当跨越一个具有特定鉴别器值的单表继承子类的多对多关系进行连接/联接加载时,错误的结果会被获取,这是由于“secondary”行的返回。现在,在所有 ORM 在多对多关系上的连接中,“secondary”和右侧表现在括号内进行内部连接,以便左->右连接可以准确过滤。这个改变是通过最终解决了在 #2587 中概述的右嵌套连接问题而实现的。
另请参阅
许多 JOIN 和 LEFT OUTER JOIN 表达式将不再被包装在 (SELECT * FROM …) AS ANON_1 中
参考:#2369 - [orm] [错误]
Query.select_from()
方法的“自动别名”行为已被关闭。现在特定行为可以通过新方法Query.select_entity_from()
获得。这里的自动别名行为从未有很好的文档记录,并且通常不是所期望的,因为Query.select_from()
已经更加倾向于控制 JOIN 的渲染方式。Query.select_entity_from()
也将在 0.8 中提供,以便依赖于自动别名的应用程序可以转向使用这种方法。
另请参阅
_query.Query.select_from() 不再将子句应用于相应的实体
参考:#2736
orm declarative
- [orm] [declarative] [feature]
添加了一个方便的类装饰器as_declarative()
,它是declarative_base()
的包装器,允许使用一种巧妙的类装饰方法应用现有的基类。
这个改变也被回溯到:0.8.3 - [orm] [declarative] [feature]
ORM 描述符,如混合属性,现在可以通过名称在与order_by
、primaryjoin
或类似的在relationship()
中使用的字符串参数中引用,除了列绑定属性。
这个改变也被回溯到:0.8.2
参考:#2761
例子
- [例子] [功能]
改进了examples/generic_associations
中的示例,包括discriminator_on_association.py
利用单表继承来处理“鉴别器”的工作。还添加了一个真正的“通用外键”示例,它类似于其他流行框架,使用开放的整数指向任何其他表,放弃传统的引用完整性。虽然我们不推荐这种模式,但信息想要自由。
此更改也回溯到:0.8.3 - [examples] [bug]
在版本控制示例中创建的历史表中添加了“autoincrement=False”,因为这个表在任何情况下都不应该具有自增。由 Patrick Schmid 提供。
此更改也回溯到:0.8.3 - [examples] [bug]
修复了“版本控制”配方中的一个问题,即当存在反向引用时,多对一引用可能会为目标产生一个无意义的版本,即使它没有更改。补丁由 Matt Chisholm 提供。
此更改也回溯到:0.8.2
engine
- [engine] [feature]
对Engine
的URL
的repr()
现在将使用星号隐藏密码。由 Gunnlaugur Þór Briem 提供。
此更改也回溯到:0.8.3
参考:#2821 - [engine] [feature]添加到
ConnectionEvents
的新事件:
ConnectionEvents.engine_connect()
ConnectionEvents.set_connection_execution_options()
ConnectionEvents.set_engine_execution_options()
- 参考:#2770
- [engine] [bug]
make_url()
函数使用的正则表达式现在解析 ipv6 地址,例如用括号括起来。
此更改也回溯到:0.8.3, 0.7.11
参考:#2851 - [engine] [bug] [oracle]
如果重新创建一个Engine
,则不会再次调用 Dialect.initialize(),这是由于断开连接错误。这修复了 Oracle 8 方言中的一个特定问题,但通常情况下,dialect.initialize()阶段应该只执行一次。
此更改也回溯到:0.8.3
参考:#2776 - [engine] [bug] [pool]
修复了一个 bug,即QueuePool
在现有池化连接在无效或重新生成事件后无法重新连接时会丢失正确的已检出计数。
这个更改也被回溯到:0.8.3
参考:#2772 - [engine] [bug]
修复了一个 bug,即各种Pool
实现中的reset_on_return
参数在重新生成池时不会传播。感谢 Eevee。
这个更改也被回溯到:0.8.2 - [engine] [bug]
Dialect.reflecttable()
的方法签名,在所有已知情况下由DefaultDialect
提供,已经调整为期望include_columns
和exclude_columns
参数,不再有任何 kw 选项,减少了歧义 - 之前缺少了exclude_columns
。
参考:#2748
sql
- [sql] [feature]
增加了对“唯一约束”反射的支持,通过Inspector.get_unique_constraints()
方法。感谢 Roman Podolyaka 的补丁。
这个更改也被回溯到:0.8.4
参考:#1443 - [sql] [feature]
update()
、insert()
和delete()
构造现在将 ORM 实体解释为要操作的目标表,例如:
from sqlalchemy import insert, update, delete ins = insert(SomeMappedClass).values(x=5) del_ = delete(SomeMappedClass).where(SomeMappedClass.id == 5) upd = update(SomeMappedClass).where(SomeMappedClass.id == 5).values(name="ed")
- 这个更改也被回溯到:0.8.3
- [sql] [feature] [mysql] [postgresql]
PostgreSQL 和 MySQL 方言现在支持外键选项的反射/检查,包括 ON UPDATE、ON DELETE。PostgreSQL 还反映了 MATCH、DEFERRABLE 和 INITIALLY。感谢 ijl。
参考:#2183 - [sql] [feature]
现在,当在类型化表达式中使用具有“null”类型(例如,未指定类型)的bindparam()
构造时,会复制该构造,并将新副本分配给比较列的实际类型。以前,此逻辑会在给定的bindparam()
中发生。此外,现在对于传递给ValuesBase.values()
用于Insert
或Update
构造的bindparam()
构造,在构造的编译阶段中也会发生类似的过程。
这两者都是一些微妙的行为变化,可能会影响某些用法。
请参见
当可用类型时,没有类型的bindparam()
构造通过复制升级
参考:#2850 - [sql] [feature]
对于特殊符号的表达式处理进行了全面改进,特别是连接词,例如None
null()
true()
false()
,包括在连接中呈现 NULL 的一致性,包含布尔常量的and_()
和or_()
表达式的“短路”,以及对布尔常量和表达式的呈现与不支持true
/false
常量的后端相比较为“1”或“0”。
请参见
改进的布尔常量、NULL 常量、连接的呈现
参考:#2734, #2804, #2823 - [sql] [feature]
类型系统现在处理渲染“字面绑定”值的任务,例如通常绑定参数但由于上下文必须呈现为字符串的值,通常在 DDL 结构中,如 CHECK 约束和索引中(注意,随着 #2742,“字面绑定”值将成为 DDL 使用的)。新方法TypeEngine.literal_processor()
作为基础,添加了TypeDecorator.process_literal_param()
以允许包装本地字面渲染方法。
另见
现在,类型系统处理渲染“字面绑定”值的任务了。(见 “literal bind” 值的渲染)
参考:#2838 - [sql] [feature]
Table.tometadata()
方法现在会复制结构中所有SchemaItem
对象的所有SchemaItem.info
字典,包括列、约束、外键等。由于这些字典是副本,它们与原始字典独立。以前,此操作仅传输了Column
的.info
字典,并且它仅链接在原地,而不是复制。
参考:#2716 - [sql] [feature]
Column
的default
参数现在接受类或对象方法作为参数,除了独立函数之外;将正确检测是否接受“上下文”参数。 - [sql] [feature]
insert()
构造中添加了新方法Insert.from_select()
。给定一个列列表和一个可选择项,渲染INSERT INTO (table) (columns) SELECT ..
。虽然此功能作为 0.9 的一部分突出显示,但也已经回溯到了 0.8.3。
另见
从 SELECT 插入
参考:#722 - [sql] [feature]
为TypeDecorator
提供了一个名为TypeDecorator.coerce_to_is_types
的新属性,以便更容易控制使用==
或!=
与None
和布尔类型进行比较时如何生成IS
表达式,或者带有绑定参数的普通相等表达式。
参考:#2734, #2744 - [sql] [feature]
在ORDER BY
子句中,如果label()
构造也在 select 的列子句中引用了该标签,则现在将仅以其名称单独呈现,而不是重写完整表达式。这使得数据库有更好的机会优化在两个不同上下文中评估相同表达式。
另请参阅
标签构造现在可以在 ORDER BY 中仅呈现其名称
参考:#1068 - [sql] [bug]
修复了自 0.7.9 以来的回归,即如果在多个 FROM 子句中引用了 CTE 的名称,则可能无法正确引用。
此更改也回溯到:0.8.3, 0.7.11
参考:#2801 - [sql] [bug] [cte]
修复了公共表达式系统中的错误,如果 CTE 仅用作alias()
构造,则不会使用 WITH 关键字呈现。
此更改也回溯到:0.8.3, 0.7.11
参考:#2783 - [sql] [bug]
修复了CheckConstraint
DDL 中的错误,其中来自Column
对象的“quote”标志不会传播。
此更改也回溯到:0.8.3, 0.7.11
参考:#2784 - [sql] [bug]
修复了type_coerce()
在解释具有__clause_element__()
方法的 ORM 元素时无法正确处理的错误。
此更改也回溯到:0.8.3
参考:#2849 - [sql] [bug]
当为“非本地”类型生成 CHECK 约束时,Enum
和Boolean
类型现在会绕过任何自定义(例如 TypeDecorator)类型。这样,自定义类型不会参与 CHECK 中的表达式,因为此表达式针对“impl”值而不是“decorated”值。
这个更改也被回溯到:0.8.3
参考:#2842 - [sql] [bug]
如果从未指定unique
(默认为None
)的Column
生成了Index
上的.unique
标志,它可能会被生成为None
。现在该标志将始终为True
或False
。
这个更改也被回溯到:0.8.3
参考:#2825 - [sql] [bug]
修复了默认编译器以及 postgresql、mysql 和 mssql 的 bug,以确保任何字面 SQL 表达式值在 CREATE INDEX 语句中直接呈现为字面值,而不是作为绑定参数。这也改变了其他 DDL 的呈现方案,如约束。
这个更改也被回溯到:0.8.3
参考:#2742 - [sql] [bug]
在其 FROM 子句中引用自身的select()
,通常通过就地突变,将引发一个信息性错误消息,而不是导致递归溢出。
这个更改也被回溯到:0.8.3
参考:#2815 - [sql] [bug]
修复了一个 bug,使用column_reflect
事件来更改传入的Column
的.key
会阻止主键约束、索引和外键约束被正确反映。
这个更改也被回溯到:0.8.3
参考:#2811 - [sql] [bug]
在 0.8 版本中添加的ColumnOperators.notin_()
运算符现在在针对空集合使用时正确地产生表达式“IN”的否定返回。
这个更改也被回溯到:0.8.3 - [sql] [bug] [postgresql]
修复了表达式系统依赖于某些表达式的str()
形式,当引用select()
构造上的.c
集合时,但是str()
形式不可用,因为元素依赖于特定于方言的编译构造,特别是与 PostgreSQL 的ARRAY
元素一起使用的__getitem__()
运算符。该修复还添加了一个新的异常类UnsupportedCompilationError
,在编译器被要求编译它不知道如何处理的内容时引发。
此更改也被回溯到:0.8.3
参考:#2780 - [sql] [bug]对
Select
构造的相关性行为进行了多次修复,首次引入于 0.8.0:
- 为满足 FROM 条目应向外相关到包含另一个 SELECT 的 SELECT 的用例,然后包含此 SELECT,当通过
Select.correlate()
建立显式相关性时,现在当目标 SELECT 在链中的某处被包含在 WHERE/ORDER BY/columns 子句中时,相关性现在可以跨多个级别工作,而不仅仅是嵌套的 FROM 子句。这使得Select.correlate()
再次更兼容于 0.7,同时仍保持新的“智能”相关性。 - 当未使用显式相关性时,通常的“隐式”相关性将其行为限制在仅限于直接封闭的 SELECT,以最大限度地提高与 0.7 应用程序的兼容性,并且在这种情况下阻止跨嵌套 FROM 的相关性,保持与 0.8.0/0.8.1 的兼容性。
Select.correlate_except()
方法未能在所有情况下阻止给定的 FROM 子句相关性,并且还会导致 FROM 子句被错误地完全省略(更像是 0.7 会做的),这已经修复。- 调用 select.correlate_except(None)将按预期将所有 FROM 子句输入到相关性中。
- 此更改也被回溯到:0.8.2
参考:#2668, #2746 - [sql] [bug]
修复了一个错误,即将一个表“A”的 select()与多个外键路径连接到表“B”,到表“B”,如果直接将表“A”连接到“B”会导致“模糊连接条件”错误,但是它会产生具有多个条件的连接条件。
此更改也被回溯到:0.8.2
参考:#2738 - [sql] [bug] [reflection]
修复了一个错误,即在跨远程模式和本地模式使用MetaData.reflect()
可能会在两个模式都有相同名称的表时产生错误的结果。
此更改也被回溯到:0.8.2
参考:#2728 - [sql] [bug]
从基础ColumnOperators
类中删除了“not implemented”__iter__()
调用,虽然在 0.8.0 版本中引入此功能是为了防止在自定义操作符上实现__getitem__()
方法并在该对象上错误地调用list()
时出现无限增长的内存循环,但这会导致列元素报告它们实际上是可迭代类型,然后在尝试迭代时抛出错误。在这里没有真正的解决办法,所以我们遵循 Python 的最佳实践。在自定义操作符上实现__getitem__()
时要小心!
此更改也被回溯到:0.8.2
参考:#2726 - [sql] [bug]
在调用“attach”事件之前,将“name”属性设置在Index
上,以便可以使用附加事件根据父表和/或列动态生成索引名称。
参考:#2835 - [sql] [bug]
错误的关键字参数“schema”已从ForeignKey
对象中移除。这是一个意外提交,没有任何作用;在使用此关键字参数时,0.8.3 版本会发出警告。
参考:#2831 - [sql] [bug]
对处理“引号”标识符的方式进行了重新设计,不再依赖于传递各种quote=True
标志,而是将这些标志转换为包含引号信息的丰富字符串对象,这些信息包含在它们被传递给像Table
、Column
等常见模式构造时。这解决了各种方法不正确地遵守“引号”标志的问题,例如Engine.has_table()
和相关方法。quoted_name
对象是一个字符串子类,如果需要的话也可以显式使用;该对象将保留传递的引号偏好,并且还将绕过标准化为大写符号的方言执行的“名称规范化”。Oracle、Firebird 和 DB2 等标准化为大写符号的后端现在可以使用强制引号名称,例如小写引号名称和新的保留字。
另请参阅
模式标识符现在携带自己的引号信息
参考:#2812 - [sql] [bug]
对ForeignKey
对象到其目标Column
的解析已经重新设计,以尽可能立即地进行,基于目标Column
与与此ForeignKey
关联的相同MetaData
的时刻,而不是等待构建第一次连接或类似的时刻。这与其他改进一起,允许更早地检测到一些外键配置问题。此外,这里还包括了对类型传播系统的重新设计,因此现在应该可以可靠地在任何通过ForeignKey
引用另一个列的Column
上将类型设置为None
- 该类型将在另一个列关联时立即从目标列复制,并且现在也适用于复合外键。
另请参阅
列现在可以可靠地从通过外键引用的列获取其类型
参考:#1765
postgresql
- [postgresql] [feature]
添加了对 PostgreSQL 9.2 范围类型的支持。目前,不提供类型转换,因此目前直接使用字符串或 psycopg2 2.5 范围扩展类型。补丁由 Chris Withers 提供。
此更改也已回溯至:0.8.2 - [postgresql] [feature]
在使用 psycopg2 DBAPI 时,添加了对“AUTOCOMMIT”隔离的支持。该关键字可通过isolation_level
执行选项使用。补丁由 Roman Podolyaka 提供。
此更改也已回溯至:0.8.2
参考:#2072 - [postgresql] [feature]
当在主键自增列上使用SmallInteger
类型时,基于 PostgreSQL 版本 9.2 或更高版本的服务器版本检测,添加了对SMALLSERIAL
的渲染支持。
参考:#2840 - [postgresql] [bug]
删除了对列的服务器默认值的 128 字符截断;此代码最初来自于 PG 系统视图,用于截断字符串以便阅读。
此更改也已回溯至:0.8.3
参考:#2844 - [postgresql] [bug]
括号将应用于复合 SQL 表达式,如在 CREATE INDEX 语句的列列表中呈现。
此更改也已回溯至:0.8.3
参考:#2742 - [postgresql] [bug]
修复了一个 bug,其中在“PostgreSQL”或“EnterpriseDB”之前带有前缀的 PostgreSQL 版本字符串无法解析。感谢 Scott Schaefer。
此更改也已回溯至:0.8.3
参考:#2819 - [postgresql] [bug]
在 PostgreSQL 方言上,extract()
的行为已经简化,不再向给定表达式注入硬编码的::timestamp
或类似的转换,因为这会干扰诸如时区感知日期时间之类的类型,但在现代版本的 psycopg2 中似乎也不必要。
此更改也已回溯至:0.8.2
参考:#2740 - [postgresql] [bug]
修复了 HSTORE 类型中包含反斜杠引号的键/值在使用“非本机”(即非-psycopg2)手段转换 HSTORE 数据时无法正确转义的 bug。补丁由 Ryan Kelly 提供。
此更改也已回溯至:0.8.2
参考:#2766 - [postgresql] [bug]
修复了一个 bug,其中多列 PostgreSQL 索引中列的顺序会以错误的顺序反映出来。感谢 Roman Podolyaka。
此更改也已回溯至:0.8.2
参考:#2767
mysql
- [mysql] [feature]
与Index
一起使用的mysql_length
参数现在可以作为列名/长度的字典传递,用于复合索引。非常感谢 Roman Podolyaka 的补丁。
此更改也已回溯至:0.8.2
参考:#2704 - [mysql] [feature]
MySQLSET
类型现在具有与ENUM
相同的自动引号行为。设置值时不需要引号,但存在的引号将被自动检测并发出警告。这也有助于 Alembic,其中 SET 类型不带引号。
参考:#2817 - [mysql] [bug]
更新 MySQL 保留字版本 5.5、5.6,感谢 Hanno Schlichting。
此更改也已回溯至:0.8.3, 0.7.11
参考:#2791 - [mysql] [bug]
#2721中的更改是,ForeignKeyConstraint
的deferrable
关键字在 MySQL 后端上被静默忽略,将在 0.9 版本中恢复;此关键字现在将再次呈现,在 MySQL 上引发错误,因为它不被理解 - 相同的行为也将适用于initially
关键字。在 0.8 中,这些关键字将继续被忽略,但会发出警告。此外,match
关键字现在在 0.9 上引发CompileError
,在 0.8 上发出警告;这个关键字不仅被 MySQL 静默忽略,还会破坏 ON UPDATE/ON DELETE 选项。
要使用在 MySQL 上不呈现或呈现不同的ForeignKeyConstraint
,请使用自定义编译选项。文档中已添加了此用法示例,请参阅 MySQL / MariaDB Foreign Keys。
此更改也已回溯至:0.8.3
参考:#2721, #2839 - [mysql] [bug]
MySQL 连接器方言现在允许在 create_engine 查询字符串中设置选项来覆盖连接中设置的默认值,包括“buffered”和“raise_on_warnings”。
此更改也已回溯至:0.8.3
参考:#2515 - [mysql] [bug]
修复了在使用多表 UPDATE 时的 bug,其中一个补充表是带有自己绑定参数的 SELECT,绑定参数的位置与使用 MySQL 的特殊语法时语句本身的位置相反。
此更改也被回溯到:0.8.2
参考:#2768 - [mysql] [bug]
在mysql+gaerdbms
方言中添加了另一个条件,以检测所谓的“开发”模式,在这种模式下,我们应该使用rdbms_mysqldb
DBAPI。修补程序由 Brett Slatkin 提供。
此更改也被回溯到:0.8.2
参考:#2715 - [mysql] [bug]
在ForeignKey
和ForeignKeyConstraint
上的deferrable
关键字参数不会在 MySQL 方言上呈现DEFERRABLE
关键字。很长一段时间以来,我们一直保留这个设置,因为一个非延迟的外键会与一个延迟的外键表现得非常不同,但一些环境只是在 MySQL 上禁用 FKs,所以我们在这里会少些主观意见。
此更改也被回溯到:0.8.2
参考:#2721 - [mysql] [bug]
修复并测试在反射中解析 MySQL 外键选项的问题;这补充了#2183中的工作,我们开始支持外键选项的反射,如 ON UPDATE/ON DELETE cascade。
参考:#2839 - [mysql] [bug]
改进了对 cymysql 驱动程序的支持,支持版本 0.6.5,由 Hajime Nakagami 提供。
sqlite
- [sqlite] [bug]
新增的 SQLite DATETIME 参数 storage_format 和 regexp 显然没有完全正确实现;虽然参数被接受,但实际上它们没有任何效果;这个问题已经修复。
此更改也被回溯到:0.8.3
参考:#2781 - [sqlite] [bug]
将sqlalchemy.types.BIGINT
添加到 SQLite 方言可以反映的类型名称列表中;由 Russell Stuart 提供。
此更改也被回溯到:0.8.2
参考:#2764
mssql
- [mssql] [bug]
在查询 SQL Server 2000 上的信息模式时,删除了在 0.8.1 中添加的一个 CAST 调用,以帮助处理驱动程序问题,显然在 2000 上不兼容。CAST 保留在 SQL Server 2005 及更高版本中。
此更改也被回溯到:0.8.2
参考:#2747 - [mssql] [bug] [pyodbc]
修复了使用 Python 3 + pyodbc 的 MSSQL,包括正确传递语句。
参考:#2355
oracle
- [oracle] [功能] [py3k]
使用 cx_oracle 的 Oracle 单元测试现在在 Python 3 下完全通过。 - [oracle] [错误]
修复了使用同义词进行 Oracle 表反射时出现的错误,如果同义词和表位于不同的远程模式中,则会失败。修复补丁由 Kyle Derr 提供。
此更改也回溯到:0.8.3
参考:#2853
杂项
- [功能]
添加了一个新标志system=True
到Column
,将列标记为数据库自动添加的“系统”列(例如 PostgreSQL 的oid
或xmin
)。该列将在CREATE TABLE
语句中被省略,但仍可用于查询。此外,CreateColumn
构造可以应用于自定义编译规则,允许跳过列,通过生成返回None
的规则。
此更改也回溯到:0.8.3 - [功能] [firebird]
向 kinterbasdb 和 fdb 方言添加了新标志retaining=True
。这控制发送到 DBAPI 连接的commit()
和rollback()
方法的retaining
标志的值。由于历史原因,此标志在 0.8.2 中默认为True
,但在 0.9.0b1 中此标志默认为False
。
此更改也回溯到:0.8.2
参考:#2763 - [功能] [核心]
添加了一个新的变体UpdateBase.returning()
,称为ValuesBase.return_defaults()
;这允许将任意列添加到语句的 RETURNING 子句中,而不会干扰编译器通常的“隐式返回”功能,该功能用于高效地获取新生成的主键值。对于支持的后端,所有获取的值的字典都存在于ResultProxy.returned_defaults
中。
参考:#2793 - [功能] [池]
为“rollback-on-return”和较少使用的“commit-on-return”添加了池记录。这与池“debug”记录一起启用。
参考:#2752 - [功能] [firebird]
当未指定方言修饰符时,fdb
方言现在是默认方言,即firebird://
,因为 Firebird 项目将fdb
发布为其官方 Python 驱动程序。
参考:#2504 - [错误] [firebird]
在反射 Firebird 类型 LONG 和 INT64 时,��型查找已修复,以便将 LONG 视为 INTEGER,INT64 视为 BIGINT,除非类型具有“精度”,在这种情况下,它将被视为 NUMERIC。修复补丁由 Russell Stuart 提供。
此更改也回溯到:0.8.2
参考:#2757 - [bug] [ext]
修复了一个错误,即如果使用函数而不是类设置复合类型,则当尝试检查该列是否为MutableComposite
时,可变扩展会出错(它不是)。感谢 asldevi。
此更改也回溯到:0.8.2 - [requirements]
Python mock 库现在是运行单元测试套件所必需的。虽然作为 Python 3.3 的一部分,但之前的 Python 安装需要安装此库才能运行单元测试或使用sqlalchemy.testing
包来处理外部方言。
此更改也回溯到:0.8.2
0.9.10
发布日期:2015 年 7 月 22 日
orm
- [orm] [feature]
在Query.column_descriptions
返回的字典中添加了一个新条目"entity"
。这指的是由表达式引用的主 ORM 映射类或别名类。与现有的"type"
条目相比,它始终是一个映射实体,即使从列表达式中提取,或者如果给定表达式是纯核心表达式,则为None
。另请参见#3403,该修复了此功能中的一个回归,该回归在 0.9.10 中未发布,但在 1.0 版本中发布。
参考:#3320 - [orm] [bug]
当使用Query.update()
或Query.delete()
方法时,Query
不支持连接、子选择或特殊的 FROM 子句;如果调用了像Query.join()
或Query.select_from()
这样的方法,而不是静默地忽略这些字段,会发出警告。从 1.0.0b5 开始,这将引发错误。
参考:#3349 - [orm] [bug]
修复了在多个嵌套的Session.begin_nested()
操作中,状态跟踪失败传播“脏”标志的错误,导致在内部保存点中更新过的对象在外部保存点回滚时,该对象不会成为过期状态的一部分,因此不会恢复到其数据库状态。
参考:#3352
engine
- [engine] [bug]
将字符串值"none"
添加到Pool.reset_on_return
参数中,作为None
的同义词,以便所有设置都可以使用字符串值,允许像engine_from_config()
这样的实用程序可以无问题地使用。
参考:#3375
sql
- [sql] [feature]
正式支持在Insert.from_select()
中使用的 SELECT 中存在的 CTE。这种行为在 0.9.9 版本之前偶然起作用,之后由于与 #3248 中的不相关更改而不再起作用。请注意,这是在 INSERT 之后、SELECT 之前渲染 WITH 子句的行为;在后续版本中,将针对 INSERT、UPDATE、DELETE 的顶层渲染 CTE 的完整功能作为新功能发布。
参考:#3418 - [sql] [bug]
修复了一个问题,即使用命名约定的MetaData
对象在 pickle 中无法正常工作。属性被跳过,导致如果从未拣选的MetaData
对象基础上创建其他表,则会出现不一致和失败。
参考:#3362
postgresql
- [postgresql] [bug]
修复了一个长期存在的 bug,即在 psycopg2 方言中与非 ascii 值一起使用时,Enum
类型与native_enum=False
一起使用时无法正确解码返回结果。这源于 PGENUM
类型曾经是一个独立的类型,没有“非本地”选项。
参考:#3354
mysql
- [mysql] [bug] [pymysql]
修复了 PyMySQL 在使用“executemany”操作时对 unicode 参数的支持。现在,SQLAlchemy 将语句和绑定参数都作为 unicode 对象传递,因为 PyMySQL 通常在内部使用字符串插值来生成最终语句,并且在 executemany 情况下仅对最终语句执行“encode”步骤。
参考:#3337 - [mysql] [bug] [py3k]
修复了 Py3K 上未正确使用ord()
函数的BIT
类型。感谢 David Marin 提交的拉取请求。
参考:#3333
sqlite
- [SQLite] [错误]
修复了 SQLite 方言中的错误,其中包含非字母字符(如点或空格)的唯一约束的反射不会反射其名称。
参考:#3495
测试
- [测试] [错误] [pypy]
修复了一个导入问题,阻止了 “pypy setup.py test” 的正确工作。
参考:#3406
杂项
- [错误] [扩展]
修复了使用扩展属性仪器系统时的错误,在调用class_mapper()
时,当使用无效输入(也恰好不是弱引用)时,不会引发正确的异常,例如整数。
参考:#3408 - [错误] [扩展]
从 0.9.9 版中回归的错误,其中as_declarative()
符号已从sqlalchemy.ext.declarative
命名空间中删除。
参考:#3324
ORM
- [ORM] [特性]
向Query.column_descriptions
返回的字典中添加了一个新条目"entity"
。它指的是由表达式引用的主要 ORM 映射类或别名类。与现有的"type"
条目相比,它始终是一个映射实体,即使从列表达式中提取,或者如果给定的表达式是一个纯核心表达式,则为 None。另请参阅 #3403,修复了该特性的一个回归,该特性未在 0.9.10 版中发布,但在 1.0 版本中发布了。
参考:#3320 - [ORM] [错误]
Query
在使用Query.update()
或Query.delete()
方法时,不支持连接、子查询或特殊的 FROM 子句;如果已调用像Query.join()
或Query.select_from()
这样的方法,而这些字段又不被静默忽略,那么将会发出警告。自 1.0.0b5 版本起,这将会引发错误。
参考:#3349 - [ORM] [错误]
修复了在多个嵌套的Session.begin_nested()
操作中状态跟踪失败的 bug,当对象在内部保存点中被更新时,未能传播“脏”标志,因此如果外部保存点被回滚,则对象不会成为已过期状态的一部分,因此不会恢复到其数据库状态。
参考:#3352
engine
- [engine] [bug]
将字符串值"none"
添加到Pool.reset_on_return
参数接受的值中,作为None
的同义词,以便所有设置都可以使用字符串值,允许像engine_from_config()
这样的实用程序可以无问题地使用。
参考:#3375
sql
- [sql] [feature]
官方支持在Insert.from_select()
内部使用的 SELECT 中使用 CTE。此行为在 0.9.9 之前意外工作,当时由于与#3248的不相关更改而不再工作。请注意,这是在 INSERT 之后,SELECT 之前呈现 WITH 子句的功能;在 INSERT、UPDATE、DELETE 的顶层呈现 CTE 的完整功能是一个针对以后版本的新功能。
参考:#3418 - [sql] [bug]
修复了使用命名约定的MetaData
对象在与 pickle 一起使用时无法正常工作的问题。属性被跳过,导致不一致和失败,如果反序列化的MetaData
对象用于基于其他表的附加表,则会出现问题。
参考:#3362
postgresql
- [postgresql] [bug]
修复了长期存在的 bug,即在与 psycopg2 方言一起使用时,Enum
类型与非 ascii 值和native_enum=False
一起使用时无法正确解码返回结果。这源自于 PGENUM
类型曾经是一个独立的类型,没有“非本地”选项。
参考:#3354
mysql
- [mysql] [bug] [pymysql]
修复了在使用带有 Unicode 参数的“executemany”操作时 PyMySQL 的 Unicode 支持问题。SQLAlchemy 现在将语句和绑定参数都作为 Unicode 对象传递,因为 PyMySQL 通常在内部使用字符串插值来生成最终语句,并且在 executemany 情况下仅在最终语句上执行“encode”步骤。
参考:#3337 - [mysql] [bug] [py3k]
修复了在 Py3K 上未正确使用ord()
函数的BIT
类型。感谢 David Marin 的拉取请求。
参考:#3333
sqlite
- [sqlite] [bug]
修复了 SQLite 方言中的一个 bug,即反射包含非字母字符(如点或空格)的 UNIQUE 约束的名称时,名称不会被反映出来。
参考:#3495
测试
- [tests] [bug] [pypy]
修复了一个导入问题,导致“pypy setup.py test”无法正常工作。
参考:#3406
杂项
- [bug] [ext]
修复了使用扩展属性仪器系统时的 bug,当使用class_mapper()
调用无效输入(也恰好不是弱引用)时,不会引发正确的异常,例如整数。
参考:#3408 - [bug] [ext]
修复了从 0.9.9 版本开始的回归问题,其中as_declarative()
符号从sqlalchemy.ext.declarative
命名空间中移除。
参考:#3324
SqlAlchemy 2.0 中文文档(六十四)(3)https://developer.aliyun.com/article/1560873