SqlAlchemy 2.0 中文文档(六十四)(4)https://developer.aliyun.com/article/1560874
0.9.1
发布日期:2014 年 1 月 5 日
orm
- [orm] [bug] [events]
修复了回归问题,当使用functools.partial()
与事件系统时,由于在其中使用 inspect.getargspec()来检测某些事件的传统调用签名,因此会导致递归溢出,而显然没有办法在 partial 对象上执行此操作。相反,我们跳过传统检查,并假设现代样式;该检查现在仅在 SessionEvents.after_bulk_update 和 SessionEvents.after_bulk_delete 事件中发生。如果将这两个事件分配给“partial”事件侦听器,则这两个事件将需要新的签名样式。
参考:#2905 - [orm] [错误]
修复了一个 bug,即如果.info
参数仅传递给sessionmaker
创建调用而不传递给对象本身,则使用新的Session.info
属性将失败。感谢 Robin Schoonover。 - [orm] [错误]
修复了回归问题,即在设置基于名称的 backref 时,我们不会根据正确的字符串类检查给定的名称,因此会导致错误“值太多而无法解压缩”。这与 Py3k 转换有关。
参考:#2901 - [orm] [错误]
修复了回归问题,当我们显然仍然在说查询(B)。join(B.cs)时会创建一个隐式别名,其中“C”是一个联接继承类;然而,这个隐式别名只考虑了直接左侧,而没有考虑到同一基类的不同联接继承子类的一系列联接。只要我们在这种情况下仍然隐式别名,行为就会稍微减弱,以便在更广泛的情况下为右侧别名。
参考:#2903
orm 声明
- [orm] [声明] [错误]
修复了一个极不可能发生的内存问题,即当使用DeferredReflection
来定义待反射的类时,如果在调用DeferredReflection.prepare()
方法之前丢弃了其中某些类的子集,则在映射和反映类时,对类的强引用将仍然保持在声明性内部。这个内部的“要映射的类”集合现在使用弱引用来引用这些类本身。 - [orm] [声明] [错误]
一种准回归,显然在 0.8 中,您可以在声明性上设置一个类级属性,直接引用超类或类本身上的InstrumentedAttribute
,它更多或更少地像一个同义词;在 0.9 中,这未能设置足够的记录来跟上从#2789中更自由化的 backref 逻辑。即使这种用例从未直接考虑过,现在在声明性的“setattr()”级别以及在设置子类时也会检测到,并且镜像/重命名属性现在设置为synonym()
。
参考:#2900
orm 扩展
- [orm] [extensions] [feature]
添加了一个新的,实验性的扩展sqlalchemy.ext.automap
。该扩展扩展了声明性的功能以及DeferredReflection
类,以生成一个基类,该基类根据表元数据自动生成映射类和关系。
参见
Automap Extension
Automap
sql
- [sql] [feature]
像and_()
和or_()
这样的连接词现在可以接受 Python 生成器作为单个参数,例如:
and_(x == y for x, y in tuples)
- 这里的逻辑寻找一个单一参数
*args
,其中第一个元素是types.GeneratorType
的实例。
schema
- [schema] [feature]
Table.extend_existing
和Table.autoload_replace
参数现在在MetaData.reflect()
方法中可用。
orm
- [orm] [bug] [events]
修复了一个回归问题,即在事件系统中使用functools.partial()
会因为在其上使用 inspect.getargspec()来检测某些事件的传统调用签名而导致递归溢出,显然无法通过部分对象来实现这一点。相反,我们跳过传统检查并假定现代风格;现在检查本身仅在 SessionEvents.after_bulk_update 和 SessionEvents.after_bulk_delete 事件中发生。如果将这两个事件分配给“partial”事件侦听器,则这两个事件将需要新的签名样式。
参考:#2905 - [orm] [bug]
修复了一个错误,在使用新的Session.info
属性时,如果.info
参数只传递给了sessionmaker
创建调用,而没有传递给对象本身,则会失败。Robin Schoonover 礼貌提供。 - [orm] [bug]
修复了一个回归,当设置基于名称的反向引用时,我们不会检查给定名称与正确的字符串类是否匹配,因此会导致错误“要解包的值太多”。这与 Py3k 转换有关。
参考:#2901 - [orm] [bug]
修复了一个回归,当我们显然仍然在说查询(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] [extensions] [feature]
添加了一个新的、实验性的扩展sqlalchemy.ext.automap
。该扩展扩展了 Declarative 的功能以及DeferredReflection
类,以生成一个基类,该基类根据表元数据自动生成映射类和关系。
另请参阅
Automap Extension
Automap
sql
- [sql] [feature]
像and_()
和or_()
这样的连接词现在可以接受 Python 生成器作为单个参数,例如:
and_(x == y for x, y in tuples)
- 此处的逻辑查找一个单一参数
*args
,其中第一个元素是types.GeneratorType
的实例。
schema
- [schema] [feature]
Table.extend_existing
和Table.autoload_replace
参数现在可以在MetaData.reflect()
方法中使用。
版本:0.9.0
发布日期:2013 年 12 月 30 日
orm
- [orm] [feature]
StatementError
或与 DBAPI 相关的子类现在可以容纳有关异常“原因”的附加信息;当异常发生在自动刷新中时,Session
现在会添加一些详细信息。这种方法是为了与 Py2K 代码以及已经捕获IntegrityError
或类似异常的代码保持兼容,而不是将FlushError
与 Python 3 风格的“链接异常”方法相结合。 - [orm] [feature] [backrefs]
向validates()
函数添加了新参数include_backrefs=True
;当设置为 False 时,如果事件是从另一侧的属性操作的反向引用发起的,则不会触发验证事件。
另请参阅
include_backrefs=False option for @validates
参考:#1535 - [orm] [feature]
通过新的Query.with_for_update()
方法添加了用于指定SELECT
的FOR UPDATE
子句的新 API,以补充新的GenerativeSelect.with_for_update()
方法。感谢 Mario Lassnig 的拉取请求。
另请参阅
对 select(),Query()的新 FOR UPDATE 支持 - [orm] [bug]
对subqueryload()
策略进行了调整,确保查询在加载过程开始后运行;这样 subqueryload 就优先于其他加载器,这些加载器可能由于其他错误的时机导致命中相同属性。
这个更改也被回溯到:0.8.5
参考:#2887 - [orm] [bug]
修复了使用从表到基表的联接表继承时的 bug,其中 PK 列也不是同名的情况;持久性系统在 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 阻止历史记录生效
参考:#2833 - [orm] [bug]
增加了对scoped_session
的新Session.info
属性的支持。 - [orm] [bug]
修复了使用新的Bundle
对象会导致Query.column_descriptions
属性失败的 bug。 - [orm] [bug] [sql] [sqlite]
修复了由于#2369和#2587的连接重写功能引入的回归,其中一个嵌套连接的一侧已经是别名选择时,无法正确翻译外部的 ON 子句的 bug;在 ORM 中,当使用 SELECT 语句作为“secondary”表时,可以看到这种情况。
参考:#2858
orm 声明式
- [orm] [declarative] [bug]
声明式进行额外检查,以检测是否将相同的Column
映射到不同的属性下(通常应该是synonym()
),或者是否给两个或更多的Column
对象赋予相同的名称,如果检测到这种情况,则会发出警告。
参考:#2828 - [orm] [声明式] [错误]
DeferredReflection
类已经增强,为relationship()
引用的“次要”表提供自动反射支持。当指定“次要”表时,无论是作为字符串表名还是作为仅具有名称和MetaData
对象的Table
对象,当调用DeferredReflection.prepare()
时,也将包括在反射过程中。
参考:#2865 - [orm] [声明式] [错误]
修复了一个 bug,在 Py2K 中,unicode 文字不能作为声明式中的类或其他参数的字符串名称被relationship()
接受的 bug。
示例
- [示例] [错误]
修复了一个 bug,该 bug 阻止了 history_meta 配方与多级联继承方案一起工作。
引擎
- [引擎] [特性]
engine_from_config()
函数已经改进,以便我们能够从字符串配置字典中解析特定方言的参数。方言类现在可以提供自己的参数类型列表和字符串转换例程。然而,该功能目前尚未被内置方言使用。
参考:#2875 - [引擎] [错误]
当connect()
调用引发的错误不是dbapi.Error
的子类(如TypeError
、NotImplementedError
等)时,将原样传播该异常。以前,针对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]
修复了在Connection.execute()
中引发了一个预 DBAPIStatementError
时 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]
新增了一种用于指定SELECT
的FOR UPDATE
子句的 API,使用新的GenerativeSelect.with_for_update()
方法。该方法支持一种更直接的设置方言特定选项的系统,与select()
的for_update
关键字参数相比,还支持 SQL 标准的FOR UPDATE OF
子句。ORM 还包括一个新的相应方法Query.with_for_update()
。感谢 Mario Lassnig 的拉取请求。
参见
select()、Query() 新的 FOR UPDATE 支持 - [sql] [feature]
当将返回的浮点值强制转换为 PythonDecimal
时,现在可以配置使用的精度。标志decimal_return_scale
现在由所有Numeric
和Float
类型支持,这将确保从本机浮点值中取出这么多位数字,当它被转换为字符串时。如果不存在,则类型将使用.scale
的值,如果类型支持此设置且它不为 None。否则将使用原始默认长度 10。
另请参见
本机浮点类型的浮点字符串转换精度可配置
参考:#2867 - [sql] [bug]
修复了一个问题,即具有 Sequence 的主键列,但该列不是“自动增量”列,可能是因为具有外键约束或设置了autoincrement=False
,在没有支持序列的后端上,当插入缺少主键值的 INSERT 时,会尝试触发 Sequence。这将发生在像 SQLite、MySQL 这样的非序列后端上。
此更改也已回溯至:0.8.5
参考:#2896 - [sql] [bug]
修复了Insert.from_select()
方法的 bug,其中给定名称的顺序在生成 INSERT 语句时不会被考虑,因此与给定 SELECT 语句中的列名不匹配。还注意到Insert.from_select()
暗示着不能使用 Python 端的插入默认值,因为该语句没有 VALUES 子句。
此更改也已回溯至:0.8.5
参考:#2895 - [sql] [bug]
当给定一个普通文本值时,cast()
函数现在会根据给定的类型将给定的文本值应用到绑定参数侧,方式与type_coerce()
函数相同。然而,与type_coerce()
不同的是,只有当传递给cast()
的不是 clauseelement 值时,才会生效;现有的类型构造将保留其类型。 - [sql] [错误]
ForeignKey
类更积极地检查给定的列参数。如果不是字符串,则检查对象至少是ColumnClause
或解析为其中一个的对象,并且.table
属性(如果存在)指向TableClause
或其子类,而不是类似Alias
的东西。否则,将引发ArgumentError
。
参考:#2883 - [sql] [错误]
ColumnOperators.collate()
运算符的优先规则已经修改,使得 COLLATE 运算符现在比比较运算符的优先级低。这样做的效果是,应用于比较的 COLLATE 不会在比较周围添加括号,这样的括号在诸如 MSSQL 等后端不会被解析。这个改变对那些通过将Operators.collate()
应用于比较表达式的单个元素而绕过问题的设置是不兼容的,而不是整个比较表达式。
另请参阅
COLLATE 的优先规则已更改
参考:#2879 - [sql] [增强]
当在编译的语句中存在一个未提供值的BindParameter
时引发的异常现在在错误消息中包含了绑定参数的键名。
此更改也回溯到:0.8.5
模式
postgresql
- [postgresql] [feature]
添加了对 PostgreSQL JSON 的支持,使用新的JSON
类型。非常感谢 Nathan Rice 实施和测试。
参考:#2581 - [postgresql] [feature]
通过TSVECTOR
类型添加了对 PostgreSQL TSVECTOR 的支持。拉取请求由 Noufal Ibrahim 提供。 - [postgresql] [bug]
修复了一个 bug,当使用 pypostgresql 适配器时,索引反射会错误地解释 indkey 值,该适配器将这些值作为列表返回,而不是 psycopg2 返回的字符串类型。
此更改也被回溯到:0.8.4
参考:#2855 - [postgresql] [bug]
现在使用 psycopg2 的 UNICODEARRAY 扩展来处理带有 psycopg2 + 普通“本地 unicode”模式的 unicode 数组,与 UNICODE 扩展的使用方式相同。 - [postgresql] [bug]
修复了 ENUM 中的值未对单引号进行转义的 bug。请注意,对于手动转义单引号的现有解决方法来说,这是不兼容��。
另请参阅
PostgreSQL CREATE TYPE AS ENUM 现在对值应用引号
参考:#2878
mysql
- [mysql] [bug]
改进了 SQL 类型在__repr__()
中生成的系统,特别是关于 MySQL 整数/数字/字符类型,这些类型具有各种关键字参数。__repr__()
对于 Alembic autogenerate 很重要,用于在迁移脚本中呈现 Python 代码时使用。
参考:#2893
mssql
- [mssql] [bug] [firebird]
使用Float
类型时,与“asdecimal”标志一起使用将适用于 Firebird 以及 mssql+pyodbc 方言;以前未发生十进制转换。
此更改也被回溯到:0.8.5 - [mssql] [bug] [pymssql]
将“Net-Lib error during Connection reset by peer”消息添加到 pymssql 方言中检查“disconnect”消息的列表中。感谢 John Anderson。
此更改也被回溯到:0.8.5 - [mssql] [bug]
修复了 0.8.0 中引入的 bug,当 MSSQL 中的索引位于替代模式中时,DROP INDEX
语句会渲染错误;模式名/表名会被颠倒。格式也已经修订以匹配当前的 MSSQL 文档。感谢 Derek Harland。
此更改也被回溯到:0.8.4
oracle
- [oracle] [bug]
将 ORA-02396“最大空闲时间”错误代码添加到与 cx_oracle 一起的“is disconnect”代码列表中。
此更改也已回溯至:0.8.4
参考:#2864 - [oracle] [bug]
修复了 Oracle 中未指定长度的VARCHAR
类型(例如用于CAST
或类似操作)会错误地呈现为None CHAR
或类似情况的错误。
此更改也已回溯至:0.8.4
参考:#2870
杂项
- [bug] [firebird]
Firebird 方言将引用以下划线开头的标识符。感谢 Treeve Jelbert。
此更改也已回溯至:0.8.5
参考:#2897 - [bug] [firebird]
修复了 Firebird 索引反射中列未正确排序的错误;现在它们按照 RDB$FIELD_POSITION 的顺序排序。
此更改也已回溯至:0.8.5 - [bug] [declarative]
当将字符串参数发送到relationship()
时,如果未解析为类或映射器,则错误消息已更正为与接收非字符串参数时相同的方式,该方式指示配置错误的关系名称。
此更改也已回溯至:0.8.5
参考:#2888 - [bug] [ext]
修复了一个错误,该错误导致serializer
扩展无法正确处理包含非 ASCII 字符的表或列名称。
此更改也已回溯至:0.8.4
参考:#2869 - [bug] [firebird]
更改了 Firebird 用于列出表和视图名称的查询,从rdb$relations
视图查询,而不是从rdb$relation_fields
和rdb$view_relations
视图查询。许多 FAQ 和博客中提到了新旧查询的变体,但新查询直接来自“Firebird FAQ”,这似乎是最官方的信息来源。
参考:#2898 - [removed]
“informix”和“informixdb”方言已被移除;该代码现在作为一个独立的存储库在 Bitbucket 上提供。自从添加 informixdb 方言以来,IBM-DB 项目提供了生产级 Informix 支持。
orm
- [orm] [feature]
StatementError
或 DBAPI 相关的子类现在可以容纳有关异常“原因”的其他信息;当异常发生在自动刷新中时,Session
现在会在异常发生时添加一些详细信息。与将FlushError
与 Python 3 风格的“链接异常”方法相结合以保持与 Py2K 代码以及已经捕获IntegrityError
或类似异常的代码的兼容性相比,采取了这种方法。 - [orm] [feature] [backrefs]
向validates()
函数添加了新参数include_backrefs=True
;当设置为 False 时,如果事件是从另一侧的属性操作的反向引用发起的,则不会触发验证事件。
另请参阅
include_backrefs=False option for @validates
参考:#1535 - [orm] [feature]
添加了一个新的 API 来指定SELECT
的FOR UPDATE
子句,使用新的Query.with_for_update()
方法,以补充新的GenerativeSelect.with_for_update()
方法。感谢 Mario Lassnig 的拉取请求。
另请参阅
New FOR UPDATE support on select(), Query() - [orm] [bug]
对subqueryload()
策略进行了调整,确保查询在加载过程开始后运行;这样,subqueryload 优先于其他加载器运行,这些加载器可能由于其他错误的时机导致了其他急切/无加载情况。
此更改也回溯到:0.8.5
参考:#2887 - [orm] [bug]
修复了使用从表到基表的连接表继承时的错误,其中主键列也不同名的 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 中,但在刷新期间不会代表修改的属性进行任何更改。该属性仍然会发出事件,例如反向引用事件和用户定义的事件,并且仍将从反向引用接收到变化。
另请参见
在 relationship()上设置 viewonly=True 可以阻止历史记录生效
参考:#2833 - [orm] [bug]
为新的Session.info
属性添加了对scoped_session
的支持。 - [orm] [bug]
修复了使用新的Bundle
对象会导致Query.column_descriptions
属性失败的 bug。 - [ORM] [错误] [SQL] [SQLite]
修复了由 #2369 和 #2587 的连接重写特性引入的回归,其中一个嵌套连接的一侧已经是别名选择时,外部的 ON 子句无法正确转换的问题;在 ORM 中,当使用 SELECT 语句作为“次要”表时,可能会出现这种情况。
参考:#2858
ORM 声明式
- [ORM] [声明式] [错误]
Declarative 做了额外的检查,以检测同一个Column
是否在不同属性下被映射多次(通常应该是synonym()
),或者是否有两个或更多的Column
对象具有相同的名称,如果检测到这种情况,则会发出警告。
参考:#2828 - [ORM] [声明式] [错误]
DeferredReflection
类已经增强,以提供对由relationship()
引用的“次要”表的自动反射支持。当指定“次要”表时,无论是作为字符串表名,还是作为仅具有名称和MetaData
对象的Table
对象,当调用DeferredReflection.prepare()
时,也将包括在反射过程中。
参考:#2865 - [ORM] [声明式] [错误]
修复了一个 bug,在 Py2K 中,unicode 文本不能被接受作为声明式中relationship()
内的类或其他参数的字符串名称。
示例
- [示例] [错误]
修复了一个 bug,该 bug 阻止了 history_meta 配方与超过一级深度的连接继承方案一起工作。
引擎
- [引擎] [特性]
engine_from_config()
函数已经改进,以便我们能够从字符串配置字典中解析特定于方言的参数。方言类现在可以提供自己的参数类型列表和字符串转换例程。然而,该功能尚未被内置方言使用。
参考:#2875 - [引擎] [错误]
引发connect()
上错误的 DBAPI 如果不是 dbapi.Error 的子类(如TypeError
、NotImplementedError
等),则会传播未改变的异常。以前,connect()
例程的特定错误处理既不恰当地通过方言的Dialect.is_disconnect()
例程运行异常,也将其包装在sqlalchemy.exc.DBAPIError
中。现在,它与执行过程中发生的方式相同,未经改变地传播。
此更改还被回溯到: 0.8.4
参考:#2881 - [引擎] [错误] [池]
QueuePool
已经增强,以便在现有连接尝试阻塞时不会阻塞新的连接尝试。以前,新连接的生成在监视溢出的块内序列化;现在,在连接过程本身之外,溢出计数器在其自己的关键部分中进行了更改。
此更改还被回溯到: 0.8.4
参考:#2880 - [引擎] [错误] [池]
对等待池连接可用性的逻辑进行了轻微调整,以便于对于未指定超时的连接池,每隔半秒钟就会中断等待以检查所谓的“中止”标志,这允许等待者在整个连接池被抛弃的情况下中断;通常情况下,等待者应该因为 notify_all()而中断,但在极少数情况下可能会漏掉这个 notify_all()。这是逻辑在 0.8.0 中首次引入的扩展,该问题只在压力测试中偶尔观察到。
此更改还被回溯到: 0.8.4
参考:#2522 - [引擎] [错误]
修复了一个 bug,当在Connection.execute()
中引发一个预先 DBAPIStatementError
时,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()
。当构造在“literal bound”上下文中编译时,text()
构造还可以呈现“内联”绑定参数。
另请参阅
新的 text()功能
参考:#2877, #2882 - [sql] [feature]
添加了用于指定SELECT
的FOR UPDATE
子句的新 API,使用新的GenerativeSelect.with_for_update()
方法。该方法支持一种更直接的设置方言特定选项的系统,与select()
的for_update
关键字参数相比,还包括对 SQL 标准FOR UPDATE OF
子句的支持。ORM 还包括一个新的相应方法Query.with_for_update()
。感谢 Mario Lassnig 的拉取请求。
另请参阅
在 select(),Query()上支持新的 FOR UPDATE - [sql] [feature]
当将返回的浮点值强制转换为 PythonDecimal
时使用的精度现在是可配置的。现在,所有Numeric
和Float
类型都支持标志decimal_return_scale
,这将确保从本机浮点值转换为字符串时取出这么多位数。如果不存在,则类型将使用.scale
的值,如果类型支持此设置且不为None
。否则将使用原始默认长度为 10。
另请参阅
本地浮点类型的可配置浮点字符串转换精度
参考:#2867 - [sql] [bug]
修复了主键列具有 Sequence 但列不是“自动增量”列的问题,要么因为它有外键约束,要么设置了autoincrement=False
,当在没有主键值的情况下提供 INSERT 时,会尝试在不支持序列的后端上触发 Sequence。这将发生在像 SQLite,MySQL 这样的非序列后端上。
此更改也回溯到:0.8.5
参考:#2896 - [sql] [bug]
修复了Insert.from_select()
方法的错误,其中给定名称的顺序在生成 INSERT 语句时不会被考虑,因此与给定 SELECT 语句中的列名不匹配。还指出Insert.from_select()
暗示不能使用 Python 端的插入默认值,因为该语句没有 VALUES 子句。
此更改也回溯到:0.8.5
参考:#2895 - [sql] [错误]
当cast()
函数给定普通文字值时,现在将根据给定的类型将给定的文字值应用于绑定参数侧,方式与type_coerce()
函数相同。但与type_coerce()
不同,只有在传递非 clauseelement 值给cast()
时才会生效;现有的类型构造将保留其类型。 - [sql] [错误]
ForeignKey
类更积极地检查给定的列参数。如果不是字符串,则检查对象至少是ColumnClause
,或者解析为其中一个的对象,并且.table
属性(如果存在)指向TableClause
或其子类,而不是像Alias
之类的东西。否则,将引发ArgumentError
。
参考:#2883 - [sql] [错误]
ColumnOperators.collate()
运算符的优先规则已经修改,使得 COLLATE 运算符现在比比较运算符的优先级低。这样做的效果是,应用于比较的 COLLATE 不会在比较周围添加括号,这在后端如 MSSQL 中不会被解析。对于那些通过将Operators.collate()
应用于比较表达式的单个元素而不是整个比较表达式来解决问题的设置,此更改是不兼容的。
另请参阅
COLLATE 的优先规则已更改
参考:#2879 - [sql] [增强]
当编译语句中存在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 方言中检查的 “disconnect” 消息列表中。感谢 John Anderson。
此更改也被回溯到:0.8.5 - [mssql] [错误]
修复了在 0.8.0 中引入的 bug,如果 MSSQL 中的索引位于替代模式中,则DROP INDEX
语句将呈现错误;模式名/表名将被颠倒。格式也已经修订以匹配当前的 MSSQL 文档。感谢 Derek Harland。
此更改也回溯至:0.8.4
oracle
- [oracle] [bug]
将 ORA-02396“最大空闲时间”错误代码添加到与 cx_oracle 一起“断开连接”代码列表中。
此更改也回溯至:0.8.4
参考:#2864 - [oracle] [bug]
修复了 Oracle 中未给出长度的VARCHAR
类型(例如用于CAST
或类似操作)会错误地呈现None CHAR
或类似情况的错误。
此更改也回溯至:0.8.4
参考:#2870
杂项
- [bug] [firebird]
火鸟方言将引用以下划线开头的标识符。Treeve Jelbert 提供。
此更改也回溯至:0.8.5
参考:#2897 - [bug] [firebird]
修复了 Firebird 索引反射中列未正确排序的错误;它们现在按照 RDB$FIELD_POSITION 的顺序排序。
此更改也回溯至:0.8.5 - [bug] [declarative]
当发送给relationship()
的字符串参数无法解析为类或映射器时,错误消息已更正,以与接收非字符串参数时相同的方式工作,指示配置错误的关系名称。
此更改也回溯至:0.8.5
参考:#2888 - [bug] [ext]
修复了阻止serializer
扩展与包含非 ASCII 字符的表或列名正常工作的错误。
此更改也回溯至:0.8.4
参考:#2869 - [bug] [firebird]
更改了 Firebird 用于列出表和视图名称的查询,从rdb$relations
视图而不是rdb$relation_fields
和rdb$view_relations
视图查询。许多 FAQ 和博客中提到了新旧查询的变体,但新查询直接来自“Firebird FAQ”,似乎是最官方的信息来源。
参考:#2898 - [removed]
“informix”和“informixdb”方言已被移除;代码现在作为一个独立的存储库在 Bitbucket 上提供���自从添加 informixdb 方言以来,IBM-DB 项目提供了生产级 Informix 支持。
0.9.0b1
发布日期:2013 年 10 月 26 日
general
- [general] [feature] [py3k]
C 扩展已移植到 Python 3,并将在任何支持的 CPython 2 或 3 环境下构建。
参考:#2161 - [general] [feature] [py3k]
代码库现在针对 Python 2 和 3“原地”,不再需要运行 2to3。兼容性现在针对 Python 2.6 及更高版本。
参考:#2671 - [general]
对许多 Core 模块以及 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
,如果标量关系本身指向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] [feature]
现在,当在基于列的Query
中使用composite()
构造时,会维持返回对象,而不会扩展为单独的列。这是利用了内部的新Bundle
特性。这种行为是不向后兼容的;要从一个将要展开的复合列中选择,请使用MyClass.some_composite.clauses
。
另请参阅
当按属性基础查询时,复合属性现在作为其对象形式返回
参考:#2824 - [orm] [feature]
新增了一个构造Bundle
,允许对列表达式的组进行指定,并作为单个元组返回默认。然而,可以重写Bundle
的行为,以对返回的行进行任何形式的结果处理。现在,在使用基于列的Query
时,Bundle
的行为也嵌入到复合属性中。
另请参阅
ORM 查询的列绑定
当按属性基础查询时,复合属性现在作为其对象形式返回
参考:#2824 - [orm] [feature]
Mapper
的version_id_generator
参数现在可以指定依赖于服务器生成的版本标识符,使用触发器或其他数据库提供的版本控制功能,或通过设置version_id_generator=False
来使用可选的程序值。当使用服务器生成的版本标识符时,ORM 将在可用时使用 RETURNING 立即加载新版本值,否则将发出第二个 SELECT。
参考:#2793 - [orm] [feature]
Mapper
的eager_defaults
标志现在将允许使用内联 RETURNING 子句获取新生成的默认值,而不是使用第二个 SELECT 语句,适用于支持 RETURNING 的后端。
参考:#2793 - [orm] [feature]
向Session
添加了一个新属性Session.info
;这是一个字典,应用程序可以将任意数据存储在Session
本地。Session.info
的内容也可以使用Session
或sessionmaker
的info
参数进行初始化。 - [orm] [feature]
现在已实现事件监听器的移除。该功能通过remove()
函数提供。
另请参阅
事件移除 API
参考:#2268 - [orm] [feature]
属性事件传递的机制已更改,现在将AttributeImpl
作为“initiator”令牌传递; 对象现在是一个称为Event
的特定于事件的对象。此外,属性系统不再根据匹配的“initiator”令牌停止事件; 此逻辑已移至特定于 ORM 反向引用事件处理程序的地方,这些处理程序是将属性事件重新传播到后续附加/设置/删除操作的典型来源。模拟反向引用行为的最终用户代码现在必须确保递归事件传播方案被停止,如果该方案不使用反向引用处理程序。使用这个新系统,当对象附加到集合时,与新的多对一关联,与先前的多对一解除关联,然后从先前的集合中移除时,反向引用处理程序现在可以执行“两跳”操作。在此更改之前,从先前集合中删除的最后一步将不会发生。
另请参阅
反向引用处理程序现在可以传播多个级别
参考:#2789 - [orm] [功能]
关于 ORM 如何构建右侧是自身连接或左外连接的连接的重大变化。现在,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]
的 bug,特别是在使用关联代理时可能发生。由于 Python 集合中的某些怪癖,该问题在 Python 3 中比在 Python 2 中更有可能发生。
此更改也已回溯至:0.8.3, 0.7.11
参考:#2807 - [orm] [bug]
修复了在与父Table
关联之前使用remote()
或foreign()
等注释时可能导致父表未在连接中呈现的问题的 bug,这是由注释执行的固有复制操作引起的。
此更改也已回溯至:0.8.3
参考:#2813 - [orm] [bug]
修复了Query.exists()
在没有任何 WHERE 条件的情况下无法正常工作的 bug。感谢 Vladimir Magamedov。
此更改也已回溯至:0.8.3
参考:#2818 - [orm] [bug]
修复了 ORM 用于迭代映射器层次结构的有序序列实现中的潜在问题;在 Jython 解释器下,这个实现没有排序,尽管 cPython 和 PyPy 保持了排序。
此更改也被回溯到:0.8.3
参考:#2794 - [orm] [bug]
修复了 ORM 级别事件注册中的 bug,在某些“未映射基类”配置中,“原始”或“传播”标志可能被错误配置。
此更改也被回溯到:0.8.3
参考:#2786 - [orm] [bug]
修复了在加载映射实体时使用defer()
选项时与性能相关的问题。在加载时将每个对象的延迟可调用函数应用到实例的函数开销明显高于仅从行加载数据的开销(请注意,defer()
旨在减少数据库/网络开销,而不一定是函数调用次数);在所有情况下,函数调用开销现在小于从列加载数据的开销。每次加载从 N(结果中的总延迟值)减少到 1(延迟列的总数)的“延迟可调用”对象的数量也有所减少。
此更改也被回溯到:0.8.3
参考:#2778 - [orm] [bug]
修复了一个 bug,当使用make_transient()
函数将对象从“持久”状态移动到“挂起”状态时,涉及基于集合的反向引用的操作会导致属性历史函数失败。
此更改也被回溯到:0.8.3
参考:#2773 - [orm] [bug]
当尝试刷新已分配给类别无效值的继承类对象时,会发出警告。
此更改也被回溯到:0.8.2
参考:#2750 - [orm] [bug]
修复了多个加入继承实体针对同一基类相互加入时,在连接字符串超过两个实体时,不会独立跟踪基表上的列的多态 SQL 生成中的 bug。
此更改也被回溯到:0.8.2
参考:#2759 - [orm] [bug]
修复了将复合属性传递到Query.order_by()
会产生一种某些数据库不接受的带括号表达式的 bug。
此更改也被回溯到:0.8.2
参考:#2754 - [orm] [bug]
修复了复合属性与aliased()
函数之间的交互。以前,在应用别名时,复合属性在比较操作中不会正常工作。
此更改也回溯到:0.8.2
参考:#2755 - [orm] [bug] [ext]
修复了当调用clear()
时MutableDict
未报告更改事件的错误。
此更改也回溯到: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 多对多关系的 JOIN 中,“secondary”和右侧表现在括号内进行内连接,以便左->右连接可以准确过滤。这个改变是通过最终解决了在#2587中概述的右嵌套连接问题而实现的。
另请参阅
许多 JOIN 和 LEFT OUTER JOIN 表达式将不再被包装在(SELECT * FROM …) AS ANON_1 中
参考:#2369 - [orm] [bug]
Query.select_from()
方法的“自动别名”行为已被关闭。现在可以通过新方法Query.select_entity_from()
获得特定行为。这里的自动别名行为从未有很好的文档记录,并且通常不是所需的行为,因为Query.select_from()
更多地用于控制如何呈现 JOIN。Query.select_entity_from()
也将在 0.8 中提供,以便依赖自动别名的应用程序可以转向使用此方法。
另请参阅
_query.Query.select_from()不再将子句应用于相应的实体
参考:#2736
orm 声明
- [orm] [bug]
添加了一个方便的类装饰器as_declarative()
,它是对declarative_base()
的包装,允许使用一种巧妙的类装饰方法应用现有的基类。
此更改也回溯到:0.8.3 - [orm] [bug]
现在可以在与order_by
、primaryjoin
或类似的用法中使用字符串参数引用 ORM 描述符,例如混合属性,以及列绑定属性,用于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 - [引擎] [错误]
修复了一个 bug,当Pool
的各种实现中的reset_on_return
参数在重新生成池时未被传播时。感谢 Eevee。
这个更改也被回溯到:0.8.2 - [引擎] [错误]
Dialect.reflecttable()
的方法签名,所有已知情况下都由DefaultDialect
提供,已经被调整为期望include_columns
和exclude_columns
参数,不带任何 kw 选项,减少了歧义 - 以前缺少了exclude_columns
。
参考:#2748
sql
- [sql] [特性]
添加了对“唯一约束”反射的支持,通过Inspector.get_unique_constraints()
方法。感谢 Roman Podolyaka 的补丁。
这个更改也被回溯到:0.8.4
参考:#1443 - [sql] [特性]
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] [特性] [mysql] [postgresql]
PostgreSQL 和 MySQL 方言现在支持外键选项的反射/检查,包括 ON UPDATE、ON DELETE。PostgreSQL 还反映了 MATCH、DEFERRABLE 和 INITIALLY。感谢 ijl。
参考:#2183 - [sql] [特性]
一个带有“null”类型(例如没有指定类型)的bindparam()
构造现在在用于有类型表达式时会被复制,并且新的副本会被分配给比较列的实际类型。以前,这个逻辑会在给定的bindparam()
上发生。此外,类似的过程现在也会发生在传递给ValuesBase.values()
用于Insert
或Update
构造的bindparam()
构造中,在构造的编译阶段。
这两者都是一些微妙的行为变化,可能会影响一些用法。
参见
一个没有类型的bindparam()
构造在有类型时通过复制升级
参考:#2850 - [sql] [特性]
对特殊符号的表达式处理进行了彻底改革,特别是连接词,例如None
null()
true()
false()
,包括在连接词中渲染 NULL 的一致性,“短路”and_()
和or_()
表达式中包含布尔常量,并且将布尔常量和表达式渲染为与不支持true
/false
常量的后端相比的“1”或“0”。
参见
改进的布尔常量、NULL 常量、连接词的渲染
参考:#2734, #2804, #2823 - [sql] [特性]
现在,键入系统处理呈现“文字绑定”值的任务,例如通常是绑定参数但由于上下文必须呈现为字符串的值,通常在 DDL 构造中,例如 CHECK 约束和索引中(请注意,“文字绑定”值从#2742开始被 DDL 使用)。一个新方法TypeEngine.literal_processor()
作为基础,添加了TypeDecorator.process_literal_param()
以允许包装本机文字呈现方法。
另请参阅
键入系统现在处理呈现“文字绑定”值的任务。
参考:#2838 - [sql] [功能]
Table.tometadata()
方法现在会复制所有结构中所有SchemaItem
对象的所有SchemaItem.info
字典,包括列、约束、外键等。由于这些字典是副本,它们独立于原始字典。以前,此操作仅传输Column
的.info
字典,并且仅在原地链接,而不是复制。
参考:#2716 - [sql] [功能]
Column
的default
参数现在接受类或对象方法作为参数,除了独立函数;将正确检测是否接受“上下文”参数。 - [sql] [功能]
添加了新方法到insert()
构造Insert.from_select()
。给定列的列表和可选择的内容,呈现INSERT INTO (table) (columns) SELECT ..
。虽然此功能作为 0.9 的一部分而突出显示,但也已回溯到 0.8.3。
另请参阅
从 SELECT 插入
参考:#722 - [sql] [功能]
为TypeDecorator
提供了一个名为TypeDecorator.coerce_to_is_types
的新属性,以便更容易控制使用==
或!=
与None
和布尔类型进行比较时如何生成IS
表达式,或者与绑定参数一起生成普通的相等表达式。
参考:#2734, #2744 - [sql] [feature]
如果label()
构造也在 select 的列子句中引用了该标签,则该label()
构造现在将仅在ORDER BY
子句中呈现其名称,而不是重新编写完整表达式。这使得数据库有更好的机会优化在两个不同上下文中评估相同表达式。
另请参阅
标签构造现在可以在 ORDER BY 中仅呈现其名称
参考:#1068 - [sql] [bug]
修复了自 0.7.9 以来的回归,即如果在多个 FROM 子句中引用了 CTE 的名称,则可能无法正确引用 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]
一个select()
在其 FROM 子句中引用自身,通常通过就地突变,将引发信息性错误消息,而不是导致递归溢出。
此更改也被回溯到:0.8.3
参考:#2815 - [sql] [bug]
修复了使用column_reflect
事件更改传入Column
的.key
会阻止正确反映主键约束、索引和外键约束的 bug。
此更改也被回溯到:0.8.3
参考:#2811 - [sql] [bug]
0.8 中添加的ColumnOperators.notin_()
运算符现在正确地生成了对空集合使用时“IN”返回的否定。
此更改也被回溯到:0.8.3 - [sql] [bug] [postgresql]
修复了表达式系统依赖于select()
构造中的.c
集合的str()
形式的一些表达式的 bug,但由于元素依赖于方言特定的编译构造,特别是与 PostgreSQLARRAY
元素一起使用的__getitem__()
运算符,因此str()
形式不可用。 修复还添加了一个新的异常类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]
修复了一个 bug,即将表“A”的多个外键路径的select()
与表“B”连接到表“B”时,如果直接将表“A”与“B”连接,则不会产生“模糊的连接条件”错误,而是会产生具有多个条件的连接条件。
此更改也回溯到:0.8.2
参考:#2738 - [sql] [bug] [reflection]
修复了一个 bug,即在跨远程模式和本地模式使用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”事件之前,Index
上设置了“name”属性,以便可以使用附加事件根据父表和/或列动态生成索引名称。
参考:#2835 - [sql] [bug]
ForeignKey
对象中的错误 kw 参数“schema”已被移除。这是一个意外提交,没有任何作用;在使用此 kw 参数时,0.8.3 版本会发出警告。
参考:#2831 - [sql] [bug]
对“引号”标识符处理方式进行了重新设计,不再依赖于传递各种quote=True
标志,而是将这些标志转换为包含引号信息的丰富字符串对象,并在它们传递给像Table
、Column
等常见模式构造时包含这些信息。这解决了各种方法不正确遵守“quote”标志的问题,例如Engine.has_table()
和相关方法。quoted_name
对象是一个字符串子类,如果需要,也可以明确使用;该对象将保留传递的引号首选项,并且还将绕过标准化为大写符号的方言执行的“名称规范化”。结果是,“大写”后端现在可以使用强制引号名称,例如小写引号名称和新的保留字。
另请参阅
模式标识符现在携带自己的引号信息
参考:#2812 - [sql] [bug]
ForeignKey
对象解析为其目标Column
的分辨率已经重新设计,以尽可能立即进行,基于目标Column
与此ForeignKey
关联的相同MetaData
的时刻,而不是等待构建联接的第一次或类似情况。这与其他改进一起,允许更早地检测到一些外键配置问题。此外,这里还包括对类型传播系统的重新设计,因此现在应该可以可靠地在通过ForeignKey
引用另一个Column
的任何Column
上将类型设置为None
- 该类型将在另一个列关联时立即从目标列复制,并且现在也适用于复合外键。
另请参阅
列可以可靠地从通过 ForeignKey 引用的列获取其类型
参考:#1765
postgresql
- [postgresql] [feature]
支持 PostgreSQL 9.2 范围类型已添加。目前尚未提供类型转换,因此暂时直接使用字符串或 psycopg2 2.5 范围扩展类型。补丁由 Chris Withers 提供。
此更改也已回溯至:0.8.2 - [postgresql] [功能]
在使用 psycopg2 DBAPI 时,添加了对“AUTOCOMMIT”隔离的支持。关键字可通过isolation_level
执行选项使用。补丁由 Roman Podolyaka 提供。
此更改也已回溯至:0.8.2
参考:#2072 - [postgresql] [功能]
当在主键自增列上使用SmallInteger
类型时,根据 PostgreSQL 版本检测,添加了对SMALLSERIAL
的呈现支持。
参考:#2840 - [postgresql] [错误]
删除了从列的服务器默认反射中的 128 字符截断;此代码最初来自 PG 系统视图,用于可读性截断字符串。
此更改也已回溯至:0.8.3
参考:#2844 - [postgresql] [错误]
在 CREATE INDEX 语句的列列表中,将会对复合 SQL 表达式应用括号。
此更改也已回溯至:0.8.3
参考:#2742 - [postgresql] [错误]
修复了 PostgreSQL 版本字符串前缀为“PostgreSQL”或“EnterpriseDB”之前的字符串不会解析的错误。由 Scott Schaefer 提供。
此更改也已回溯至:0.8.3
参考:#2819 - [postgresql] [错误]
在 PostgreSQL 方言上,extract()
的行为已简化,不再将硬编码的::timestamp
或类似的转换注入到给定的表达式中,因为这会干扰诸如时区感知日期时间之类的类型,但是对于现代版本的 psycopg2 似乎也不是必需的。
此更改也已回溯至:0.8.2
参考:#2740 - [postgresql] [错误]
修复了 HSTORE 类型中包含反斜杠引号的键/值在使用“非本机”(即非-psycopg2)方式转换 HSTORE 数据时不会正确转义的错误。补丁由 Ryan Kelly 提供。
此更改也已回溯至:0.8.2
参考:#2766 - [postgresql] [错误]
修复了多列 PostgreSQL 索引中列顺序反映错误的错误。由 Roman Podolyaka 提供。
此更改也已回溯至:0.8.2
参考:#2767
mysql
- [mysql] [功能]
与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中的更改是,MySQL 后端对ForeignKeyConstraint
的deferrable
关键字被静默忽略,将在 0.9 版本中恢复;此关键字现在将再次呈现,在 MySQL 上引发错误,因为它不被理解 - 相同的行为也将适用于initially
关键字。在 0.8 版本中