SqlAlchemy 2.0 中文文档(六十八)(4)https://developer.aliyun.com/article/1560743
0.5.0rc3
发布日期:2008 年 11 月 07 日
orm
- [orm]
在 SessionExtension 中添加了两个新的钩子:after_bulk_delete() 和 after_bulk_update()。在查询上执行 bulk delete() 操作后会调用 after_bulk_delete()。在查询上执行 bulk update() 操作后会调用 after_bulk_update()。 - [orm]
简单的一对多关系的“不等于”比较将不会陷入 EXISTS 子句,而是会比较外键列。 - [orm]
移除了将集合与可迭代对象进行比较的不太有效的用例。使用 contains() 来测试集合成员资格。 - [orm]
改进了 aliased() 对象的行为,使其更准确地适应生成的表达式,这在自引用比较中特别有帮助。
参考:#1171 - [orm]
修复了从类绑定属性构造的 primaryjoin/secondaryjoin 条件的 bug(通常在使用 declarative 时发生),稍后 Query 会不正确地别名,特别是在使用各种基于 EXISTS 的比较器时。 - [orm]
修复了使用多个 query.join() 与别名绑定描述符时会丢失左别名的 bug。 - [orm]
改进了弱引用标识映射的内存管理,不再需要互斥锁,对具有挂起更改的 InstanceState 在懒惰基础上复活被垃圾回收的实例。 - [orm]
InstanceState 对象现在在处理后会删除对自身的循环引用,以使其不受循环垃圾回收的影响。 - [orm]
在确定连接条件时,relation() 不会在“请指定 primaryjoin”消息中隐藏无关的 ForeignKey 错误。 - [orm]
修复了 Query 中涉及 order_by() 与同一类的多个别名一起使用时的 bug(将添加测试)。
参考:#1218 - [orm]
在使用 Query.join()时,如果 ON 子句有明确的条件,该条件将被别名化为连接的左侧,允许像 query(Source). from_self().join((Dest, Source.id==Dest.source_id))这样的场景正常工作。 - [orm]
如果每个列的“key”与列的名称不同,polymorphic_union()函数将尊重每个列的“key”。 - [orm]
修复了“被动删除”在具有“delete”级联的多对一关系()上的支持。
参考:#1183 - [orm]
修复了组合类型中的错误,该错误阻止了主键组合类型的变异。
参考:#1213 - [orm]
增加了对内部属性访问的更细粒度,使得级联和刷新操作不会初始化未加载的属性和集合,使它们保持原样以便稍后进行延迟加载。对于待处理实例,反向引用事件仍会初始化属性和集合。
参考:#1202
sql
- [sql]
SQL 编译器优化和复杂性降低。编译典型 select()构造的调用次数比 0.5.0rc2 少 20%。 - [sql]
方言现在可以生成可调整长度的标签名称。传入参数“label_length=”到 create_engine()以调整动态生成列标签中最多有多少个字符,即“somecolumn AS somelabel”。任何小于 6 的值将导致最小尺寸的标签,由下划线和数字计数器组成。编译器使用 dialect.max_identifier_length 的值作为默认值。
参考:#1211 - [sql]
简化了对 ResultProxy“无结果自动关闭”的检查,仅基于光标描述的存在。所有基于正则表达式的关于返回行的猜测都已被移除。
参考:#1212 - [sql]
直接执行 union()构造将正确设置结果行处理。
参考:#1194 - [sql]
已移除“OID”或“ROWID”列的内部概念。它基本上没有被任何方言使用,而且现在使用 INSERT…RETURNING,基本上不再可能与 psycopg2 的 cursor.lastrowid 一起使用。 - [sql]
在所有 FromClause 对象上移除了“default_order_by()”方法。 - [sql]
修复了 table.tometadata()方法,使传入的模式参数传播到 ForeignKey 构造中。 - [sql]
稍微改变了用于与空集合比较的 IN 运算符的行为。现在会导致与自身的不等比较。更具可移植性,但会破坏不是纯函数的存储过程。
mysql
- [mysql]
在表的显式 schema= 与连接附加到的 schema(数据库)相同时,修复了外键反射的边缘情况。 - [MySQL]
不再期望表反射中的 include_columns 为小写。
Oracle
- [Oracle]
为 Oracle dialect 编写了一个文档字符串。显然,Ohloh 的“few source code comments”标签开始串联 😃. - [Oracle]
在使用 LIMIT/OFFSET 时移除了 FIRST_ROWS() 优化标志,可以通过 optimize_limits=True create_engine() 标志重新启用。
参考:#536 - [Oracle]
错误修复和行为更改 - [Oracle]
在 create_engine() 上将 auto_convert_lobs 设置为 False 也将指示 OracleBinary 类型返回 cx_oracle LOB 对象不变。
杂项
- [扩展]
添加了一个新的扩展 sqlalchemy.ext.serializer。提供了与 Pickle/Unpickle 镜像的 Serializer/Deserializer “类”,以及 dumps() 和 loads()。此序列化程序实现了一个“外部对象” pickler,将关键上下文敏感对象,包括 engines、sessions、metadata、Tables/Columns 和 mappers,保持在 pickle 流之外,并且可以稍后使用任何 engine/metadata/session 提供程序恢复 pickle。这不是用于 pickling 普通对象实例,这些对象实例可以在没有任何特殊逻辑的情况下进行 pickling,而是用于 pickling 表达式对象和完整的 Query 对象,以便在 unpickle 时可以恢复所有 mapper/engine/session 依赖项。 - [扩展]
修复了阻止 declarative-bound “column” 对象在 column_mapped_collection() 中使用的 bug。
参考:#1174 - [杂项]
util.flatten_iterator() 函数不会将具有 iter() 方法的字符串解释为迭代器,例如在 pypy 中。
参考:#1077
ORM
- [ORM]
向 SessionExtension 添加了两个新的 hooks:after_bulk_delete() 和 after_bulk_update()。在查询上执行 bulk delete() 操作后调用 after_bulk_delete()。在查询上执行 bulk update() 操作后调用 after_bulk_update()。 - [ORM]
简单的多对一关系的“不等于”比较将不会陷入 EXISTS 子句,并将比较外键列。 - [ORM]
移除了比较集合与可迭代对象的不真正有效的用例。使用 contains() 来测试集合成员资格。 - [ORM]
改进了 aliased() 对象的行为,使其更准确地适应生成的表达式,特别有助于自引用比较。
参考:#1171 - [ORM]
修复了从类绑定属性构造的 primaryjoin/secondaryjoin 条件的 bug(在使用 declarative 时经常发生),稍后 Query 会不适当地别名化这些条件,��别是在各种基于 EXISTS 的比较器中。 - [ORM]
修复了使用多个 query.join() 与别名绑定描述符时会丢失左别名的 bug。 - [orm]
改进了弱引用标识映射的内存管理,不再需要互斥锁,对具有挂起更改的 InstanceState 在懒惰基础上复活被垃圾回收的实例。 - [orm]
InstanceState 对象现在在处理后会删除对自身的循环引用,以使其保持在循环垃圾回收之外。 - [orm]
在确定连接条件时,relation() 不会在“请指定 primaryjoin”消息中隐藏不相关的 ForeignKey 错误。 - [orm]
修复了 Query 中涉及 order_by() 与同一类的多个别名结合时的 bug(将添加测试)
参考:#1218 - [orm]
使用 Query.join() 时,对 ON 子句进行显式定义,该子句将别名化为连接的左侧,允许像 query(Source). from_self().join((Dest, Source.id==Dest.source_id)) 这样的场景正常工作。 - [orm]
如果 polymorphic_union() 函数中的每个 Column 的“key”与列名不同,则会予以尊重。 - [orm]
修复了在“delete”级联关系上支持“被动删除”对多对一 relation() 的支持。
参考:#1183 - [orm]
修复了组合类型中的 bug,该 bug 阻止了主键组合类型的变异。
参考:#1213 - [orm]
对内部属性访问增加了更多细粒度,使得级联和刷新操作不会初始化未加载的属性和集合,保持它们完整以供稍后进行延迟加载。对于待处理实例,反向引用事件仍会初始化属性和集合。
参考:#1202
sql
- [sql]
SQL 编译器优化和复杂性降低。编译典型 select() 构造的调用次数比 0.5.0rc2 少 20%。 - [sql]
方言现在可以生成可调整长度的标签名称。传入参数“label_length=”到 create_engine() 中,以调整动态生成列标签中最多存在多少个字符,即“somecolumn AS somelabel”。任何小于 6 的值将导致最小尺寸的标签,由下划线和数字计数器组成。编译器使用 dialect.max_identifier_length 的值作为默认值。
参考:#1211 - [sql]
简化了对 ResultProxy “无结果自动关闭” 的检查,仅基于存在 cursor.description。所有基于正则表达式的关于语句返回行的猜测都已被移除。
参考:#1212 - [sql]
直接执行 union() 构造将正确设置结果行处理。
参考:#1194 - [sql]
已删除“OID”或“ROWID”列的内部概念。基本上没有任何方言使用它,而且现在使用 INSERT…RETURNING,使用 psycopg2 的 cursor.lastrowid 的可能性基本上已经消失。 - [sql]
在所有 FromClause 对象上删除了“default_order_by()”方法。 - [sql]
修复了 table.tometadata()方法,使传入的模式参数传播到 ForeignKey 构造中。 - [sql]
稍微改变了用于与空集合比较的 IN 运算符的行为。现在会导致与自身的不等式比较。更具可移植性,但会破坏不是纯函数的存储过程。
mysql
- [mysql]
修复了在表的显式 schema=与连接附加到的 schema(数据库)相同时的外键反射问题。 - [mysql]
不再期望在表反射中包含的列为小写。
oracle
- [oracle]
为 Oracle 方言编写了一个文档字符串。显然,Ohloh 的“few source code comments”标签开始串联了 😃. - [oracle]
在使用 LIMIT/OFFSET 时删除了 FIRST_ROWS()优化标志,可以通过 optimize_limits=True create_engine()标志重新启用。
参考:#536 - [oracle]
修复错误和行为更改 - [oracle]
在 create_engine()上将 auto_convert_lobs 设置为 False 也将指示 OracleBinary 类型将 cx_oracle LOB 对象原样返回。
misc
- [ext]
添加了一个新的扩展 sqlalchemy.ext.serializer。提供了 Serializer/Deserializer“类”,这些类镜像了 Pickle/Unpickle,以及 dumps()和 loads()。这个序列化器实现了一个“外部对象”pickler,它将关键上下文敏感对象,包括 engines、sessions、metadata、Tables/Columns 和 mappers,保持在 pickle 流之外,并且可以在以后使用任何 engine/metadata/session 提供程序恢复 pickle。这不是用于 pickle 常规对象��例,这些对象实例可以在没有任何特殊逻辑的情况下进行 pickle,而是用于 pickle 表达式对象和完整的 Query 对象,以便在 unpickle 时可以恢复所有 mapper/engine/session 依赖关系。 - [ext]
修复了阻止声明绑定的“column”对象在 column_mapped_collection()中使用的错误。
参考:#1174 - [misc]
util.flatten_iterator()函数不会将具有 iter()方法的字符串解释为迭代器,例如在 pypy 中。
参考:#1077
0.5.0rc2
发布日期:2008 年 10 月 12 日星期日
orm
- [orm]
修复了涉及包含文字或其他非列表达式的 read/write relation()在其 primaryjoin 条件中等于外键列的错误。 - [orm]
在 mapper()中的“non-batch”模式,这个功能允许在每个实例更新/插入时调用 mapper 扩展方法,现在遵守给定对象的插入顺序。 - [orm]
修复了 mapper 中与 RLock 相关的 bug,该 bug 可能在重新进入的 mapper compile()调用时发生死锁,这种情况发生在在 ForeignKey 对象中使用声明性构造时。 - [orm]
ScopedSession.query_property 现在接受一个 query_cls 工厂,覆盖了会话配置的 query_cls。 - [orm]
修复了共享状态 bug,干扰了 ScopedSession.mapper 在对象子类上应用默认 init 实现的能力。 - [orm]
修复了 Query 上的切片(即 query[x:y])对于零长度切片、两端为 None 的切片的正确工作。
参考:#1177 - [orm]
添加了一个示例,说明了 Celko 的“嵌套集合”作为 SQLA 映射的方法。 - [orm]
包含带有别名参数的 contains_eager()即使别名嵌入在 SELECT 中,也可以在通过 query.select_from()发送到查询时正常工作。 - [orm]
contains_eager()的用法现在与同时包含常规急加载和限制/偏移的查询兼容,因为列被添加到由查询生成的子查询中。
参考:#1180 - [orm]
session.execute()将执行传递给它的 Sequence 对象(从 0.4 版本中的回归)。 - [orm]
从 object_mapper()和 class_mapper()中删除了“raiseerror”关键字参数。如果给定的类/实例未映射,这些函数在所有情况下都会引发异常。 - [orm]
修复了在 autocommit=False 会话上调用 session.transaction.commit()不启动新事务的问题。 - [orm]
对 Session.identity_map 的弱引用行为进行了一些调整,以减少异步 GC 的副作用。 - [orm]
调整了 Session 在后刷新时对新“干净”对象的计数,以更好地防止在异步 gc 时对对象进行操作。
参考:#1182
sql
- [sql]
column.in_(someselect)现在可以作为一个列子句表达式使用,而不会导致子查询泄漏到 FROM 子句中
参考:#1074
mysql
- [mysql]
临时表现在可以反射。
sqlite
- [sqlite]
对 SQLite 日期/时间绑定/结果处理进行了全面改进,使用正则表达式和格式字符串,而不是 strptime/strftime,以通用支持 1900 年前的日期、带微秒的日期。
参考:#968 - [sqlite]
在 sqlite 方言中禁用了 String(以及 Unicode,UnicodeText 等)的 convert_unicode 逻辑,以适应 pysqlite 2.5.0 的新要求,即只接受 Python unicode 对象;itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html
oracle
- [oracle]
Oracle 将检测包含在 SELECT 之前的字符串语句中的注释作为 SELECT 语句。
参考:#1187
orm
- [orm]
修复了涉及包含文字或其他非列表达式的 read/write relation() 在其 primaryjoin 条件中等于外键列的 bug。 - [orm]
”非批量”模式在 mapper() 中,这个特性允许在每个实例更新/插入时调用映射扩展方法,现在遵循给定对象的插入顺序。 - [orm]
修复了 mapper 中与 RLock 相关的 bug,该 bug 可能在重新进入 mapper compile() 调用时发生死锁,这种情况发生在 ForeignKey 对象中使用声明性构造时。 - [orm]
ScopedSession.query_property 现在接受一个 query_cls 工厂,覆盖了会话配置的 query_cls。 - [orm]
修复了共享状态 bug,干扰了 ScopedSession.mapper 对对象子类应用默认 init 实现的能力。 - [orm]
修复了 Query 上的切片(即 query[x:y])对于零长度切片、任一端为 None 的切片的正确工作。
参考:#1177 - [orm]
添加了一个示例,说明了 Celko 的“嵌套集”作为 SQLA 映射。 - [orm]
包含了一个别名参数的 contains_eager() 在 SELECT 中嵌入别名时也能正常工作,就像通过 query.select_from() 发送给 Query 一样。 - [orm]
contains_eager() 的用法现在与同时包含常规 eager load 和 limit/offset 的 Query 兼容,因此列被添加到 Query 生成的子查询中。
参考:#1180 - [orm]
session.execute() 现在可以执行传递给它的 Sequence 对象(从 0.4 版本中的回归)。 - [orm]
从 object_mapper() 和 class_mapper() 中移除了“raiseerror”关键字参数。如果给定的类/实例未映射,这些函数在所有情况下都会引发异常。 - [orm]
修复了在 autocommit=False 会话上调用 session.transaction.commit() 未启动新事务的 bug。 - [orm]
对 Session.identity_map 的弱引用行为进行了一些调整,以减少异步 GC 的副作用。 - [orm]
调整了 Session 在后刷新时对新“干净”对象的计数,以更好地防止在对象异步 gc 时对其进行操作。
参考:#1182
sql
- [sql]
column.in_(someselect) 现在可以作为一个列子句表达式使用,而不会导致子查询泄漏到 FROM 子句中。
参考:#1074
mysql
- [mysql]
临时表现在可以反射。
sqlite
- [sqlite]
对 SQLite 日期/时间绑定/结果处理进行了全面改进,使用正则表达式和格式字符串,而不是 strptime/strftime,以通用支持 1900 年前的日期、带微秒的日期。
参考:#968 - [sqlite]
在 sqlite 方言中禁用了 String(和 Unicode,UnicodeText 等)的 convert_unicode 逻辑,以适应 pysqlite 2.5.0 的新要求,即只接受 Python unicode 对象;itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html
oracle
- [oracle]
Oracle 将检测包含在 SELECT 之前的前面的注释的基于字符串的语句作为 SELECT 语句。
参考:#1187
0.5.0rc1
发布日期:Thu Sep 11 2008
orm
- [orm]
Query 现在具有 delete()和 update(values)方法。这允许使用 Query 对象执行批量删除/更新。 - [orm]
Query(*cols)返回的 RowTuple 对象现在具有 keynames,它们更喜欢映射属性名称而不是列键,列键而不是列名称,即 Query(Class.foo, Class.bar)将具有名称“foo”和“bar”,即使它们不是基础 Column 对象的名称。直接的 Column 对象,如 Query(table.c.col),将���回 Column 的“key”属性。 - [orm]
向 Query 添加了 scalar()和 value()方法,每个方法返回单个标量值。scalar()不带参数,大致相当于 first()[0],value()接受单个列表达式,大致相当于 values(expr).next()[0]。 - [orm]
改进了在将 SQL 表达式放置在查询()实体列表中时确定 FROM 子句的方法。特别是标量子查询不应该将其内部 FROM 对象泄漏到封闭查询中。 - [orm]
通过从映射类到映射子类的关系()进行连接,其中映射子类配置为单表继承,将在连接的 ON 子句中包含一个 IN 子句,该子句将限制所请求的连接类的子类型。这对急加载连接以及 query.join()都有效。请注意,在某些情况下,由于此区分具有多个触发点,IN 子句也将出现在查询的 WHERE 子句中。 - [orm]
AttributeExtension 已经得到改进,使得事件在实际发生变化之前被触发。此外,append()和 set()方法现在必须返回给定的值,该值用作要在变异操作中使用的值。这允许创建验证 AttributeListeners,它们在实际操作发生之前引发,并且可以将给定的值更改为其他值。 - [orm]
column_property(),composite_property()和 relation()现在接受一个单个或 AttributeExtensions 列表,使用“extension”关键字参数。 - [orm]
query.order_by().get()会在 GET 发出的查询中静默删除“ORDER BY”,但不会引发异常。 - [orm]
添加了一个验证器 AttributeExtension,以及一个@validates 装饰器,类似于@reconstructor,标记一个方法验证一个或多个映射属性。 - [orm]
class.someprop.in_()在关系的“in_”实现之前引发 NotImplementedError
参考:#1140 - [orm]
修复了许多对多集合的主键更新,其中集合尚未加载的 bug
参考:#1127 - [orm]
修复了具有组合在一起的 deferred()列与与其无关的 synonym()一起产生 AttributeError 的 bug。 - [orm]
在 SessionExtension 的 before_flush()钩子在最终计算新/脏/已删除列表之前发生,允许在 flush 继续之前在 before_flush()中进一步更改 Session 的状态。
参考:#1128 - [orm]
Session 和其他对象的“extension”参数现在可以选择性地是一个列表,支持发送到多个 SessionExtension 实例的事件。 Session 将 SessionExtensions 放在 Session.extensions 中。 - [orm]
对 flush()的可重入调用会引发错误。 这也作为针对 Session.flush()的并发调用的基本但不是绝对可靠的检查。 - [orm]
改进了在使用显式连接条件(即不是在关系上)连接到继承子类时,query.join()的行为。 - [orm]
@orm.attributes.reconstitute 和 MapperExtension.reconstitute 已重命名为@orm.reconstructor 和 MapperExtension.reconstruct_instance - [orm]
修复了从基类继承的子类的@reconstructor 钩子。
参考:#1129 - [orm]
composite()属性类型现在支持在复合类上的 set_composite_values()方法,如果该类使用属性名称而不是列的键名来表示状态,则需要该方法;默认生成的值现在在 flush 时正确填充。此外,将属性设置为 None 的复合类现在可以正确比较。
参考:#1132 - [orm]
由 attributes.get_history()返回的三元组现在可以是列表和元组的混合。 (以前成员总是列表。) - [orm]
修复了在更改实体上的主键属性时,如果属性的先前值已过期,则在 flush()时会产生错误的错误。
参考:#1151 - [orm]
修复了自定义仪器化 bug,其中对于 ORM 尚未加载的新构造实例未调用 get_instance_dict()。 - [orm]
如果给定对象尚未存在,则 Session.delete()将该对象添加到会话中。这是从 0.4 版本开始的一个回归错误。
参考:#1150 - [orm]
Session 上的 echo_uow 标志已弃用,现在单元操作日志记录仅适用于应用程序级别,而不是每个会话级别。 - [orm]
从 InstrumentedAttribute 中删除了冲突的 contains()运算符,该运算符不接受 escape kwaarg。
参考:#1153
sql
- [sql]
暂时回滚了“ORDER BY”增强功能。此功能暂停等待进一步开发。
参考:#1068 - [sql]
exists()构造不会将其包含的元素列表作为 FROM 子句“导出”,这使得它们可以更有效地在 SELECT 的列子句中使用。 - [sql]
and_()和 or_()现在生成 ColumnElement,允许布尔表达式作为结果列,例如 select([and_(1, 0)])。
参考:#798 - [sql]
绑定参数现在是 ColumnElement 的子类,这使得它们可以被 orm.query 选择(它们已经具有大多数 ColumnElement 语义)。 - [sql]
为 exists()构造添加了 select_from()方法,使其与常规 select()更加兼容。 - [sql]
添加了 func.min(),func.max(),func.sum()作为“通用函数”,基本上允许它们的返回类型自动确定。有助于 SQLite 上的日期,十进制类型等。
参考:#1160 - [sql]
添加了 decimal.Decimal 作为“自动检测”类型;当使用 Decimal 时,绑定参数和通用函数将将它们的类型设置为 Numeric。
模式
- [schema]
添加了“sorted_tables”访问器到 MetaData,它返回按依赖顺序排序的 Table 对象列表。这使得 MetaData.table_iterator()方法已被弃用。util.sort_tables()中的“reverse=False”关键字参数也已被移除;使用 Python 的‘reversed’函数来反转结果。
参考:#1033 - [schema]
所有数字类型的“长度”参数已更名为“精度”。 “长度”已被弃用,但仍会发出警告。 - [schema]
放弃了对用户定义类型(convert_result_value,convert_bind_param)的 0.3 兼容性。
mysql
- [mysql]
MSInteger,MSBigInteger,MSTinyInteger,MSSmallInteger 和 MSYear 的“长度”参数已更名为“显示宽度”。 - [mysql]
添加了 MSMediumInteger 类型。
参考:#1146 - [mysql]
函数 func.utc_timestamp()编译为 UTC_TIMESTAMP,不带括号,这似乎在与 executemany()一起使用时会有问题。
oracle
- [oracle]
limit/offset 不再使用 ROW NUMBER OVER 来限制行数,而是与特殊的 Oracle 优化注释一起使用子查询。允许 LIMIT/OFFSET 与 DISTINCT 一起使用。
参考:#536 - [oracle]
has_sequence()现在考虑当前的“模式”参数
参考:#1155 - [oracle]
添加了 BFILE 到反射类型名称
参考:#1121
杂项
- [declarative]
修复了如果复合主键引用另一个尚未定义的表,则映射器无法初始化的 bug。
参考:#1161 - [declarative]
修复了在使用基于字符串的 primaryjoin 条件与 backref 结合使用时会抛出异常的 bug。
orm
- [orm]
Query 现在具有 delete() 和 update(values) 方法。这允许使用 Query 对象执行批量删除/更新。 - [orm]
Query(*cols) 返回的 RowTuple 对象现在具有 keynames,优先使用映射属性名称而不是列键,列键优先于列名称,即 Query(Class.foo, Class.bar) 将具有名称“foo”和“bar”,即使这些不是底层 Column 对象的名称���直接的 Column 对象,如 Query(table.c.col),将返回 Column 的“key”属性。 - [orm]
Query 现在具有 scalar() 和 value() 方法,每个方法返回一个单个标量值。scalar() 不带参数,大致相当于 first()[0],value() 接受一个列表达式,大致相当于 values(expr).next()[0]。 - [orm]
改进了在将 SQL 表达式放置在实体的 query() 列表中时确定 FROM 子句的方法。特别是标量子查询不应该将其内部的 FROM 对象泄漏到封闭查询中。 - [orm]
从映射类到映射子类的 relation() 连接,其中映射子类配置为单表继承,将包括一个 IN 子句,限制连接类的子类型为请求的子类型,在连接的 ON 子句中生效。这适用于急加载连接以及 query.join()。请注意,在某些情况下,由于此区分具有多个触发点,IN 子句也会出现在查询的 WHERE 子句中。 - [orm]
AttributeExtension 已经得到改进,使事件在实际发生变化之前触发。此外,append() 和 set() 方法现在必须返回给定的值,该值用作要在变异操作中使用的值。这允许创建验证 AttributeListeners,在实际操作发生之前引发,并且可以将给定的值更改为其他值。 - [orm]
column_property()、composite_property() 和 relation() 现在接受一个或多个 AttributeExtensions,使用“extension”关键字参数。 - [orm]
query.order_by().get() 会在 GET 发出的查询中静默删除“ORDER BY”,但不会引发异常。 - [orm]
添加了一个验证器属性扩展(Validator AttributeExtension),以及一个 @validates 装饰器,类似于 @reconstructor,标记一个方法验证一个或多个映射属性。 - [orm]
class.someprop.in_() 在 relation 的“in_”实现之前会引发 NotImplementedError
参考:#1140 - [orm]
修复了在尚未加载集合的多对多集合的主键更新问题
参考:#1127 - [orm]
修复了具有组并与否无关的 synonym()的 deferred()列在延迟加载期间会产生 AttributeError 的 bug。 - [orm]
SessionExtension 上的 before_flush()钩子在最终计算新/脏/已删除列表之前发生,允许在 flush 继续之前在 before_flush()中进一步更改 Session 的状态。
参考:#1128 - [orm]
“extension”参数现在可以选择性地是一个列表,支持发送到多个 SessionExtension 实例的事件。Session 将 SessionExtensions 放在 Session.extensions 中。 - [orm]
对 flush()的重入调用会引发错误。这也作为针对 Session.flush()的并发调用的基本但不是绝对可靠的检查。 - [orm]
改进了 query.join()在连接到连接表继承子类时的行为,使用显式的连接条件(即不是在关系上)。 - [orm]
@orm.attributes.reconstitute 和 MapperExtension.reconstitute 已重命名为@orm.reconstructor 和 MapperExtension.reconstruct_instance - [orm]
修复了从基类继承的子类的@reconstructor 钩子。
参考:#1129 - [orm]
composite()属性类型现在支持 composite 类上的 set_composite_values()方法,如果该类使用除列键名之外的属性名称表示状态,则该方法是必需的;默认生成的值现在在 flush 时正确填充。此外,将属性设置为 None 的复合体现在比较时是正确的。
参考:#1132 - [orm]
attributes.get_history()返回的三元组现在可以是列表和元组的混合。(以前成员总是列表。) - [orm]
修复了在属性的先前值已过期的实体上更改主键属性会在 flush()时产生错误的 bug。
参考:#1151 - [orm]
修复了自定义仪器 bug,其中 get_instance_dict()未对未由 ORM 加载的新构造实例调用。 - [orm]
如果给定对象尚未存在,则 Session.delete()将给定对象添加到会话中。这是从 0.4 版本开始的一个回归 bug。
参考:#1150 - [orm]
Session 上的 echo_uow 标志已弃用,工作单元日志现在仅适用于应用程序级别,而不是每个会话级别。 - [orm]
从 InstrumentedAttribute 中删除了冲突的 contains()运算符,该运算符不接受 escape kwaarg。
参考:#1153
sql
- [sql]
暂时回滚了“ORDER BY”增强功能。该功能暂停等待进一步开发。
参考:#1068 - [sql]
exists()构造不会将其包含的元素列表作为 FROM 子句“导出”,这样可以更有效地在 SELECT 的 columns 子句中使用它们。 - [sql]
and_()和 or_()现在生成 ColumnElement,允许布尔表达式作为结果列,即 select([and_(1, 0)]).
参考:#798 - [sql]
绑定参数现在是 ColumnElement 的子类,这使它们可以被 orm.query 选择(它们已经具有大多数 ColumnElement 语义)。 - [sql]
为 exists()构造添加了 select_from()方法,使其与常规 select()更加兼容。 - [sql]
添加了 func.min()、func.max()、func.sum()作为“通用函数”,基本上允许它们的返回类型自动确定。有助于 SQLite 上的日期、十进制类型等。
参考:#1160 - [sql]
添加了 decimal.Decimal 作为“自动检测”类型;当使用 Decimal 时,绑定参数和通用函数将将它们的类型设置为 Numeric。
schema
- [schema]
添加了“sorted_tables”访问器到 MetaData,它返回按依赖顺序排序的 Table 对���列表。这使 MetaData.table_iterator()方法过时。util.sort_tables()中的“reverse=False”关键字参数也已被移除;使用 Python 的‘reversed’函数来反转结果。
参考:#1033 - [schema]
所有 Numeric 类型的‘length’参数已重命名为‘scale’。‘length’已被弃用,但仍会发出警告。 - [schema]
放弃了用户定义类型(convert_result_value, convert_bind_param)的 0.3 兼容性。
mysql
- [mysql]
MSInteger、MSBigInteger、MSTinyInteger、MSSmallInteger 和 MSYear 的‘length’参数已重命名为‘display_width’。 - [mysql]
添加了 MSMediumInteger 类型。
参考:#1146 - [mysql]
函数 func.utc_timestamp()编译为 UTC_TIMESTAMP,不带括号,当与 executemany()一起使用时,括号似乎会妨碍使用。
oracle
- [oracle]
limit/offset 不再使用 ROW NUMBER OVER 来限制行数,而是与特殊的 Oracle 优化注释一起使用子查询。允许 LIMIT/OFFSET 与 DISTINCT 一起使用。
参考:#536 - [oracle]
has_sequence()现在考虑了当前的“schema”参数
参考:#1155 - [oracle]
将 BFILE 添加到反射类型名称中
参考:#1121
杂项
- [declarative]
修复了一个 bug,即如果复合主键引用另一个尚未定义的表,则映射器无法初始化。
参考:#1161 - [declarative]
修复了在使用 backref 时使用基于字符串的 primaryjoin 条件时可能发生的异常抛出。
0.5.0beta3
发布日期:2008 年 8 月 4 日星期一
orm
- [orm]
SQLAlchemy 映射器的“entity_name”功能已被移除。有关原因,请参见tinyurl.com/6nm2ne
- [orm]
Session、sessionmaker()和 scoped_session()上的“autoexpire”标志已重命名为“expire_on_commit”。它不会影响 rollback()的过期行为。 - [orm]
修复了在映射器延迟加载继承属性时可能发生的无限循环错误。 - [orm]
为 Session 添加了一个名为“_enable_transaction_accounting”的遗留支持标志,当为 False 时,禁用所有事务级对象计数,包括回滚时的过期,提交时的过期,新建/删除列表维护以及在开始时的自动刷新。 - [orm]
relation()的“cascade”参数接受 None 作为值,这等效于没有级联。 - [orm]
修复动态关系的关键问题,允许在 flush()之后正确清除“修改后”的历史记录。 - [orm]
类上的用户定义的@property 在映射器初始化期间被检测并保留在原位。这意味着如果@property 挡住了同名的表绑定列(且该列未被重新映射为不同名称),或者从继承类中继承的 instrumented 属性被应用,那么同名的表绑定列将根本不会被映射。使用 include_properties/exclude_properties 集合排除的名称也适用相同的规则。 - [orm]
添加了一个名为 after_attach()的新 SessionExtension 钩子。这在通过 add()、add_all()、delete()和 merge()附加对象时调用。 - [orm]
继承自另一个映射器的映射器,在继承其继承映射器的列时,将使用在该继承映射器中指定的任何重新分配的属性名称。以前,如果“Base”将“base_id”重新分配为名称“id”,那么“SubBase(Base)”仍将获得名为“base_id”的属性。可以通过在每个子映射器中明确声明列来解决此问题,但这在使用声明性时也是相当不可行的。
参考:#1111 - [orm]
修复了 Session 中潜在的一系列竞争条件,异步 GC 可能会在 session.expunge_all()和相关方法期间将未修改且不再引用的项目从会话中移除,因为它们存在于要处理的项目列表中。 - [orm]
对于应该减少“在编译期间未替换属性 x”警告概率的 _CompileOnAttr 机制进行了一些改进。(这通常适用于 SQLA 黑客,如 Elixir 开发人员)。 - [orm]
修复了一个 bug,即对于挂起的孤立实例,如果在生成负责错误的关系列表时不考虑超类映射器,则会引发“未保存的挂起实例”FlushError。
sql
- [sql]
func.count()如果没有参数,则呈现为 COUNT(),相当于 func.count(text(‘’))。 - [sql]
ORDER BY 表达式中的简单标签名称呈现为它们自身,而不是其对应表达式的重新陈述。此功能目前仅对 SQLite、MySQL 和 PostgreSQL 启用。可以在其他方言上启用此行为,只要每个方言都支持此行为。
参考:#1068
mysql
- [mysql]
在创建表时,对于 MSEnum 值的引用现在是可选的,并且将根据需要进行引用。(对于现有表的使用,引用始终是可选的。)
参考:#1110
杂项
- [ext]
作为参数发送给 relation()的 remote_side 和 foreign_keys 参数的类绑定属性现在被接受,允许它们与 declarative 一起使用。此外,修复了在与急加载一起指定为类绑定属性的 order_by 时出现的错误。 - [ext]
调整了列的声明式初始化,使得非重命名列以与非声明式映射器相同的方式初始化。这允许继承映射器设置其同名的“id”列,以便父“id”列优先于子列,减少请求此值时的数据库往返。
orm
- [orm]
SQLAlchemy 映射器的“entity_name”功能已被移除。有关原因,请参见tinyurl.com/6nm2ne
- [orm]
Session、sessionmaker()和 scoped_session()上的“autoexpire”标志已重命名为“expire_on_commit”。它不影响 rollback()的过期行为。 - [orm]
修复了在映射器的延迟加载中可能发生的无限循环错误。 - [orm]
为 Session 添加了一个名为“_enable_transaction_accounting”的遗留支持标志,当为 False 时,禁用所有事务级对象计数,包括回滚时的 expire,提交时的 expire,新建/删除列表维护以及 begin 时的自动刷新。 - [orm]
relation()的“cascade”参数接受 None 作为值,这等效于不进行级联。 - [orm]
对于动态关系的关键修复允许在 flush()后正确清除“modified”历史记录。 - [orm]
类中的用户定义的@property 属性在映射器初始化期间被检测并保留在原位。这意味着如果@property 属性挡在路上,那么具有相同名称的表绑定列将根本不被映射(且列未被重新映射为不同名称),也不会应用来自继承类的 instrumented 属性。使用 include_properties/exclude_properties 集合排除的名称也适用相同的规则。 - [orm]
添加了一个名为 after_attach()的新的 SessionExtension 钩子。这在通过 add()、add_all()、delete()和 merge()附加对象时调用。 - [orm]
当一个继承自另一个映射器的映射器继承其继承映射器中重新分配的属性名称时,将使用在继承映射器中指定的重新分配的属性名称。以前,如果“Base”将“base_id”重新分配为名称“id”,那么“SubBase(Base)”仍将获得一个名为“base_id”的属性。可以通过在每个子映射器中明确声明列来解决此问题,但这在使用声明性时也是相当不可行的。
参考:#1111 - [orm]
修复了 Session 中潜在的一系列竞争条件,在异步 GC 可能会从会话中删除未修改���、不再引用的项目,因为它们存在于要处理的项目列表中,通常在 session.expunge_all()和相关方法期间。 - [orm]
对于应该减少“在编译期间未替换属性 x”警告概率的 _CompileOnAttr 机制进行了一些改进(这通常适用于 SQLA 黑客,如 Elixir 开发人员)。 - [orm]
修复了一个 bug,即对于挂起的孤立实例引发的“未保存的挂起实例”FlushError 在生成负责错误的关系列表时不会考虑超类映射器。
sql
- [sql]
没有参数的 func.count()呈现为 COUNT(),相当于 func.count(text(‘’))。 - [sql]
ORDER BY 表达式中的简单标签名称呈现为它们自身,而不是其对应表达式的重新陈述。目前,此功能仅对 SQLite、MySQL 和 PostgreSQL 启用。可以在其他方言上启用此行为,因为每个方言都显示支持此行为。
参考:#1068
mysql
- [mysql]
用于在 CREATE TABLE 中使用的 MSEnum 值的引用现在是可选的,并将根据需要进行引用。 (对于与现有表一起使用,引用始终是可选的。)
参考:#1110
杂项
- [ext]
作为 relation()的 remote_side 和 foreign_keys 参数的参数发送给类绑定属性现在被接受,允许它们与声明性一起使用。此外,修复了在与急加载一起指定 order_by 作为类绑定属性时涉及的错误。 - [ext]
调整了列的声明式初始化,使得非重命名列以与非声明式映射器相同的方式初始化。这允许继承映射器特别设置其同名的“id”列,以便父“id”列优先于子列,减少在请求此值时的数据库往返次数。
0.5.0beta2
发布日期:Mon Jul 14 2008
orm
- [orm]
除了过期属性外,延迟属性也会在结果集中存在其数据时加载。
参考:#870 - [orm]
如果属性列表不包含任何基于列的属性,则 session.refresh()会引发一个信息性错误消息。 - [orm]
如果未指定列或映射器,则 query() 会引发一个信息丰富的错误消息。 - [orm]
惰性加载器现在在继续之前会触发自动刷新。这允许在自动刷新的上下文中正确地执行集合或标量关系的 expire()。 - [orm]
column_property() 属性代表 SQL 表达式或映射表中不存在的列(例如来自视图的列),在 INSERT 或 UPDATE 后会自动过期,假设它们没有被本地修改,以便在访问时使用最新的数据进行刷新。
参考文献:#887 - [orm]
修复了在使用 query.join(cls, aliased=True) 时两个连接表继承映射器之间的显式自引用连接。
参考文献:#1082 - [orm]
修复了在与仅包含列子句和 SQL 表达式 ON 子句一起使用时的 query.join()。 - [orm]
mapper() 中的 “allow_column_override” 标志已被移除。这个标志几乎总是被误解。其特定功能可以通过 include_properties/exclude_properties mapper 参数来实现。 - [orm]
修复了 Query 上的 str() 方法。
参考文献:#1066 - [orm]
即使定义了表/映射器特定绑定,Session.bind 也会被默认使用。
sql
- [sql]
添加了新的 match() 操作符,执行全文搜索。在 PostgreSQL、SQLite、MySQL、MS-SQL 和 Oracle 后端支持。
schema
- [schema]
向 Table 添加了 prefixes 选项,它接受一个字符串列表,用于在 CREATE TABLE 语句中的 CREATE 之后插入。
参考文献:#1075 - [schema]
Unicode、UnicodeText 类型现在默认设置 “assert_unicode” 和 “convert_unicode”,但可以接受这些值的覆盖 **kwargs。
扩展
- [extensions]
Declarative 支持一个名为 table_args 的类变量,它可以是一个字典,或者一个形如 (arg1, arg2, …, {kwarg1:value, …}) 的元组,其中包含传递给 Table 构造函数的位置参数和关键字参数。
参考文献:#1096
sqlite
- [sqlite]
修改了 SQLite 对 “微秒” 的表示,使其与 str(somedatetime) 的输出匹配,即微秒以字符串格式的小数秒表示。这使得 SQLA 的 SQLite 日期类型与直接使用 Pysqlite 保存的日期时间兼容(它只是调用 str())。请注意,这与 SQLA 0.4 生成的 SQLite 数据库文件中现有的微秒值不兼容。
要全局获取旧行为:
from sqlalchemy.databases.sqlite import DateTimeMixin DateTimeMixin.legacy_microseconds = True
- 要在个别 DateTime 类型上获取行为:
t = sqlite.SLDateTime() t.legacy_microseconds = True
- 然后在 Column 上使用 “t” 作为类型。
参考文献:#1090 - [sqlite]
SQLite 的 Date、DateTime 和 Time 类型现在只接受 Python datetime 对象,而不是字符串。如果您想要自己用 SQLite 格式化日期为字符串,请使用 String 类型。如果您希望它们无论如何返回 datetime 对象,尽管它们接受字符串作为输入,请使用 TypeDecorator 包装 String - SQLA 不鼓励这种模式。
orm
- [orm]
除了过期属性,延迟属性也会在结果集中加载。
参考:#870 - [orm]
如果属性列表不包含任何基于列的属性,session.refresh()会引发一个信息性错误消息。 - [orm]
如果未指定列或映射器,query()会引发一个信息性错误消息。 - [orm]
惰性加载器现在在继续之前会触发自动刷新。这允许在自动刷新的上下文中使集合或标量关系的 expire()函数正常工作。 - [orm]
column_property()属性代表 SQL 表达式或映射表中不存在的列(例如来自视图的列),在 INSERT 或 UPDATE 后会自动过期,假设它们没有在本地修改,以便在访问时使用最新数据进行刷新。
参考:#887 - [orm]
修复了在使用 query.join(cls, aliased=True)时两个连接表继承映射器之间的显式自引用连接。
参考:#1082 - [orm]
修复了 query.join()在与仅列子句和 SQL 表达式 ON 子句一起使用时的问题。 - [orm]
mapper()中的“allow_column_override”标志已被移除。这个标志几乎总是被误解。其特定功能可以通过 mapper 参数中的 include_properties/exclude_properties 实现。 - [orm]
修复了 Query 上的 str()方法。
参考:#1066 - [orm]
即使定义了特定于表/映射器的绑定,Session.bind 仍然作为默认值使用。
sql
- [sql]
添加了新的 match()操作符,执行全文搜索。在 PostgreSQL、SQLite、MySQL、MS-SQL 和 Oracle 后端支持。
schema
- [schema]
Table 添加了一个 prefixes 选项,接受一个字符串列表,在 CREATE TABLE 语句中的 CREATE 后插入。
参考:#1075 - [schema]
Unicode、UnicodeText 类型现在默认设置为“assert_unicode”和“convert_unicode”,但接受这些值的覆盖**kwargs。
extensions
- [extensions]
Declarative 支持一个 table_args 类变量,它可以是一个字典,或者是一个元组形式的(arg1, arg2, …, {kwarg1:value, …}),其中包含传递给 Table 构造函数的位置参数和关键字参数。
参考:#1096
sqlite
- [sqlite]
修改了 SQLite 对“微秒”的表示,使其与 str(somedatetime) 的输出匹配,即微秒以字符串格式表示为分数秒。这使得 SQLA 的 SQLite 日期类型与直接使用 Pysqlite(仅调用 str())保存的日期时间兼容。请注意,这与 SQLA 0.4 生成的 SQLite 数据库文件中现有微秒值不兼容。
要全局获得旧的行为:
from sqlalchemy.databases.sqlite import DateTimeMixin DateTimeMixin.legacy_microseconds = True
- 要在个别 DateTime 类型上获得此行为:
t = sqlite.SLDateTime() t.legacy_microseconds = True
- 然后在 Column 上使用“t”作为类型。
参考:#1090 - [sqlite]
SQLite 的 Date、DateTime 和 Time 类型现在只接受 Python datetime 对象,不接受字符串。如果你想要用 SQLite 格式化日期为字符串,请使用 String 类型。如果你想要它们返回 datetime 对象,尽管它们接受字符串作为输入,请使用 TypeDecorator 包装 String——SQLA 不鼓励这种模式。
0.5.0beta1
发布日期:Thu Jun 12 2008
general
- [general]
全局“propigate”->“propagate” 更改。
orm
- [orm]
polymorphic_union() 函数尊重每个列的“key”,如果它们与列的名称不同。 - [orm]
修复了一个仅针对 0.4 版本的 bug,该 bug 阻止复合列与继承映射器正常工作
参考:#1199 - [orm]
修复了 mapper 中的 RLock 相关 bug,该 bug 在重新进入 mapper compile() 调用时可能导致死锁,当使用 ForeignKey 对象内部的声明性构造时会发生这种情况。从 0.5 移植。 - [orm]
修复了复合类型中的 bug,该 bug 阻止了主键复合类型的变异。
参考:#1213 - [orm]
添加了 ScopedSession.is_active 访问器。
参考:#976 - [orm]
类绑定访问器可以用作 relation() 的 order_by 参数。
参考:#939 - [orm]
修复了 ShardedSession.execute() 上的 shard_id 参数。
参考:#1072
sql
- [sql]
Connection.invalidate() 检查关闭状态以避免属性错误。
参考:#1246 - [sql]
NullPool 支持失败时重新连接的行为。
参考:#1094 - [sql]
TypeEngine 使用的每种方言缓存现在是一个 WeakKeyDictionary。这样可以防止方言对象被永久引用,对于创建任意数量的引擎或方言的应用程序来说,这是必要的。这会有一点性能损失,将在 0.6 中解决。
参考:#1299 - [sql]
修复了 SQLite 反��方法,以便检测到不存在的 cursor.description,触发自动关闭游标,以便在最近版本的 pysqlite 上不会因为调用 fetchone() 时没有行而失败,后者在没有结果时会引发错误。
mysql
- [mysql]
修复了在反射期间未出现 FK 列时引发异常的 bug。
参考:#1241
oracle
- [oracle]
修复了阻止接收某些类型的 out 参数的 bug;非常感谢 huddlej at wwu.edu!
参考:#1265
杂项
- [无标签]
现在 mapper 添加的 “init” 触发器/装饰器尝试精确复制原始 init 的参数签名。对于 ‘_sa_session’ 的传递不再是隐式的-您必须在构造函数中允许此关键字参数。 - [无标签]
ClassState 已更名为 ClassManager。 - [无标签]
类可以通过提供 sa_instrumentation_manager 属性来提供自己的 InstrumentationManager。 - [无标签]
自定义仪器可以使用任何机制将 ClassManager 与类和 InstanceState 与实例关联起来。这些对象上的属性仍然是 SQLAlchemy 本机仪器使用的默认关联机制。 - [无标签]
从实例对象中移动了 entity_name、_sa_session_id 和 _instance_key 到实例状态。这些值仍然以旧方式可用,现在已弃用,使用附加到类的描述符。在访问时将发出弃用警告。 - [无标签]
_prepare_instrumentation 的别名 prepare_instrumentation 已被移除。 - [无标签]
sqlalchemy.exceptions 已更名为 sqlalchemy.exc。该模块可以使用任一名称导入。 - [无标签]
与 ORM 相关的异常现在在 sqlalchemy.orm.exc 中定义。在导入 sqlalchemy.orm 时,ConcurrentModificationError、FlushError 和 UnmappedColumnError 的兼容性别名将安装在 sqlalchemy.exc 中。 - [无标签]
sqlalchemy.logging 已更名为 sqlalchemy.log。 - [无标签]
过渡性别名 sqlalchemy.log.SADeprecationWarning 用于 sqlalchemy.exc 中警告的定义已被移除。 - [无标签]
exc.AssertionError 已被移除,使用 Python 的内置 AssertionError 替换。 - [无标签]
已更改附加到单个类的多个 entity_name= 主映射器的 MapperExtensions 的行为。为类定义的第一个 mapper() 是唯一符合 MapperExtension ‘instrument_class’、‘init_instance’ 和 ‘init_failed’ 事件的映射器。这是不兼容的;以前定义的最后一个映射器的扩展将接收这些事件。 - [firebird]
添加了从插入(仅限 2.0+)、更新和删除(仅限 2.1+)中返回值的支持。 - [postgres]
添加了对 Postgres 的索引反射支持,使用了长期被忽视的优秀补丁,由 Ken Kuhlman 提交。
参考:#714
一般的
- [一般的]
全局“propigate”->”propagate”更改。
orm
- [orm]
polymorphic_union()函数尊重每个 Column 的“key”,如果它们与列的名称不同。 - [orm]
修复了仅在 0.4 中阻止复合列与继承映射器正常工作的 bug
参考:#1199 - [orm]
修复了 mapper 中与 RLock 相关的 bug,该 bug 可能在重新进入的 mapper compile()调用时发生死锁,这在 ForeignKey 对象内部使用声明性构造时会发生。从 0.5 移植。 - [orm]
修复了组合类型中的错误,该错误阻止了主键组合类型的变异。
参考:#1213 - [orm]
添加了 ScopedSession.is_active 访问器。
参考:#976 - [orm]
类绑定访问器可以用作 relation() order_by 的参数。
参考:#939 - [orm]
修复了 ShardedSession.execute()中的 shard_id 参数。
参考:#1072
sql
- [sql]
Connection.invalidate()检查关闭状态以避免属性错误。
参考:#1246 - [sql]
NullPool 支持失败时重新连接的行为。
参考:#1094 - [sql]
TypeEngine 用于缓存特定于方言的类型的每个方言缓存现在是 WeakKeyDictionary。这是为了防止方言对象被引用,以便为创建任意数量的引擎或方言的应用程序永远存在。这会有一点性能损失,将在 0.6 中解决。
参考:#1299 - [sql]
修复了 SQLite 反射方法,以便检测到不存在的 cursor.description,这会触发自动关闭游标,以便在最近版本的 pysqlite 上调用 fetchone()时不会失败,因为在没有行的情���下会引发错误。
mysql
- [mysql]
修复了在反射期间未出现 FK 列时引发异常的 bug。
参考:#1241
oracle
- [oracle]
修复了一个 bug,该 bug 阻止了某些类型的输出参数被接收;非常感谢 wwu.edu 的 huddlej!
参考:#1265
杂项
- [无标签]
mapper 添加的“init”触发器/装饰器现在尝试精确地模仿原始 init 的参数签名。对于‘_sa_session’的传递不再是隐式的-您必须在构造函数中允许此关键字参数。 - [无标签]
ClassState 重命名为 ClassManager。 - [无标签]
类可以通过提供 sa_instrumentation_manager 属性来提供自己的 InstrumentationManager。 - [无标签]
自定义仪器可以使用任何机制将 ClassManager 与类关联,将 InstanceState 与实例关联。这些对象上的属性仍然是 SQLAlchemy 原生仪器使用的默认关联机制。 - [no_tags]
将 entity_name、_sa_session_id 和 _instance_key 从实例对象移动到实例状态。这些值仍然可以以旧方式访问,但现在已被弃用,使用附加到类的描述符。访问时将发出弃用警告。 - [no_tags]
_prepare_instrumentation 的别名 prepare_instrumentation 已被移除。 - [no_tags]
sqlalchemy.exceptions 已重命名为 sqlalchemy.exc。该模块可以使用任一名称导入。 - [no_tags]
ORM 相关的异常现在在 sqlalchemy.orm.exc 中定义。在导入 sqlalchemy.orm 时,会在 sqlalchemy.exc 中安装 ConcurrentModificationError、FlushError 和 UnmappedColumnError 的兼容别名。 - [no_tags]
sqlalchemy.logging 已重命名为 sqlalchemy.log。 - [no_tags]
过渡性的 sqlalchemy.log.SADeprecationWarning 别名已被移除。 - [no_tags]
exc.AssertionError 已被移除,使用被 Python 内置的 AssertionError 替代。 - [no_tags]
对于一个类的多个 entity_name= 主映射器附加的 MapperExtensions 的行为已更改。为一个类定义的第一个 mapper() 是唯一符合 MapperExtension ‘instrument_class’、‘init_instance’ 和 ‘init_failed’ 事件的映射器。这是不兼容的;以前定义的最后一个映射器的扩展将接收这些事件。 - [firebird]
增加了对插入(仅限 2.0+)、更新和删除(仅限 2.1+)返回值的支持。 - [postgres]
添加了对 Postgres 的索引反射支持,使用了 Ken Kuhlman 提交的长期被忽视的优秀补丁。
参考:#714