0.8 更新日志
0.8.7
发布日期:2014 年 7 月 22 日
orm
- [orm] [bug]
修复了子查询的急加载中的一个错误,即在与多态加载一起使用时,跨多态子类边界的长链急加载会失败,无法在链中找到子类链接,导致在AliasedClass
上出现缺失属性名称的错误。
参考:#3055 - [orm] [bug]
修复了 ORM 中的一个错误,即class_mapper()
函数会掩盖应该在映射器配置期间由于用户错误引发的 AttributeErrors 或 KeyErrors。对于属性/键错误的捕获已经更具体,不包括配置步骤。
参考:#3047
sql
- [sql] [bug]
修复了Enum
和其他SchemaType
子类的错误,即直接将类型与MetaData
关联会导致在发出事件(如创建事件)时 Hang 住MetaData
。
参考:#3124 - [sql] [bug]
修复了自定义操作符加上TypeEngine.with_variant()
系统中的一个错误,在使用变体时与TypeDecorator
结合使用时,当使用比较运算符时会出现 MRO 错误。
参考:#3102 - [sql] [bug]
修复了 INSERT…FROM SELECT 构造中的一个错误,即从 UNION 选择时,会将联合包装在一个匿名(例如未标记的)子查询中。
参考:#3044 - [sql] [bug]
修复了Table.update()
和Table.delete()
在应用空的and_()
或or_()
或其他空表达式时产生空的 WHERE 子句的错误。现在与select()
一致。
参考:#3045
postgresql
- [postgresql] [bug]
向 PGHSTORE
类型添加了hashable=False
标志,这是为了允许 ORM 在请求混合列/实体列表中的 ORM 映射的 HSTORE 列时跳过尝试“哈希”它。补丁由 Gunnlaugur Þór Briem 提供。
参考:#3053 - [postgresql] [bug]
添加了一个新的“disconnect”消息“connection has been closed unexpectedly”。这似乎与较新版本的 SSL 有关。感谢 Antti Haapala 的拉取请求。
mysql
- [mysql] [bug]
MySQL 错误 2014“commands out of sync”似乎是在现代 MySQL-Python 版本中作为 ProgrammingError 而不是 OperationalError 引发的;现在在 OperationalError 和 ProgrammingError 中都检查了所有测试“is disconnect”的 MySQL 错误代码。
参考:#3101 - [mysql] [bug]
修复了在索引的mysql_length
参数上添加列名时需要具有相同引号引用才能被识别的错误。修复使引号变为可选,但也为那些使用此解决方法的人提供了旧的行为以实现向后兼容。
参考:#3085 - [mysql] [bug]
添加了对反映包含 KEY_BLOCK_SIZE 的索引的表的支持,使用等号。感谢 Sean McGivern 的拉取请求。
mssql
- [mssql] [bug]
将语句编码添加到“SET IDENTITY_INSERT”语句中,当在 IDENTITY 列中插入显式 INSERT 时,以支持在不支持 unicode 语句的驱动程序(如 pyodbc + unix + py2k)上使用非 ascii 表标识符。 - [mssql] [bug]
在 SQL Server pyodbc 方言中,修复了description_encoding
方言参数的实现,当未明确设置时,会导致在包含其他编码名称的结果集中无法正确解析 cursor.description。这个参数在未来不应该再需要。
参考:#3091
misc
- [bug] [declarative]
当访问__mapper_args__
字典时,从声明性 mixin 或抽象类中复制,以便声明性本身对此字典所做的修改不会与其他映射冲突。该字典在version_id_col
和polymorphic_on
参数方面进行修改,用本地类/表正式映射到的列替换其中的列。
参考:#3062 - [bug] [ext]
修复了可变扩展中的错误,即MutableDict
未报告setdefault()
字典操作的更改事件。
参考:#3051, #3093 - [bug] [ext]
修复了MutableDict.setdefault()
未返回现有值或新值的错误(此错误未在任何 0.8 版本中发布)。感谢 Thomas Hervé的拉取请求。
参考:#3051, #3093
0.8.6
发布日期:2014 年 3 月 28 日
通用
- [general] [bug]
调整了setup.py
文件,以支持将来可能从 setuptools 中删除setuptools.Feature
扩展。如果不存在此关键字,设置仍将成功使用 setuptools 而不是退回到 distutils。现在还可以通过设置 DISABLE_SQLALCHEMY_CEXT 环境变量来禁用 C 扩展构建。无论 setuptools 是否可用,此变量都有效。
参考:#2986
orm
- [orm] [bug]
修复了 ORM 中的错误,即更改对象的主键,然后将其标记为 DELETE 将无法针对 DELETE 定位到正确的行。
参考:#3006 - [orm] [bug]
修复了从 0.8.3 中的回归,导致Query.exists()
在只有一个Query.select_from()
条目但没有其他实体的查询上无法工作的问题。
参考:#2995 - [orm] [bug]
改进了一个错误消息,如果对非可选择的查询(例如literal_column()
)进行查询,然后尝试使用Query.join()
使“左”侧被确定为None
,然后失败。现在明确检测到这种情况。 - [orm] [bug]
从sqlalchemy.orm.interfaces.__all__
中删除了陈旧的名称,并使用当前名称进行刷新,以便再次从此模块进行import *
。
参考:#2975
sql
- [sql] [bug]
修复了在tuple_()
构造中的 bug,在这里,实质上第一个 SQL 表达式的“类型”会被应用为比较元组值的“比较类型”;在某些情况下,这会导致不适当的“类型转换”发生,例如当元组中混合了字符串和二进制值时,错误地将目标值转换为二进制,即使左侧的类型并非如此。tuple_()
现在期望其值列表中存在异构类型。
参考:#2977
postgresql
- [postgresql] [feature]
启用了对 psycopg2 DBAPI 的“合理的多行计数”检查,因为这似乎是在 psycopg2 2.0.9 中支持的。 - [postgresql] [bug]
修复了由于版本 0.8.5 / 0.9.3 的兼容性增强引起的回归,其中仅针对 8.1、8.2 系列的 PostgreSQL 版本的索引反射再次中断,涉及到一直问题多多的 int2vector 类型。尽管 int2vector 从 8.1 开始支持数组操作,但显然只能从 8.3 开始支持 CAST 到 varchar。
参考:#3000
misc
- [bug] [ext]
修复了可变扩展中的 bug 以及flag_modified()
中的 bug,在这里,如果属性已被重新分配给自身,则更改事件将不会传播。
参考:#2997
0.8.5
发布日期:2014 年 2 月 19 日
orm
- [orm] [bug]
修复了Query.get()
在查询已存在条件的查询时无法始终引发InvalidRequestError
的错误的 bug,当给定的标识已经存在于标识映射中时。
参考:#2951 - [orm] [bug]
修复了当将迭代器对象传递给class_mapper()
或类似函数时出现的错误消息,其中错误会在字符串格式化时无法呈现的 bug。来自 Kyle Stark 的 Pullreq。 - [orm] [bug]
对subqueryload()
策略进行了调整,确保查询在加载过程开始后运行;这样,subqueryload 优先于其他加载器运行,这可能是由于其他贪婪/无加载情况在错误的时间命中相同属性。
参考:#2887 - [orm] [bug]
修复了一个 bug,当从表继承到基表的选择/别名时使用联接表继承时,PK 列也不是同名时,持久性系统将无法在 INSERT 时将主键值从基表复制到继承表。
参考:#2885 - [orm] [bug]
当传递的列/属性(名称)不解析为列或映射属性(例如错误的元组)时,composite()
将引发一个信息性错误消息;先前引发了一个未绑定的本地错误。
参考:#2889
engine
- [engine] [bug] [pool]
修复了由#2880引起的关键回归问题,其中新的并发能力从池中返回连接意味着“first_connect”事件现在也不再同步,因此在即使是最小并发情况下也会导致方言配置错误。
参考:#2880,#2964
sql
- [sql] [bug]
修复了一个 bug,即使用空列表或元组调用Insert.values()
将引发 IndexError。现在会生成一个空的插入构造,就像使用空字典的情况一样。
参考:#2944 - [sql] [bug]
修复了一个 bug,即如果错误地传递了包含__getitem__()
方法的列表达式的比较器的列表达式,例如使用ARRAY
类型的列,ColumnOperators.in_()
将进入无限循环。
参考:#2957 - [sql] [bug]
修复了一个问题,即具有 Sequence 的主键列,但该列不是“自动增量”列,要么因为它有外键约束,要么设置了autoincrement=False
,在没有主键值的情况下尝试在不支持序列的后端上插入时,会尝试触发 Sequence。这将发生在像 SQLite、MySQL 这样的非序列后端上。
参考:#2896 - [sql] [bug]
修复了Insert.from_select()
方法的错误,其中给定名称的顺序在生成 INSERT 语句时不会被考虑,因此与给定 SELECT 语句中的列名不匹配。还指出Insert.from_select()
暗示不能使用 Python 端的插入默认值,因为该语句没有 VALUES 子句。
参考:#2895 - [sql] [enhancement]
当编译语句中存在一个未赋值的BindParameter
时引发的异常现在在错误消息中包含绑定参数的键名。
postgresql
- [postgresql] [bug]
添加了一个额外的消息到 psycopg2 断开检测,“无法发送数据到服务器”,这与现有的“无法从服务器接收数据”相辅相成,并已被用户观察到。
参考:#2936 - [postgresql] [bug]
对于非常古老的(8.1 版本之前)PostgreSQL 版本以及潜在的其他 PG 引擎(假设 Redshift 将版本报告为<8.1),已改进对 PostgreSQL 反射行为的支持,查询“索引”和“主键”依赖于检查所谓的“int2vector”数据类型,该数据类型在 8.1 之前拒绝强制转换为数组,导致查询中使用的“ANY()”运算符失败。通过广泛的搜索找到了非常 hacky 但被 PG 核心开发人员推荐的查询,用于在使用 PG 版本<8.1 时使用,因此现在在这些版本上可以正常工作索引和主键约束反射。
- [postgresql] [bug]
修订了这个非常古老的问题,其中 PostgreSQL 的“获取主键”反射查询已更新以考虑已重命名的主键约束;新查询在非常古老的 PostgreSQL 版本(如版本 7)上失败,因此在检测到 server_version_info < (8, 0)的情况下,在这些情况下恢复旧查询。
参考:#2291
mysql
- [mysql] [feature]
添加了新的 MySQL 特定的DATETIME
,其中包括分数秒支持;还向TIMESTAMP
添加了分数秒支持。尽管 DBAPI 支持有限,但 MySQL Connector/Python 已知支持分数秒。补丁由 Geert JM Vanderkelen 提供。
参考:#2941 - [mysql] [bug]
添加了对PARTITION BY
和PARTITIONS
MySQL 表关键字的支持,指定为mysql_partition_by='value'
和mysql_partitions='value'
给Table
. 感谢 Marcus McCurdy 提交的 Pullreq。
参考:#2966 - [mysql] [错误]
修复了阻止基于 MySQLdb 的方言(例如 pymysql)在 Py3K 中工作的错误,其中一个对“连接字符集”的检查会由于 Py3K 的更严格的值比较规则而失败。在这种情况下,调用并没有考虑到数据库版本,因为服务器版本在那时仍然是 None,因此该方法总体上已经简化为依赖于 connection.character_set_name()。
参考:#2933 - [mysql] [错误]
在 cymysql 方言中添加了一些缺失的方法,包括 _get_server_version_info() 和 _detect_charset()。感谢 Hajime Nakagami 提交的 Pullreq。
sqlite
- [sqlite] [错误]
恢复了在将唯一约束反射回到 0.8 时被遗漏的更改,其中包含 SQLite 的UniqueConstraint
,如果列名中包含保留关键字,则会失败。感谢 Roman Podolyaka 提交的 Pullreq。
mssql
- [mssql] [错误] [firebird]
使用Float
类型的 “asdecimal” 标志现在将与 Firebird 以及 mssql+pyodbc 方言一起工作;以前的十进制转换未发生。 - [mssql] [错误] [pymssql]
将 “Net-Lib error during Connection reset by peer” 消息添加到 pymssql 方言中检查的消息列表中,以检查“disconnect”。感谢 John Anderson。
杂项
- [错误] [py3k]
修复了 Py3K 中的错误,其中缺少的导入将导致在呈现绑定参数时“literal binary”模式无法导入“util.binary_type”。0.9 处理方式不同。感谢 Andreas Zeidler 提交的 Pullreq。 - [错误] [firebird]
firebird 方言将引用以下划线开头的标识符。感谢 Treeve Jelbert。
参考:#2897 - [错误] [firebird]
修复了 Firebird 索引反射中的错误,其中索引中的列没有正确排序;它们现在按照 RDB$FIELD_POSITION 的顺序排序。 - [错误] [declarative]
当将无法解析为类或映射器的字符串参数发送到relationship()
时,错误消息已校正为与接收到非字符串参数时相同的方式,该方式指示了具有配置错误的关系的名称。
参考:#2888
0.8.4
发布日期:2013 年 12 月 8 日
orm
- [orm] [错误]
修复了由 #2818 引入的回归,其中生成的 EXISTS 查询会为具有两个同名列的语句产生“columns being replaced”警告,因为内部的 SELECT 没有设置 use_labels。
参考文献:#2818
engine
- [engine] [bug]
在connect()
上引发错误的 DBAPI(如TypeError
、NotImplementedError
等)如果不是 dbapi.Error 的子类,则会以原样传播异常。先前,针对connect()
例程的特定错误处理既会不适当地通过方言的Dialect.is_disconnect()
例程运行异常,也会将其包装在一个sqlalchemy.exc.DBAPIError
中。现在它会像在执行过程中一样保持不变地传播。
参考文献:#2881 - [engine] [bug] [pool]
QueuePool
已经改进,不再在现有连接尝试阻塞时阻止新的连接尝试。先前,新连接的生成在监视溢出的块内串行化;现在,溢出计数器在连接过程本身之外的自己的临界区内进行修改。
参考文献:#2880 - [engine] [bug] [pool]
对等待池化连接可用性的逻辑进行了微小调整,对于未指定超时的连接池,它将每隔半秒中断一次等待,以检查所谓的“abort”标志,这允许等待者在整个连接池被转储的情况下中断;通常情况下,等待者应该由于 notify_all() 而中断,但在极少数情况下可能会错过这个 notify_all()。这是从 0.8.0 版本首次引入的逻辑的扩展,该问题只在压力测试中偶尔观察到。
参考文献:#2522 - [engine] [bug]
修复了一个 bug,当在Connection.execute()
内引发一个预先的 DBAPIStatementError
时,SQL 语句会被错误地 ASCII 编码,导致非 ASCII 语句的编码错误。现在字符串化仍然保持在 Python unicode 中,从而避免了编码错误。
参考文献:#2871
sql
- [sql] [feature]
添加了对“唯一约束”反射的支持,通过Inspector.get_unique_constraints()
方法。感谢 Roman Podolyaka 提供的补丁。
参考:#1443
postgresql
- [postgresql] [bug]
修复了一个 bug,当使用 pypostgresql 适配器时,索引反射会错误地解释 indkey 值,该适配器将这些值作为列表返回,而不是 psycopg2 返回的字符串类型。
参考:#2855
mssql
- [mssql] [bug]
修复了 0.8.0 中引入的 bug,在 MSSQL 中,如果索引在备用模式中,则DROP INDEX
语句会错误地渲染; schemaname/tablename 会被颠倒。格式也已经被修改以匹配当前的 MSSQL 文档。感谢 Derek Harland。
oracle
- [oracle] [bug]
将 ORA-02396 “最大空闲时间”错误代码添加到了 cx_oracle 的“断开连接”代码列表中。
参考:#2864 - [oracle] [bug]
修复了一个 bug,在 Oracle 中,给定没有长度的VARCHAR
类型(例如,用于CAST
或类似操作)会错误地渲染为None CHAR
或类似内容。
参考:#2870
杂项
- [bug] [ext]
修复了一个 bug,该 bug 阻止了serializer
扩展在包含非 ASCII 字符的表或列名中正常工作。
参考:#2869
0.8.3
发布日期:2013 年 10 月 26 日
orm
- [orm] [feature]
添加了新选项到relationship()
distinct_target_key
。这使得子查询的贪婪加载策略对内部的 SELECT 子查询应用 DISTINCT,在这种关系对应的内部查询生成重复行的情况下有所帮助(目前还没有一个通用的解决方案来解决子查询贪婪加载中的重复行问题,然而,当内部子查询之外的连接产生重复行时)。当标志设置为True
时,DISTINCT 无条件渲染,当设置为None
时,如果内部关系的目标列不构成完整的主键,则渲染 DISTINCT。该选项在 0.8 版本中默认为 False(例如,在所有情况下默认关闭),在 0.9 版本中为 None(例如,默认情况下自动化)。感谢 Alexander Koval 对此的帮助。
另见
Subquery Eager Loading will apply DISTINCT to the innermost SELECT for some queries
参考:#2836 - [orm] [bug]
修复了列表仪器化无法正确表示[0:0]
的切片的错误,特别是在使用关联代理时可能会发生。由于 Python 集合的某些怪癖,该问题在 Python 3 中更有可能发生,而不是在 Python 2 中。
此更改也被回溯到:0.7.11
参考:#2807 - [orm] [bug]
修复了在与父Table
关联之前使用类似remote()
或foreign()
的注释在关联之前,可能会导致父表由于注释执行的固有复制操作而未在联接中呈现的问题。
参考:#2813 - [orm] [bug]
修复了Query.exists()
在没有任何 WHERE 条件的情况下无法正常工作的错误。感谢 Vladimir Magamedov。
参考:#2818 - [orm] [bug]
从 0.9 版本中借鉴了一个变化,即在多态继承加载中使用的映射层次结构的迭代是有序的,这使得为多态查询生成的 SELECT 语句具有确定性呈现,进而有助于缓存方案,这些方案在 SQL 字符串本身上进行缓存。
参考:#2779 - [orm] [bug]
修复了 ORM 用于迭代映射层次结构的有序序列实现中的潜在问题;在 Jython 解释器下,该实现未被排序,尽管 cPython 和 PyPy 保持了排序。
参考:#2794 - [orm] [bug]
修复了 ORM 级事件注册中“原始”或“传播”标志在某些“未映射的基类”配置中可能被错误配置的潜在问题。
参考:#2786 - [orm] [bug]
关于使用defer()
选项加载映射实体时的性能修复。在加载时将每个对象的延迟调用函数应用到实例的函数开销显著高于仅从行加载数据的函数开销(请注意,defer()
旨在减少 DB/network 开销,而不一定是函数调用次数);现在在所有情况下,函数调用开销都小于从列加载数据的开销。每次从 N(结果中的总延迟值)加载时,还会减少创建的“懒惰可调用”对象的数量到 1(延迟列的总数)。
参考:#2778 - [ORM] [错误]
修复了属性历史函数在使用make_transient()
函数将对象从“持久”移动到“挂起”时会失败的 bug,特别是涉及基于集合的反向引用的操作。
参考:#2773
ORM 声明式
- [ORM] [声明式] [特性]
添加了一个方便的类装饰器as_declarative()
,它是declarative_base()
的包装器,允许使用一种巧妙的类装饰器方法应用现有的基类。
示例
- [示例] [特性]
改进了examples/generic_associations
中的示例,包括discriminator_on_association.py
使用单表继承来处理“鉴别器”。还添加了一个真正的“通用外键”示例,它类似于其他流行框架,使用开放的整数指向任何其他表,放弃了传统的引用完整性。虽然我们不推荐这种模式,但信息想要自由。 - [示例] [错误]
在版本控制示例中创建的历史表中添加了“autoincrement=False”,因为这个表在任何情况下都不应该具有自增属性,感谢 Patrick Schmid。
引擎
- [引擎] [特性]
Engine
的URL
的repr()
现在会使用星号隐藏密码。感谢 Gunnlaugur Þór Briem。
参考:#2821 - [引擎] [错误]
make_url()
函数现在使用的正则表达式解析 ipv6 地址,例如用方括号括起来。
此更改也回溯到:0.7.11
参考:#2851 - [引擎] [错误] [Oracle]
如果重新创建Engine
时,不会第二次调用 Dialect.initialize(),因为出现了断开连接错误。这修复了 Oracle 8 方言中的一个特定问题,但通常来说,Dialect.initialize()阶段应该只执行一次。
参考:#2776 - [引擎] [错误] [池]
修复了QueuePool
在现有池化连接在无效或重置事件后未能重新连接时会丢失正确的已检出计数的错误。
参考:#2772
SQL
- [SQL] [特性]
添加了insert()
构造的新方法Insert.from_select()
。给定列的列表和可选择项,呈现INSERT INTO (table) (columns) SELECT ..
。
参考:#722 - [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")
- [sql] [bug]
修复了自 0.7.9 以来的回归,其中如果 CTE 在多个 FROM 子句中被引用,则其名称可能无法正确引用。
此更改也回溯到:0.7.11
参考:#2801 - [sql] [bug] [cte]
修复了公共表达式系统中的错误,如果 CTE 仅用作alias()
构造,则不会使用 WITH 关键字呈现。
此更改也回溯到:0.7.11
参考:#2783 - [sql] [bug]
修复了CheckConstraint
DDL 中的错误,其中来自Column
对象的“quote”标志不会传播。
此更改也回溯到:0.7.11
参考:#2784 - [sql] [bug]
修复了type_coerce()
无法正确解释具有__clause_element__()
方法的 ORM 元素的错误。
参考:#2849 - [sql] [bug]
Enum
和Boolean
类型现在在生成“非本机”类型的 CHECK 约束时绕过任何自定义(例如 TypeDecorator)类型。这样,自定义类型不会参与 CHECK 中的表达式,因为此表达式针对“impl”值而不是“decorated”值。
参考:#2842 - [sql] [bug]
Index
上的.unique
标志可能会在从未指定unique
(默认为None
)的Column
生成时产生None
。该标志现在将始终为True
或False
。
参考:#2825 - [sql] [bug]
修复了默认编译器以及 postgresql、mysql 和 mssql 的 bug,以确保任何字面 SQL 表达式值在 CREATE INDEX 语句中直接呈现为字面值,而不是作为绑定参数。这也改变了其他 DDL 的呈现方案,如约束。
参考:#2742 - [sql] [bug]
在其 FROM 子句中使自身引用的select()
,通常通过就地突变,将引发信息性错误消息,而不会导致递归溢出。
参考:#2815 - [sql] [bug]
ForeignKey
上的非工作“schema”参数已被弃用;引发警告。在 0.9 中移除。
参考:#2831 - [sql] [bug]
修复了使用column_reflect
事件更改传入Column
的.key
会阻止主键约束、索引和外键约束被正确反映的 bug。
参考:#2811 - [sql] [bug]
在 0.8 中添加的ColumnOperators.notin_()
运算符现在正确地生成了对空集合使用时“IN”返回的表达式的否定。 - [sql] [bug] [postgresql]
修复了表达式系统依赖于在select()
构造上引用.c
集合时一些表达式的str()
形式,但由于元素依赖于特定于方言的编译构造,特别是与 PostgreSQLARRAY
元素一起使用的__getitem__()
运算符,因此str()
形式不可用。该修复还添加了一个新的异常类UnsupportedCompilationError
,在编译器被要求编译它不知道如何处理的内容时引发。
参考:#2780
postgresql
- [postgresql] [bug]
从列的服务器默认值反射中删除了 128 个字符的截断;这段代码最初来自 PG 系统视图,用于截断字符串以便阅读。
参考:#2844 - [postgresql] [bug]
括号将应用于在 CREATE INDEX 语句的列列表中呈现的复合 SQL 表达式。
参考:#2742 - [postgresql] [bug]
修复了一个 bug,即具有在“PostgreSQL”或“EnterpriseDB”之前的前缀的 PostgreSQL 版本字符串将无法解析。感谢 Scott Schaefer。
参考:#2819
mysql
- [mysql] [bug]
MySQL 版本 5.5、5.6 的保留字更新,感谢 Hanno Schlichting。
此更改也回溯到: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。
参考:#2721���#2839 - [mysql] [bug]
MySQL-connector 方言现在允许在 create_engine 查询字符串中覆盖在连接中设置的默认值,包括“buffered”和“raise_on_warnings”。
参考:#2515
sqlite
- [sqlite] [bug]
新增的 SQLite DATETIME 参数 storage_format 和 regexp 显然没有完全正确实现;虽然参数被接受,但实际上它们没有任何效果;这个问题已经修复。
参考:#2781
oracle
- [oracle] [bug]
修复了一个 bug,即使用同义词进行 Oracle 表反射时,如果同义词和表位于不同的远程模式中,则会失败。修复补丁由 Kyle Derr 提供。
参考:#2853
杂项
- [feature]
为Column
添加了一个新标志system=True
,将列标记为“系统”列,这些列将由数据库自动添加(例如 PostgreSQL 的oid
或xmin
)。该列将在CREATE TABLE
语句中被省略,但仍可用于查询。此外,CreateColumn
构造可以应用于自定义编译规则,允许跳过列,通过生成返回None
的规则。
0.8.2
发布日期:2013 年 7 月 3 日
orm
- [orm] [feature]
添加了一个新方法Query.select_entity_from()
,将在 0.9 版本中取代Query.select_from()
的部分功能。在 0.8 版本中,这两个方法执行相同的功能,因此可以适当地将代码迁移到使用Query.select_entity_from()
方法。详细信息请参阅 0.9 迁移指南。
参考:#2736 - [orm] [bug]
当尝试刷新已分配多态鉴别器为无效值的继承类对象时,会发出警告。
参考:#2750 - [orm] [bug]
修复了多个加入继承实体针对相同基类相互连接时,在连接字符串超过两个实体时,基表上的列不会独立跟踪的多态 SQL 生成中的错误。
参考:#2759 - [orm] [bug]
修复了将复合属性发送到Query.order_by()
会产生一些数据库不接受的括号表达式的错误。
参考:#2754 - [orm] [bug]
修复了复合属性与aliased()
函数之间的交互。以前,在应用别名时,复合属性在比较操作中无法正常工作。
参考:#2755 - [orm] [bug] [ext]
修复了MutableDict
在调用clear()
时未报告更改事件的错误。
参考:#2730 - [orm] [bug]
修复了由 #2682 引起的回归问题,即Query.update()
和Query.delete()
调用的评估会触发不支持的True
和False
符号,因为现在使用了IS
。
参考:#2737 - [orm] [bug]
由此票据引起的 0.7 版本的回归问题已修复,这使得自引用的贪婪连接的递归溢出检查变得太宽松,忽略了一个特定情况,即子类配置了 lazy=”joined” 或 “subquery”,并且加载是针对基类的“with_polymorphic”。
参考:#2481 - [orm] [bug]
修复了从 0.7 版本中引入的回归问题,Session.begin_nested()
的 contextmanager 功能在发生 flush 错误时未能正确回滚事务,而是引发了自己的异常,同时保留了仍处于待回滚状态的会话。
参考:#2718
orm declarative
- [orm] [declarative] [feature]
现在可以在order_by
、primaryjoin
或类似情况下使用字符串参数引用 ORM 描述符,例如混合属性,以及与列绑定的属性一样在relationship()
中使用。
参考:#2761
examples
- [examples] [bug]
修复了“版本控制”配方中的问题,其中当存在反向引用时,一个多对一引用可能会为目标生成一个无意义的版本,即使它没有被更改。由 Matt Chisholm 提供的补丁。 - [examples] [bug]
修复了狗堆示例中的一个小错误,即 SQL 缓存键的生成未像Query
通常所做的那样对语句应用去重标签。
engine
- [engine] [bug]
修复了各种Pool
实现中reset_on_return
参数未在重新生成池时传播的错误。由 Eevee 提供。 - [engine] [bug] [sybase]
修复了在某些情况下无法检测到正确的 kwargs 被发送到create_engine()
的例程失败的错误,例如在 Sybase 方言中。
参考:#2732
sql
- [sql] [feature]
为TypeDecorator
提供了一个名为TypeDecorator.coerce_to_is_types
的新属性,以便更容易控制使用==
或!=
与None
和布尔类型进行比较时如何生成IS
表达式,或者带有绑定参数的普通相等表达式。
参考:#2734,#2744 - [sql] [bug]多个修复针对
Select
构造的相关行为,首次引入于 0.8.0 版本:
- 为满足 FROM 条目应向外部 SELECT 进行相关的用例,该 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 子句进入相关性,正如预期的那样。
- 参考:#2668,#2746
- [sql] [bug]
修复了一个错误,即将表“A”的 select()与多个外键路径连接到表“B”,连接到表“B”时,如果直接将表“A”连接到“B”会报告“模糊连接条件”错误,而不是生成具有多个条件的连接条件。
参考:#2738 - [sql] [bug] [reflection]
修复了在远程模式和本地模式下同时使用MetaData.reflect()
可能会在两个模式都有相同名称的表时产生错误结果的错误。
参考:#2728 - [sql] [bug]
从基础ColumnOperators
类中删除了“未实现”的__iter__()
调用,虽然这是在 0.8.0 中引入的,以防止在自定义运算符上实现__getitem__()
方法并在该对象上错误调用list()
时出现无限、内存增长的循环,但它导致列元素报告它们实际上是可迭代类型,然后在尝试迭代时抛出错误。在这里没有真正的方法同时拥有两边,所以我们坚持使用 Python 最佳实践。在自定义运算符上实现__getitem__()
时要小心!
参考:#2726 - [sql] [bug] [mssql]
从这个票据中导致的回归导致不支持的关键字“true”被呈现,添加逻辑将其转换为 SQL 服务器的 1/0。
参考:#2682
postgresql
- [postgresql] [feature]
添加了对 PostgreSQL 9.2 范围类型的支持。目前,不提供类型转换,因此目前直接使用字符串或 psycopg2 2.5 范围扩展类型。补丁由 Chris Withers 提供。 - [postgresql] [feature]
在使用 psycopg2 DBAPI 时,添加了对“AUTOCOMMIT”隔离的支持。该关键字可通过isolation_level
执行选项使用。补丁由 Roman Podolyaka 提供。
参考:#2072 - [postgresql] [bug]
在 PostgreSQL 方言上,extract()
的行为已经简化,不再向给定表达式注入硬编码的::timestamp
或类似转换,因为这会干扰诸如时区感知日期时间之类的类型,但在现代版本的 psycopg2 中似乎也不是必要的。
参考:#2740 - [postgresql] [bug]
修复了 HSTORE 类型中包含反斜杠引号的键/值在使用“非本地”(即非-psycopg2)方式转换 HSTORE 数据时无法正确转义的错误。补丁由 Ryan Kelly 提供。
参考:#2766 - [postgresql] [bug]
修复了多列 PostgreSQL 索引中列的顺序会反映错误顺序的错误。由 Roman Podolyaka 提供。
参考:#2767 - [postgresql] [bug]
修复了 HSTORE 类型以正确对 unicode 进行编码/解码。这始终是开启的,因为 hstore 是一种文本类型,并且与使用 Python 3 时 psycopg2 的行为相匹配。感谢 Dmitry Mugtasimov。
参考:#2735
mysql
- [mysql] [feature]
可以将用于Index
的mysql_length
参数作为列名/长度的字典传递,用于复合索引。非常感谢 Roman Podolyaka 提供的补丁。
参考:#2704 - [mysql] [bug]
修复了使用多表 UPDATE 时的错误,其中一个辅助表是带有自己绑定参数的 SELECT,当使用 MySQL 的特殊语法时,绑定参数的位置与语句本身相反。
参考:#2768 - [mysql] [bug]
在mysql+gaerdbms
方言中添加了另一个条件,以检测所谓的“开发”模式,在这种模式下,我们应该使用rdbms_mysqldb
DBAPI。感谢 Brett Slatkin 提供补丁。
参考:#2715 - [mysql] [bug]
在ForeignKey
和ForeignKeyConstraint
上的deferrable
关键字参数将不会在 MySQL 方言上呈现DEFERRABLE
关键字。长期以来,我们一直保留了这个设置,因为不可推迟的外键会与可推迟的外键表现得截然不同,但是某些环境只是在 MySQL 上禁用了 FKs,所以我们在这里将不那么坚持己见。
参考:#2721 - [mysql] [bug]
更新了 mysqlconnector 方言,以根据异常中发送的明显字符串消息来检查断开连接;针对 mysqlconnector 1.0.9 进行了测试。
sqlite
- [sqlite] [bug]
将sqlalchemy.types.BIGINT
添加到可以由 SQLite 方言反射的类型名称列表中;感谢 Russell Stuart。
参考:#2764
mssql
- [mssql] [bug]
在查询 SQL Server 2000 上的信息模式时,删除了在 0.8.1 版中添加的 CAST 调用,以帮助解决驱动程序问题,显然这不兼容于 2000。对于 SQL Server 2005 及更高版本,保留了 CAST。
参考:#2747
杂项
- [feature] [firebird]
将新标志retaining=True
添加到 kinterbasdb 和 fdb 方言中。这控制了发送到 DBAPI 连接的commit()
和rollback()
方法的retaining
标志的值。由于历史问题,这个标志在 0.8.2 中默认为True
,但是在 0.9.0b1 中,这个标志默认为False
。
参考:#2763 - [bug] [firebird]
修复了在反射 Firebird 类型 LONG 和 INT64 时的类型查找,现在 LONG 被视为 INTEGER,INT64 被视为 BIGINT,除非类型具有“精度”,否则将被视为 NUMERIC。补丁由 Russell Stuart 提供。
参考:#2757 - [bug] [ext]
修复了一个 bug,即如果使用函数而不是类来设置复合类型,则当可变扩展尝试检查该列是否为MutableComposite
时,可变扩展会出错(实际上不是)。感谢 asldevi。 - [requirements]
现在运行单元测试套件需要 Python 的mock库。虽然作为 Python 3.3 的一部分已经包含在标准库中,但之前的 Python 安装需要安装此库才能运行单元测试或使用sqlalchemy.testing
包来支持外部方言。
0.8.1
发布日期:2013 年 4 月 27 日
orm
- [orm] [feature]
在 Query 中添加了一个方便的方法,将查询转换为EXISTS (SELECT 1 FROM ... WHERE ...)
的子查询形式。
参考:#2673 - [orm] [bug]
修复了一个查询的 bug 形式:query(SubClass).options(subqueryload(Baseclass.attrname))
,其中SubClass
是BaseClass
的一个连接继承,将无法在属性加载时应用JOIN
,从而产生笛卡尔积。填充的结果仍然往往是正确的,因为额外的行只是被忽略,所以这个问题可能会作为性能下降存在于其他方面正常工作的应用程序中。
此更改也已回溯至:0.7.11
参考:#2699 - [orm] [bug]
修复了一个工作单元中的 bug,即如果两个表之间没有设置外键约束,那么一个继承子类可能会在父表之前插入“子”表的行。
此更改也已回溯至:0.7.11
参考:#2689 - [orm] [bug]
修复了sqlalchemy.ext.serializer
扩展的问题,包括从 pickler 传递的“id”被转换为字符串以防止在 Py3K 上解析字节,以及relationship()
和orm.join()
构造现在正确序列化。
参考:#2698 - [orm] [bug]
对 query.join()的内部工作机制进行了重大改进,简化了如何进行连接的决策过程。现在新的测试用例通过了,例如从已经涉及继承的复杂连接系列的中间进行多个连接。从深度嵌套的子查询结构进行连接仍然很复杂,不是没有注意事项,但通过这些改进,边缘情况希望被推到更远的边缘。
参考:#2714 - [orm] [bug]
为 ORM 映射对象的反序列化过程添加了条件,以便在对象被序列化时丢失对对象的引用时,我们不会错误地尝试设置 _sa_instance_state - 修复了 NoneType 错误。 - [orm] [bug]
修复了一个 bug,即当 uselist=False 的多对多关系尝试删除关联行并且标量属性设置为 None 时,会引发错误。这是由于#2229的更改引入的回归。
参考:#2710 - [orm] [bug]
改进了实例管理在 Session 中创建强引用时的行为;如果对象处于瞬时状态或进入分离状态,将不再创建内部引用循环 - 只有当对象附加到 Session 时才会创建强引用,并在对象分离时删除。即使不建议这样做,这使得对象具有 del()方法更加安全,因为具有反向引用的关系也会产生循环。当映射具有 del()方法的类时,会添加警告。
参考:#2708 - [orm] [bug]
修复了一个 bug,即当刷新一个继承映射类时,ORM 会运行错误类型的查询,其中超类映射到非 Table 对象,如自定义 join()或 select(),运行一个假设映射到单独 Table-per-class 层次结构的查询。
参考:#2697 - [orm] [bug]
修复了在对象初始化之前,mapper 属性构造中的 repr()方法无法正常工作的问题,因此最近的 Sphinx 版本可以读取它们。
orm 声明式
- [orm] [declarative] [bug]
修复了关于has_inherited_table()
的间接回归问题,因为它考虑了当前类的__table__
,所以在调用时敏感。这也是 0.7 的行为,但在 0.7 中,事情往往会在__mapper_args__()
等事件中“解决”。has_inherited_table()
现在只考虑超类,因此无论何时调用它,都应该返回关于当前类的相同答案(显然假设超类的状态)。
参考:#2656
例子
- [examples] [bug]
修复了缓存示例中长期存在的一个 bug,即在计算缓存键时,limit/offset 参数值不会被考虑。 _key_from_query() 函数已经简化,直接从最终编译的语句中工作,以便获取完整的语句以及完全处理过的参数列表。
sql
- [sql] [feature]
放宽了传递给 Table()的特定于方言的参数名称的检查;由于我们希望支持外部方言,并且希望支持未安装某个特定方言的参数,因此现在只检查参数的格式,而不再在 sqlalchemy.dialects 中查找该方言。 - [sql] [bug] [mysql]
完全实现了 IS 和 IS NOT 运算符与 True/False 常量相关。例如,col.is_(True)
表达式现在将在目标平台上呈现col IS true
,而不是将 True/False 常量转换为整数绑定参数。这使得is_()
运算符在给定 True/False 常量时可以在 MySQL 上工作。
参考:#2682 - [sql] [bug]
对于使用 apply_labels()时 select()对象生成带标签列的方式进行了重大修复;这种模式生成一个 SELECT,其中每列都标记为_,以消除多表选择的列名冲突。修复的地方是,如果两个标签与表名组合时发生冲突,即“foo.bar_id”和“foo_bar.id”,则将对其中一个重复项应用匿名别名。这允许 ORM 独立处理两个列;以前,0.7 在某些情况下会静默地为“重复项”发出第二个 SELECT,并且在 0.8 中会发出模棱两可的列错误。应用于 select()的.c.集合的“键”也将被去重,因此对于指定了 use_labels 的任何 select(),将不再为“被替换的列”警告发出,尽管重复键将被赋予一个通常不友好的匿名标签。
参考:#2702 - [sql] [bug]
修复了一个 bug,即在连接对象已经关闭后,如果错误在断开连接时检测到,则会引发属性错误。
参考资料:#2691 - [sql] [bug]
重新设计了在重新引发之前发出 rollback()的内部异常引发,以便在进入 rollback 之前保留 sys.exc_info()的堆栈跟踪。这样,在使用可能在回滚函数返回之前切换上下文的协程框架时,堆栈跟踪将得以保留。
参考资料:#2703 - [sql] [bug] [postgresql]
现在,当在 Python 3 上运行时,_Binary 基本类型通过可调用的 bytes()将值转换为字节;特别是,带有 Python 3.3 的 psycopg2 2.5 现在似乎返回“memoryview”类型,因此在返回之前将其转换为字节。 - [sql] [bug]
对 Connection 自动失效处理进行了改进。如果发生非断开连接错误,但在错误处理中导致延迟断开连接错误(在 MySQL 中发生),则会检测到断开连接条件。现在,即使处于无效状态,Connection 也可以关闭,这意味着在下次使用时它将引发“closed”,此外,“close with result”功能也将在错误处理例程中的 autorollback 失败时以及无论条件是否为断开连接都会起作用。
参考资料:#2695 - [sql] [bug]
修复了一个 bug,即 DBAPI 可能会对 cursor.lastrowid 返回“0”,并且在与ResultProxy.inserted_primary_key
结合使用时将无法正常工作。
postgresql
- [postgresql] [bug]
将对 psycopg2/libpq 的“断开连接”检查扩展为在完整异常层次结构中检查所有各种“断开连接”消息。具体来说,“意外关闭连接”的消息现在已经至少在三种不同的异常类型中看到。由 Eli Collins 提供。
参考资料:#2712 - [postgresql] [bug]
PostgreSQL ARRAY 类型的运算符支持输入类型为集合、生成器等,即使未指定维度,也会将给定的可迭代对象无条件转换为集合。
参考资料:#2681 - [postgresql] [bug]
将 HSTORE 类型添加到 postgresql 类型名称中,以便可以反射该类型。
参考资料:#2680
mysql
- [mysql] [bug]
修复了支持最新的 cymysql DBAPI 所需的问题,由 Hajime Nakagami 提供。 - [mysql] [bug]
对 Python 3 上 pymysql 方言的操作进行了改进,包括一些重要的解码/字节步骤。由于驱动程序问题,BLOB 类型仍然存在问题。由 Ben Trofatter 提供。
参考资料:#2663 - [mysql] [bug]
更新了一个正则表达式,以正确提取 google app engine v1.7.5 及更新版本的错误代码。由 Dan Ring 提供。
mssql
- [mssql] [bug]
作为为 pyodbc+ mssql 所需的一系列修复的一部分,已向所有信息模式查询的绑定参数的表名和模式名添加了 CAST 到 NVARCHAR(max),以避免将 NVARCHAR 与 NTEXT 进行比较的问题,在某些情况下,例如 FreeTDS(仅限 0.91?)加上传递的 unicode 绑定参数。该问题似乎特定于 SQL Server 信息模式表,并且解决方法对于那些问题本来就不存在的情况是无害的。
参考:#2355 - [mssql] [bug]
为 pymssql 方言添加了对额外“disconnect”消息的支持。感谢 John Anderson。 - [mssql] [bug]
修复了关于“binary”类型和 pymssql 的 Py3K bug。感谢 Marc Abramowitz。
参考:#2683
0.8.0
发布日期:2013 年 3 月 9 日
注意
0.8.0 中存在一些新的行为变化,而在 0.8.0b2 中不存在。它们在迁移文档中如下所示:
- 将“pending”对象视为“孤立”对象的考虑更加激进
- create_all()和 drop_all()现在将尊重空列表
- 相关性现在始终是特定于上下文的
orm
- [orm] [feature]
添加了有意义的QueryableAttribute.info
属性,它代理到直接存在的Column
对象的.info
属性,否则代理到MapperProperty
。完整的行为已记录并通过测试确保保持稳定。
参考:#2675 - [orm] [feature]
在relationship()
构造已经构建后,可以设置/更改“cascade”属性。这不是正常使用的模式,但我们喜欢在教程中更改设置以进行演示。 - [orm] [feature]
添加了新的辅助函数was_deleted()
,如果给定对象是Session.delete()
操作的主题,则返回 True。
参考:#2658 - [orm] [feature]
扩展了运行时检查 API 系统,以便检索与 ORM 或其扩展相关的所有 Python 描述符。 这满足了能够检查所有QueryableAttribute
描述符的常见请求,以及扩展类型,例如hybrid_property
和AssociationProxy
。 请参阅Mapper.all_orm_descriptors
。 - [orm] [bug]
在映射器配置期间改进了对现有反向引用名称冲突的检查;现在将在超类和子类上测试名称冲突,除了当前映射器之外,因为这些冲突会造成同样的问题。 这对于 0.8 是新的,但请参阅下面对于将在 0.7.11 中触发的警告。
参考:#2674 - [orm] [bug]
当检测到“反向引用循环”时,会发出清晰的错误消息,即当属性事件触发两个其他属性之间的双向赋值时。 当一个对象的类型错误地被赋值时,此条件可能会发生,但是当属性被错误地配置为反向引用到现有的反向引用对时,也会发生。 也出现在 0.7.11 中。
参考:#2674 - [orm] [bug]
如果将 MapperProperty 分配给替换现有属性的映射器,则会发出警告,如果问题属性不是基于纯列的属性。 替换关系属性很少(或者说从来没有?)是预期的,通常是指映射器配置错误。 也出现在 0.7.11 中。
参考:#2674 - [orm] [bug]
如果事件处理程序在 after_commit() 处理程序中尝试在会话中发出 SQL,而在此期间没有可行的事务,则会发出清晰的错误消息。
参考:#2662 - [orm] [bug]
在级联自然主键更新过程中检测到主键更改将会成功,即使该键是复合键,且仅有部分属性发生了变化。
参考:#2665 - [orm] [bug]
从会话中删除的对象在事务提交后将完全取消与该会话的关联,即object_session()
函数将返回 None。
参考:#2658 - [orm] [bug]
修复了一个 bug,Query.yield_per()
会错误地设置执行选项,从而破坏了后续使用Query.execution_options()
方法的情况。感谢 Ryan Kelly。
参考:#2661 - [orm] [bug]
修复了对between()
操作符的考虑,以便它正确地与新的关系本地/远程系统配合使用。
参考:#1768 - [orm] [bug]
将待处理对象视为“孤立对象”的考虑已经修改,以更接近持久对象的行为,即一旦对象与其任何启用了孤立模式的父对象解除关联,该对象就会从Session
中清除。之前,只有在对象从所有启用了孤立模式的父对象中解除关联时,待处理对象才会被清除。新标志legacy_is_orphan
被添加到Mapper
中,以恢复传统行为。
详细讨论此更改的变更说明和示例案例,请参阅将“待处理”对象视为“孤立”对象的考虑变得更为激进。
参考:#2655 - [orm] [bug]
修复了(很可能从未被使用过的)“@collection.link”集合方法,该方法在每次将集合与映射对象关联或取消关联时触发 - 该装饰器未经测试或功能上不正常。装饰器方法现在命名为collection.linker()
,尽管名称“link”仍然保留了向后兼容性。感谢 Luca Wehrstedt。
参考:#2653 - [orm] [bug]
对生成自定义受监控集合系统进行了一些修复,主要是现在使用@collection 装饰器将遵循给定类的 mro,应用特定集合方法的子类的版本的逻辑。以前,在对现有受监控类进行子类化时,例如MappedCollection
,无法预测自定义方法是否会正确解析。
参考:#2654 - [orm] [bug]
修复了可能发生的内存泄漏问题,如果创建了任意数量的sessionmaker
对象。当 sessionmaker 创建的匿名子类被取消引用时,由于事件包中仍然存在类级别的引用,该子类将无法被垃圾回收。此问题也适用于任何与事件调度程序一起使用临时子类的自定义系统。也适用于 0.7.10 版本。
参考:#2650 - [orm] [错误]
Query.merge_result()
现在可以从外连接加载行,其中实体可能为None
而不会引发错误。也��用于 0.7.10 版本。
参考:#2640 - [orm] [错误]
修复了relationship()
上“动态”加载器的问题,包括在自动刷新被禁用时,反向引用将正常工作,历史事件在同一对象多次添加/移除的情况下更加准确。
参考:#2637 - [orm] [已移除]
已删除了使用与集合相关联的__instrumentation__
数据结构生成自定义集合的未记录(希望未被使用)系统,因为这是一个复杂且未经测试的功能,与装饰器方法基本重复。还对 orm.collections 模块进行了其他内部简化。
示例
- [示例] [错误]
修复了示例/dogpile_caching 示例中的回归,这是由于#2614的更改引起的。
sql
- [sql] [功能]
为Enum
及其基本SchemaType
添加了一个新参数inherit_schema
。当设置为True
时,该类型将设置其schema
属性为其关联的Table
的schema
。在进行Table.tometadata()
操作时也会发生这种情况;当Table.tometadata()
发生时,无论何种情况下都会复制SchemaType
,如果inherit_schema=True
,则该类型将采用传递给该方法的新模式名称。在与 PostgreSQL 后端一起使用时,schema
非常重要,因为该类型会导致CREATE TYPE
语句。
参考:#2657 - [sql] [功能]
Index
现在支持任意的 SQL 表达式和/或函数,除了直接列。常见的修饰符包括使用somecolumn.desc()
来创建降序索引和func.lower(somecolumn)
来创建不区分大小写的索引,具体取决于目标后端的功能。
参考:#695 - [sql] [bug]
改进了 SELECT 关联的行为,使得Select.correlate()
和Select.correlate_except()
方法,以及它们的 ORM 类似方法,在 FROM 子句仅在输出为合法 SQL 时才被修改;也就是说,如果关联的 SELECT 未在 WHERE、columns 或 HAVING 子句的上下文中使用,则 FROM 子句保持不变。这两种方法现在只指定默认的“自动关联”条件,而不是绝对的 FROM 列表。
参考:#2668 - [sql] [bug]
修复了关于列注释的一个 bug,特别是可能影响到新的remote()
和local()
注释函数的一些用法,当列在后续表达式中使用时,注释可能会丢失。
参考:#1768, #2660 - [sql] [bug]
ColumnOperators.in_()
操作符现在将None
的值强制转换为null()
。
参考:#2496 - [sql] [bug]
修复了一个 bug,当Table.tometadata()
中的Column
既有外键又有列的替代“.key”名称时会失败。也适用于 0.7.10 版本。
参考:#2643 - [sql] [bug]
如果在不支持 RETURNING 的方言上尝试编译 insert().returning(),将引发一个信息性的 CompileError。
参考:#2629 - [sql] [bug]
调整了编译器用于识别需要传递的 INSERT/UPDATE 绑定参数的“REQUIRED”符号,使得在编写自定义绑定处理代码时更���易识别。
参考:#2648
模式
- [schema] [bug]
MetaData.create_all()
和MetaData.drop_all()
现在将接受一个空列表作为指示,不创建/删除任何项,而不是忽略该集合。
参考:#2664
postgresql
- [postgresql] [feature]
添加了对 PostgreSQL 传统 SUBSTRING 函数语法的支持,当使用常规func.substring()
时,呈现为“SUBSTRING(x FROM y FOR z)”。感谢 Gunnlaugur Þór Briem。
此更改也回溯到:0.7.11
参考:#2676 - [postgresql] [feature]
添加了Comparator.any()
和Comparator.all()
方法,以及独立的表达式构造。非常感谢 Audrius Kažukauskas 在这里的出色工作。 - [postgresql] [bug]
修复了array()
构造中的错误,其中在insert()
构造中使用它会产生关于self_group()
方法中参数问题的错误。
mysql
- [mysql] [feature]
添加了 CyMySQL 的新方言,感谢 Hajime Nakagami。 - [mysql] [feature]
GAE 方言现在接受 URL 中的用户名/密码参数,感谢 Owen Nelson。 - [mysql] [bug] [gae]
在gaerdbms
方言中添加了一个条件导入,尝试导入 rdbms_apiproxy vs. rdbms_googleapi 以在开发和生产平台上工作。现在也支持instance
属性。感谢 Sean Lynch。也在 0.7.10 中。
参考:#2649 - [mysql] [bug]
如果无法从异常抛出中提取错误代码,GAE 方言不会在无匹配时失败;感谢 Owen Nelson。
mssql
- [mssql] [feature]
添加了mssql_include
和mssql_clustered
选项到Index
,分别呈现INCLUDE
和CLUSTERED
关键字。感谢 Derek Harland。 - [mssql] [feature]
现在支持对非主键列的 IDENTITY 列的 DDL,通过在任何整数列上建立一个Sequence
构造。感谢 Derek Harland。
参考:#2644 - [mssql] [bug]
在 mssql 信息模式中添加了一个 py3K 条件,围绕不必要的.decode()调用,修复了 Py3K 中的反射问题。也在 0.7.10 中。
参考:#2638 - [mssql] [bug]
修复了字符类型 CHAR、NCHAR 等的“collation”参数停止工作的回归,因为“collation”现在由基本字符串类型支持。MSSQL 方言中的 TEXT、NCHAR、CHAR、VARCHAR 类型现在是基本类型的同义词。
oracle
- [oracle] [bug]
cx_oracle 方言将不再通过encode()
运行绑定参数名称,因为这在 Python 3 上无效,并且阻止了 Python 3 上语句的正确运行。现在只有在supports_unicode_binds
为 False 时才进行编码,而当至少使用版本 5 的 cx_oracle 时,这并不适用于 cx_oracle。
tests
- [tests] [bug]
修复了在一些 Linux 平台上无法正常工作的 test_execute 中的“logging”导入。也在 0.7.11 中。
参考:#2669
0.8.0b2
发布日期:2012 年 12 月 14 日
orm
- [orm] [feature]
添加了KeyedTuple._asdict()
和KeyedTuple._fields
到KeyedTuple
类,以提供与 Python 标准库collections.namedtuple()
一定程度的兼容性。
参考:#2601 - [orm] [feature]
允许在定义关系的主要和次要连接时使用同义词。 - [orm] [bug]
Query.select_from()
方法现在可以与aliased()
构造一起使用,而不会干扰被选择的实体。基本上,像这样的语句:
ua = aliased(User) session.query(User.name).select_from(ua).join(User, User.name > ua.name)
- 将保持 SELECT 的列子句来自未别名化的“user”,如指定的;select_from 只发生在 FROM 子句中:
SELECT users.name AS users_name FROM users AS users_1 JOIN users ON users.name < users_1.name
- 请注意,这种行为与原始、较旧的
Query.select_from()
的用例形成对比,即在不同的可选择性方面重新陈述映射实体:
session.query(User.name).select_from(user_table.select().where(user_table.c.id > 5))
- 产生:
SELECT anon_1.name AS anon_1_name FROM (SELECT users.id AS id, users.name AS name FROM users WHERE users.id > :id_1) AS anon_1
- 后一种用例的“别名”行为妨碍了前一种用例。该方法现在明确地将类似
select()
或alias()
的 SQL 表达式与类似aliased()
构造的映射实体分开考虑。
参考:#2635 - [orm] [bug]
MutableComposite
类型不允许使用MutableBase.coerce()
方法,尽管代码似乎表明了这一意图,所以现在可以使用,并添加了一个简短的示例。作为副作用,此事件处理程序的机制已更改,以便新的MutableComposite
类型不再添加每种类型的全局事件处理程序。也适用于 0.7.10。
参考:#2624 - [orm] [错误]
第二次对别名/内部路径机制进行改进,现在允许两个子类具有相同名称的不同关系,在同时使用子查询或连接式贪婪加载时支持全多态加载。
参考:#2614 - [orm] [错误]
修复了一个 bug,即在特定的 with_polymorphic 加载中进行多跳子查询加载会产生 KeyError 的问题。利用了与#2614相同的内部路径改进。
参考:#2617 - [orm] [错误]
修复了查询.update()在“fetch”同步策略匹配的对象不在本地时会产生错误的回归。感谢 Scott Torborg。
参考:#2602
orm 扩展
- [orm] [扩展] [功能]
sqlalchemy.ext.mutable
扩展现在包括示例MutableDict
类作为扩展的一部分。
engine
- [engine] [功能]
Connection.connect()
和Connection.contextual_connect()
方法现在返回一个“branched”版本,以便在返回的连接上调用Connection.close()
方法而不影响原始连接。在使用Engine
和Connection
对象作为上下文管理器时提供对称性:
with conn.connect() as c: # leaves the Connection open c.execute("...") with engine.connect() as c: # closes the Connection c.execute("...")
- [engine] [错误]
修复了MetaData.reflect()
方法,正确使用给定的Connection
,如果有的话,而不是从该连接的Engine
中打开第二个连接。
此更改也已回溯至:0.7.10
参考:#2604 - [引擎]
MetaData
的“reflect=True”参数已被弃用。请使用MetaData.reflect()
方法。
sql
- [sql] [feature]
Insert
构造现在支持多值插入,即类似于“INSERT INTO table VALUES (…), (…), …” 的插入方式。支持 PostgreSQL、SQLite 和 MySQL。特别感谢 Idan Kamara 在这方面的工作。
另请参阅
Insert 的多值支持
参考:#2623 - [sql] [bug]
修复了在使用 server_onupdate= 但没有传递“for_update=True”标志时,会将默认对象应用于 server_default,覆盖原有内容的 bug。这种用法不应该需要显式的 for_update=True 参数(特别是因为文档中显示了一个没有使用该参数的示例),因此现在在内部使用给定默认对象的副本,如果标志未设置为对应该参数的值。
此更改也已回溯至:0.7.10
参考:#2631 - [sql] [bug]
修复了由 #2410 引起的回归,即CheckConstraint
在Table.tometadata()
操作期间会将自身应用回原始表,因为它会解析父表的 SQL 表达式。现在该操作会将给定的表达式复制以对应新表。
参考:#2633 - [sql] [bug]
修复了在方言上使用 label_length 小于实际列标识符大小的 bug,会导致在 SELECT 语句中无法正确渲染列。
参考:#2610 - [sql] [bug]
DECIMAL
类型现在在渲染 DDL 时遵守“precision”和“scale”参数。
参考:#2618 - [sql] [bug]
对二进制表达式的“布尔”(即__nonzero__
)评估进行了调整,即x1 == x2
,使得BinaryExpression
在某些情况下的“自动分组”不会妨碍此比较。 以前,像这样的表达式:
expr1 = mycolumn > 2 bool(expr1 == expr1)
- 尽管这是一个身份比较,但会评估为
False
,因为mycolumn > 2
会在放入BinaryExpression
之前被“分组”,从而改变其身份。BinaryExpression
现在跟踪传入的“原始”对象。 此外,__nonzero__
方法现在仅在运算符为==
或!=
时返回 - 所有其他情况都会引发TypeError
。
参考:#2621 - [sql] [bug]
修复了一个问题,即无意中在ColumnElement
上调用 list()会进入无限循环,如果实现了ColumnOperators.__getitem__()
。 通过__iter__()
发出新的 NotImplementedError。 - [sql] [bug]
修复了type_coerce()
中的一个 bug,即如果语句被用作另一个语句内部的子查询,以及其他类似情况,可能会丢失类型信息。 其中之一是当 Oracle/mssql 方言应用 limit/offset 包装时,会导致类型信息丢失。
参考:#2603 - [sql] [bug]
修复了一个 bug,即在生成可选择的列的“代理”时,未使用列的“.key”��� 这可能在 0.7 中没有发生,因为 0.7 在更广泛的情况下不尊重“.key”。
参考:#2597
postgresql
- [postgresql] [feature]
HSTORE
现在在 PostgreSQL 方言中可用。 如果可用,还将使用 psycopg2 的扩展。 感谢 Audrius Kažukauskas。
参考:#2606
sqlite
- [sqlite] [bug]
对此与 SQLite 相关的问题进行了更多调整,该问题在 0.7.9 中发布,以拦截反映外键时的传统 SQLite 引号字符。 除了拦截双引号外,现在还拦截其他引号字符,如括号、反引号和单引号。
此更改也回溯到:0.7.10
参考:#2568
mssql
- [mssql] [功能]
支持反射“主键约束”的“名称”,感谢戴夫·摩尔。
参考:#2600 - [mssql] [错误]
修复了在使用 Column 的“key”与拥有表的“schema”结合时,由于 MSSQL 方言的“schema 渲染”逻辑未考虑 .key 而导致无法定位结果行的错误。
此更改也回溯到:0.7.10
oracle
- [oracle] [错误]
修复了在访问引用到 DBLINK 远程数据库的同义词时,Oracle 的表反射问题;虽然该语法在 Oracle 方言中已存在一段时间,但直到现在还未经过测试。该语法已针对链接到自身的示例数据库进行了测试,但在查询远程数据库的表信息时仍存在一些不确定性。目前,从 user_db_links 中使用的“用户名”值用于匹配“所有者”。
参考:#2619 - [oracle] [错误]
Oracle 的 LONG 类型,虽然是一个无界文本类型,但在返回结果行时似乎不使用 cx_Oracle.LOB 类型,因此方言已修复以排除 LONG 从应用 cx_Oracle.LOB 过滤。也在 0.7.10 中。
参考:#2620 - [oracle] [错误]
修复了在与 cx_Oracle 结合使用.prepare()
时,如果返回值为False
,则不会调用connection.commit()
,从而避免“无事务”错误。已经证明 SQLAlchemy 和 cx_oracle 可以以一种基本方式工作,但受到驱动程序的注意事项的影响;请查看文档以��取详细信息。也在 0.7.10 中。
参考:#2611
杂项
- [功能] [sybase]
Sybase 方言现在添加了反射支持。非常感谢本·特罗法特为开发和测试所做的所有工作。
参考:#1753 - [功能] [池]
Pool
现在将记录所有 connection.close() 操作,包括对无效连接、分离连接和超出池容量的连接的关闭。 - [功能] [池]
Pool
现在咨询Dialect
关于连接应如何“自动回滚”以及关闭的功能。这使得方言对事务范围有更多控制,因此我们将更好地实现对 pysqlite 和 cx_oracle 可能需要的事务解决方法。
参考:#2611 - [特性] [池]
添加了新的PoolEvents.reset()
钩子来捕获连接自动回滚前的事件,返回到池中。与ConnectionEvents.rollback()
一起,这允许拦截所有回滚事件。 - [错误] [firebird]
在实验性的“firebird+fdb”方言中添加了对“fdb”的丢失导入。
参考:#2622 - [informix]
已删除一些关于 informix 事务处理的垃圾,包括跳过调用 commit()/rollback() 以及在 begin() 上的一些硬编码隔离级别假设的特性。对该方言的状态理解不深,因为我们没有任何与之相关的用户,也没有任何访问 Informix 数据库的权限。如果有人有权访问 Informix 并愿意帮助测试该方言,请告诉我们。
SqlAlchemy 2.0 中文文档(六十五)(2)https://developer.aliyun.com/article/1560887