SqlAlchemy 2.0 中文文档(六十九)(1)https://developer.aliyun.com/article/1560782
0.4.0
发布日期:2007 年 10 月 17 日 星期三
- [no_tags]
(请查看 0.4.0beta1,了解针对 0.3 的重大更改的开始,以及www.sqlalchemy.org/trac/wiki/WhatsNewIn04
) - [no_tags]
增加了对 Sybase 的初始支持(目前仅限于 mxODBC)
参考:#785 - [no_tags]
为 PostgreSQL 添加了部分索引支持。在索引上使用 postgres_where 关键字。 - [no_tags]
基于字符串的查询参数解析/配置文件解析现在可以理解更广泛范围的布尔值字符串
参考:#817 - [no_tags]
如果另一侧集合不包含项目,则 backref 删除对象操作不会失败,支持 noload 集合
参考:#813 - [no_tags]
从“dynamic”集合中删除了 len,因为这将需要发出 SQL “count()” 操作,从而迫使所有列表评估发出冗余的 SQL
参考:#818 - [no_tags]
对 locate_dirty() 进行了内联优化,可以大大加快对 flush() 的重复调用,如在 autoflush=True 的情况下发生的情况
参考:#816 - [no_tags]
IdentifierPreprarer 的 _requires_quotes 测试现在基于正则表达式。任何提供自定义合法字符集或非法初始字符集的 out-of-tree 方言都需要转移到正则表达式或覆盖 _requires_quotes。 - [no_tags]
Firebird 由于 ticket #370(正确方式)而将 supports_sane_rowcount 和 supports_sane_multi_rowcount 设置为 False。 - [no_tags]Firebird 反射的改进和修复:
- FBDialect 现在模仿 OracleDialect,关于 TABLE 和 COLUMN 名称的大小写敏感性(请参见本文件中的“case_sensitive remotion”主题)。
- FBDialect.table_names()不会带来系统表(票号:796)。
- FB 现在正确反映了 Column 的 nullable 属性。
- [无标签]
修复了 SQL 编译器对顶级列标签的意识,用于结果集处理;包含相同列名的嵌套选择不会影响结果或与结果列元数据冲突。 - [无标签]
query.get()和相关函数(如一对多的延迟加载)使用编译时别名绑定参数名称,以防止与已存在于映射可选择项中的绑定参数名称发生名称冲突。 - [无标签]
修复了三级和多级选择以及延迟继承加载(即没有选择表的 abc 继承)。
参考:#795 - [无标签]
在 shard.py 中传递给 id_chooser 的 Ident 始终是一个列表。 - [无标签]
无参数 ResultProxy._row_processor()现在是类属性 _process_row。 - [无标签]
增加了对从 PostgreSQL 8.2+插入和更新返回值的支持。
参考:#797 - [无标签]
PG 反射,在看到默认模式名称明确用作表中的“模式”参数时,将假定这是用户期望的约定��并将在外键相关的反射表中明确设置“模式”参数,从而使它们仅与也使用显式“模式”参数的 Table 构造函数匹配(即使其为默认模式)。换句话说,SA 假定用户在此使用中是一致的。 - [无标签]
修复了 BOOL/BOOLEAN 的 sqlite 反射。
参考:#808 - [无标签]
增加了对在 mysql 上使用 LIMIT 进行 UPDATE 的支持。 - [无标签]
m2o 上的空外键不会触发延迟加载。
参考:#803 - [无标签]
Oracle 不会隐式地将非类型化结果集转换为 unicode(即,当没有使用 TypeEngine/String/Unicode 类型时;以前它会检测 DBAPI 类型并进行转换)。应该修复
参考:#800 - [无标签]
修复了长表/列名称的匿名标签生成问题。
参考:#806 - [无标签]
Firebird 方言现在使用 SingletonThreadPool 作为 poolclass。 - [无标签]
Firebird 现在使用 dialect.preparer 来格式化序列名称。 - [无标签]
修复了与 postgres 和多个两阶段事务的中断。两阶段提交和回滚不会像通常的 dbapi 提交/回滚那样自动结束一个新事务。
参考:#810 - [无标签]
向 _ScopedExt 映射器扩展添加了一个选项,以便在对象初始化时不自动将新对象保存到会话中。 - [无标签]
修复了 Oracle 非 ANSI 连接语法 - [无标签]
PickleType 和 Interval 类型(在不支持它的数据库上)现在略微更快。 - [无标签]
在 Firebird 中添加了 Float 和 Time 类型(FBFloat 和 FBTime)。修复了 TEXT 和 Binary 类型的 BLOB SUB_TYPE。 - [无标签]
更改了 in_ 运算符的 API。in_() 现在接受一个作为值序列或可选择的单个参数。传递值作为可变参数的旧 API 仍然有效,但已被弃用。
0.4.0beta6
发布日期:Thu Sep 27 2007
- [无标签]
会话标识映射现在默认为弱引用,使用 weak_identity_map=False 来使用常规字典。我们使用的弱字典被定制为检测“脏”实例,并保持对这些实例的临时强引用,直到更改被刷新。 - [无标签]
Mapper 编译已重新组织,大部分编译发生在 mapper 构造时。这使我们可以减少对 mapper.compile() 的调用,并且允许基于类的属性强制进行编译(即 User.addresses == 7 将编译所有映射器;这是)。唯一的注意事项是,继承映射器现在在构造时寻找其继承的映射器;因此,继承关系中的映射器需要按照继承顺序进行构造(这应该是正常情况)。
参考:#758 - [无标签]
在 Postgres 中添加了“FETCH”关键字,用于指示结果行保持语句(即除了“SELECT”之外)。 - [无标签]
添加了 SQLite 保留关键字的完整列表,以便正确转义它们。 - [无标签]
加强了 Query 生成“eager load” 别名与 Query.instances() 之间的关系,Query.instances() 实际上获取了急切加载的行。如果别名不是由 EagerLoader 专门为该语句生成的,则在获取行时 EagerLoader 将不起作用。这可以防止意外地抓取列作为急切加载的一部分,当它们不是为此目的而设计时,这可能会发生在文本 SQL 以及一些继承情况下。这一点尤为重要,因为“匿名别名”现在使用简单的整数计数来生成标签。 - [无标签]
从 clauseelement.compile() 中移除了“parameters”参数,替换为“column_keys”。传递给 execute() 的参数仅与插入/更新语句的编译过程中存在的列名交互,而不涉及这些列的值。产生更一致的 execute/executemany 行为,内部稍微简化了一些事情。 - [无标签]
在 PickleType 中添加了 ‘comparator’ 关键字参数。默认情况下,“mutable” PickleType 使用它们的 dumps() 表示进行对象的“深度比较”。但这对于字典不起作用。提供了足够 eq() 实现的 Pickled 对象可以设置为 “PickleType(comparator=operator.eq)”
参考资料:#560 - [无标签]
添加了 session.is_modified(obj) 方法;执行与刷新操作中发生的“历史”比较操作相同;设置 include_collections=False 将得到与刷新确定是否为实例的行发出 UPDATE 相同的结果。 - [无标签]
向 Sequence 添加了“schema”参数;当序列位于备用模式中时,与 Postgres /Oracle 一起使用。实现部分内容,应该修复。
参考资料:#584, #761 - [无标签]
修复了 mysql 枚举类型的空字符串反射问题。 - [无标签]
将 MySQL 方言更改为使用旧的 LIMIT , 语法,而不是 LIMIT OFFSET ,适用于使用 3.23 版本的用户。
参考资料:#794 - [无标签]
向 relation() 添加了 ‘passive_deletes=”all”’ 标志;在删除父对象时禁用所有外键属性的置空。 - [无标签]
执行内联的列默认值和 onupdates 将为子查询和其他需要括号的表达式添加括号 - [无标签]
现在关于 String/Unicode 类型的行为是,只有在没有长度的情况下才会自动转换为 TEXT/CLOB 类型,仅适用于没有参数的确切类型的 String 或 Unicode。如果您使用没有长度的 VARCHAR 或 NCHAR(String/Unicode 的子类),它们将被方言解释为 VARCHAR/NCHAR;这里不会发生“神奇”的转换。这是更少令人惊讶的行为,特别是这有助于 Oracle 将基于字符串的绑定参数保持为 VARCHAR,而不是 CLOB。
参考资料:#793 - [无标签]
对 ShardedSession 进行了修复,以使其与延迟列一起工作。
参考资料:#771 - [无标签]
用户定义的 shard_chooser() 函数必须接受“clause=None”参数;这是传递给 session.execute(statement) 的 ClauseElement,并且可以用于确定正确的分片 id(因为 execute() 不接受实例)。 - [无标签]
调整了 NOT 运算符的优先级,以匹配‘’和其他运算符,因此~(x y)会产生 NOT (x y),这与旧版 MySQL 更兼容。这不适用于“~(xy)”,因为在 0.3 版本中像这样的表达式 ~(x==y) 会被编译成 “x != y”,但仍适用于像 BETWEEN 这样的运算符。
参考资料:#764 - [无标签]
其他票据:,.
参考资料:#728, #757, #768, #779
0.4.0beta5
无发布日期
- [无标签]
连接池修复;beta4 版本的更好性能仍然存在,但修复了“连接溢出”和其他存在的 bug(如)。
参考:#754 - [无标签]
修复了从自定义继承条件中确定适当同步子句的错误。
参考:#769 - [无标签]
对于 QueuePool 大小/溢出,扩展了’engine_from_config’的转换。
参考:#763 - [无标签]
mysql 视图现在可以反射了。
参考:#748 - [无标签]
AssociationProxy 现在可以使用自定义的 getter 和 setter。 - [无标签]
修复了 orm 查询中 BETWEEN 的失效。 - [无标签]
修复了 OrderedProperties 的 pickling 问题。
参考:#762 - [无标签]
SQL 表达式的默认值和序列现在在 INSERT 或 UPDATE 期间对所有非主键列执行“内联”操作,并在 executemany()样式的调用期间对所有列执行。任何 insert/update 语句上的 inline=True 标志也会强制执行相同的行为,即单个 execute()。result.postfetch_cols()是之前的单个 insert 或 update 语句中包含 SQL 端默认表达式的列的集合。 - [无标签]
修复了 PG executemany()的行为。
参考:#759 - [无标签]
postgres 针对没有默认值的主键列的表反射自动增量=False。 - [无标签]
postgres 现在不再用单独的 execute()调用包装 executemany(),而是更偏向性能。在 PG 上,使用 executemany()的“rowcount”/“concurrency”检查与删除项目(使用 executemany)被禁用,因为 psycopg2 不会报告 executemany()的正确 rowcount。 - [修复] [票务]
参考:#742 - [修复] [票务]
参考:#748 - [修复] [票务]
参考:#760 - [修复] [票务]
参考:#762 - [修复] [票务]
参考:#763
0.4.0beta4
发布日期:2007 年 8 月 22 日(星期三)
- [无标签]
当您从 SQLAlchemy 导入*时,整理了您的命名空间中的内容: - [无标签]
‘table’和’column’不再被导入。它们仍可通过直接引用(如’sql.table’和’sql.column’)或从 sql 包进行全局导入使用。在刚开始使用 SQLAlchemy 时,意外使用 sql.expressions.table 而不是 schema.Table 变得太容易了,同样的情况也出现在 column 中。 - [无标签]
类似 ClauseElement、FromClause、NullTypeEngine 等的内部类也不再被导入到您的命名空间中。 - [无标签]
'Smallinteger’兼容名称(小 i!)不再被导入,但暂时仍保留在 schema.py 中。SmallInteger(大 I!)仍然被导入。 - [无标签]
连接池在内部使用“threadlocal”策略,以返回已绑定到线程的相同连接,用于“上下文”连接;这些连接在执行“无连接”操作时使用,比如 insert().execute()。这类似于“threadlocal”引擎策略的“部分”版本,但没有其中的线程本地事务部分。我们希望它减少连接池开销以及数据库使用。但是,如果证明对稳定性产生负面影响,我们将立即撤销。 - [无标签]
修复了绑定参数处理,使得“False”值(如空字符串)仍然会被处理/编码。 - [无标签]
修复了 select()的“生成”行为,使得调用 column()、select_from()、correlate()和 with_prefix()不会修改原始 select 对象
参考:#752 - [无标签]
添加了一个“legacy”适配器到 types,使得用户定义的 TypeEngine 和 TypeDecorator 类,定义了 convert_bind_param()和/或 convert_result_value()的仍然可以正常工作。还支持调用这些方法的 super()版本。 - [无标签]
添加了 session.prune(),修剪会话中不再在其他地方引用的实例。 (用于强引用标识映射的实用程序)。 - [无标签]
向 Transaction 添加了 close()方法。如果是最外层事务,则使用回滚结束事务,否则仅结束而不影响外部事务。 - [无标签]
事务性和非事务性 Session 与绑定连接更好地集成;close()将确保连接的事务状态与绑定到 Session 之前的状态相同。 - [无标签]
修改了 SQL 操作函数为模块级操作符,允许 SQL 表达式可被 pickle 化。
参考:#735 - [无标签]
对 mapper 类的 init 进行小调整,以允许 Py2.6 对象的 init()行为。 - [无标签]
修复了 select()的‘prefix’参数 - [无标签]
Connection.begin()不再接受 nested=True,这个逻辑现在都在 begin_nested()中。 - [无标签]
修复了涉及级联的新“动态”关系加载器的问题 - [修复] [票务]
参考:#735 - [修复] [票务]
参考:#752
0.4.0beta3
发布日期:Thu Aug 16 2007
- [无标签]
SQL 类型优化: - [无标签]
新的性能测试显示,与 0.3 版本相比,组合的大规模插入/大规模选择测试的函数调用减少了 68%。 - [无标签]
结果集迭代的一般性能提升约为 10-20%。 - [无标签]
在 types.AbstractType 中,convert_bind_param()和 convert_result_value()已迁移到返回可调用的 bind_processor()和 result_processor()方法。如果没有返回可调用对象,则不会调用任何预处理/后处理函数。 - [无标签]
在 base/sql/defaults 中添加了钩子以优化绑定参数/结果处理器的调用,以便最小化方法调用开销。 - [无标签]
支持添加了对 executemany()场景的支持,以便不需要的“最后一行 id”逻辑不会触发,参数不会被过度遍历。 - [无标签]
添加了‘inherit_foreign_keys’参数到 mapper()。 - [无标签]
添加了对 sqlite 中字符串日期传递的支持。 - [修复] [票务]
参考:#738 - [修复] [票务]
参考:#739 - [修复] [票务]
参考:#743 - [修复] [票务]
参考:#744
0.4.0beta2
发布日期:2007 年 8 月 14 日星期二
oracle
- [oracle] [改进]
在 mysql 中 LOAD DATA INFILE 后自动提交。 - [oracle] [改进]
添加了一个基本的 SessionExtension 类,允许在 flush()、commit()和 rollback()边界处发生用户定义的功能。 - [oracle] [改进]
添加了 engine_from_config()函数,以帮助从.ini 样式配置创建 engine()。 - [oracle] [改进]
base_mapper()变成了一个普通属性。 - [oracle] [改进]
session.execute()和 scalar()可以通过给定的 ClauseElement 搜索要绑定的表。 - [oracle] [改进]
会话自动从具有绑定的映射器中推断表,还使用 base_mapper,以便继承层次结构自动绑定。 - [oracle] [改进]
将 ClauseVisitor 遍历移回到内联的非递归方式。
杂项
0.4.0beta1
发布日期:2007 年 8 月 12 日星期日
orm
- [orm]
速度!除了对 ResultProxy 的最近加速,对于大量加载,函数调用总数显著减少。 - [orm]
test/perf/masseagerload.py 报告 0.4 版本在所有 SA 版本(0.1、0.2 和 0.3)中具有最少的函数调用次数。 - [orm]
新的 collection_class api 和实现。现在通过装饰而不是代理来检测集合。现在可以有管理自己成员资格的集合,并且您的类实例将直接暴露在关系属性上。对于大多数用户来说,这些更改是透明的。
参考:#213 - [orm]
InstrumentedList(如之前)已被移除,关系属性不再具有‘clear()’、‘.data’或任何其他除集合类型提供的方法。当然,您可以将它们添加到自定义类中。 - [orm]
类似 setitem 的赋值现在会为现有值触发删除事件,如果有的话。 - [orm]
作为集合类使用的类似字典的对象不再需要更改 iter 语义- 默认使用 itervalues()。这是一个不兼容的变更。 - [orm]
在大多数情况下,不再需要为映射集合子类化 dict。orm.collections 提供了按指定列或自定义函数键入对象的预制实现。 - [orm]
现在集合赋值需要兼容的类型- 将 None 赋给一个集合以清空它,或将列表赋给一个字典集合将会引发参数错误。 - [orm]
AttributeExtension 移至接口,并且 .delete 现在是 .remove 事件方法签名也已经���换。 - [orm]
Query 进行了重大改进: - [orm]
所有 selectXXX 方法已被弃用。生成方法现在是执行操作的标准方式,即 filter()、filter_by()、all()、one() 等。弃用的方法在其新替代品的文档字符串中有说明。 - [orm]
现在可以将类级属性用作查询元素… 不再需要 ‘.c.’!“Class.c.propname” 现在被 “Class.propname” 取代。支持所有子句操作符,以及更高级别的操作符,如 Class.prop== 用于标量属性,Class.prop.contains() 和 Class.prop.any() 用于基于集合的属性(所有这些也是可否定的)。当然,基于表的列表达式以及通过 ‘c’ 挂载在映射类上的列仍然完全可用,并且可以与新属性自由混合。
参考:#643 - [orm]
移除了古老的 query.select_by_attributename() 功能。 - [orm]急加载使用的别名逻辑已经泛化,因此还为 Query 添加了完全自动的别名支持。不再需要为多次连接到相同表创建显式别名;即使是自引用关系也是如此。
- join() 和 outerjoin() 接受参数 “aliased=True”。这将导致它们的连接建立在别名表上;随后调用 filter() 和 filter_by() 将会将所有表达式(是的,使用原始映射表的真实表达式)转换为别名的表达式,直到该 join() 结束(即重置 joinpoint() 或调用另一个 join())。
- join() 和 outerjoin() 接受参数 “id=”。当与 “aliased=True” 一起使用时,可以通过 add_entity(cls, id=) 引用 id,以便在从别名获取的情况下选择连接的实例。
- join() 和 outerjoin() 现在可以用于自引用关系!使用 “aliased=True”,可以连接到任意深度的级别,例如 query.join([‘children’, ‘children’], aliased=True);过滤条件将针对最右侧连接的表
- [orm]
添加了 query.populate_existing(),标记查询以重新加载查询中触及的所有实例的所有属性和集合,包括急加载的实体。
参考:#660 - [orm]
添加了 eagerload_all(),允许 eagerload_all(‘x.y.z’)指定给定路径中所有属性的急加载。 - [orm]
会话的重大改进: - [orm]
新功能“配置”一个名为“sessionmaker()”的会话。一次向该函数发送各种关键字参数,返回一个新类,该类针对该模式创建一个会话。 - [orm]
从“public”API 中移除了 SessionTransaction。现在可以在 Session 本身上调用 begin()/commit()/rollback()。 - [orm]
会话还支持 SAVEPOINT 事务;调用 begin_nested()。 - [orm]
当垂直或水平分区(即,使用多个引擎)时,会话支持两阶段提交行为。使用 twophase=True。 - [orm]
会话标志“transactional=True”会产生一个会话,当首次使用时总是将自身置于事务中。在 commit()、rollback()或 close()时,事务结束;但在下一次使用时重新开始。 - [orm]
会话支持“autoflush=True”。这会在每次查询之前发出一个 flush()。与 transactional 一起使用,您可以只保存()/更新()然后查询,新对象将在那里。在最后使用 commit()(或 flush()如果非事务性)来刷新剩余的更改。 - [orm]
新的 scoped_session()函数取代了 SessionContext 和 assignmapper。构建在“sessionmaker()”概念之上,以产生一个类,其 Session()构造返回线程本地会话。或者,将所有 Session 方法作为类方法调用,即 Session.save(foo); Session.commit()。就像旧的“objectstore”时代一样。 - [orm]
添加了新的“binds”参数到 Session,以支持使用 sessionmaker()函数配置多个绑定。 - [orm]
添加了一个基本的 SessionExtension 类,允许在 flush()、commit()和 rollback()边界发生时进行用户定义的功能。 - [orm]
基于查询的 relation()可通过 dynamic_loader()使用。这是一个writable集合(支持 append()和 remove()),当用于读取时也是一个活动的 Query 对象。适用于处理仅希望部分加载的非常大的集合。 - [orm]
flush()-嵌入式的内联 INSERT/UPDATE 表达式。将任何 SQL 表达式,如“sometable.c.column + 1”,分配给实例的属性。在 flush()时,映射器检测到表达式并直接嵌入到 INSERT 或 UPDATE 语句中;属性在实例上被延迟,因此在下次访问时加载新值。 - [orm]
引入了一个基本的分片(水平扩展)系统。该系统使用修改后的 Session,可以根据用户定义的“分片策略”分发读取和写入操作到多个数据库。实例及其依赖项可以根据属性值、轮询方法或任何其他用户定义的系统分布和查询到多个数据库。
参考:#618 - [orm]
急切加载已经增强,允许更多的连接在更多的地方。现在它可以在自引用和循环结构的任意深度处运行。在加载循环结构时,在 relation()上指定“join_depth”,指示您希望表自连接多少次;每个级别都会得到一个不同的表别名。别名名称现在是在编译时使用简单的计数方案生成的,更容易阅读,当然完全确定性。
参考:#659 - [orm]
添加了复合列属性。这允许您创建一个由多个列表示的类型,当使用 ORM 时。新类型的对象在查询表达式、比较、query.get()子句等方面都是完全功能的,并且表现得就像是常规的单列标量…除了它们不是!在映射器的“属性”字典中使用函数 composite(cls, columns),并且 cls 的实例将被创建/映射到一个单属性,由对应于columns 的值组成。
参考:#211 - [orm]
对具有相关子查询的自定义 column_property()属性的支持得到了改进,现在与急切加载更好地配合。 - [orm]
主键“折叠”行为;映射器将分析其给定可选择的所有列,以获取主键“等效性”,即通过外键关系或显式继承条件等方式等效的列。主要用于联合表继承场景,其中继承表中的不同命名 PK 列应“折叠”为单值(或更少值)主键。修复了诸如此类的问题。
参考:#611 - [orm]
联合表继承现在将所有继承类的主键列生成到联接的根表中。这意味着根表中的每一行对应一个实例。如果出于某种罕见原因不希望这样,单独映射器上的显式 primary_key 设置将覆盖它。 - [orm]
当“多态”标志与联合表或单表继承一起使用时,所有标识键都针对继承层次结构的根类生成;这允许查询.get()以与非多态 get 相同的缓存语义多态工作。请注意,这目前不适用于具体继承。 - [orm]
次要继承加载:可以构建多态映射器而不需要 select_table 参数。继承映射器的表在初始加载中没有被表示,将立即发出第二个 SQL 查询,每个实例一次(对于大型列表来说效率不高),以加载剩余的列。 - [orm]
次要继承加载也可以将其第二个查询移动到列级“延迟”加载中,通过“polymorphic_fetch”参数,可以设置为“select”或“deferred”。 - [orm]
现在可以仅将可选择的列的子集映射到映射器属性中,使用 include_columns/exclude_columns。
参考:#696 - [orm]
添加了 undefer_group() MapperOption,设置一组由“group”连接的“延迟”列以作为“未延迟”加载。 - [orm]
重写了“确定性别名”逻辑,使其成为 SQL 层的一部分,生成更简单的别名和标签名称,更符合 Hibernate 的风格
sql
- [sql]
速度!子句编译以及 SQL 构造的机制已经被简化和简化到一个显著程度,使语句构造/编译的开销减少了 20-30%,为 0.3。 - [sql]
所有“type”关键字参数,如 bindparam()、column()、Column()和 func.(),都重命名为“type_”。这些对象仍然将它们的“type”属性命名为“type”。 - [sql]
从模式项中移除了 case_sensitive=(True|False)设置,因为检查这种状态会增加很多方法调用开销,而且从来没有一个合理的理由将其设置为 False。所有小写的表名和列名都将被视为不区分大小写(是的,我们也适应了 Oracle 的大写风格)。
extensions
- [extensions]
proxyengine 暂时移除,等待一个真正有效的替代品。 - [extensions]
SelectResults 已被 Query 取代。SelectResults / SelectResultsExt 仍然存在,但只是返回一个稍微修改的 Query 对象以保持向后兼容性。SelectResults 的 join_to()方法不再存在,需要使用 join()。
mysql
- [mysql]
通过反射加载的表名和列名现在都是 Unicode。 - [mysql]
现在支持所有标准列类型,包括 SET。 - [mysql]
表反射现在可以在一次往返中执行。 - [mysql]
现在支持 ANSI 和 ANSI_QUOTES SQL 模式。 - [mysql]
现在反映了索引。
oracle
- [oracle]
添加了对 OUT 参数的非常基本的支持;使用 sql.outparam(name, type)设置一个 OUT 参数,就像 bindparam()一样;执行后,值可以通过 result.out_parameters 字典获得。
参考:#507
杂项
- [transactions]
为事务添加了上下文管理器(with 语句)支持。 - [transactions]
添加了对两阶段提交的支持,目前与 mysql 和 postgres 一起使用。 - [transactions]
添加了一个使用保存点的子事务实现。 - [事务]
添加了保存点的支持。 - [元数据]
可以从数据库中一次性反射出表,而不需要预先声明它们。MetaData(engine, reflect=True) 将加载数据库中存在的所有表,或者使用 metadata.reflect() 进行更精细的控制。 - [元数据]
DynamicMetaData 已重命名为 ThreadLocalMetaData - [元数据]
ThreadLocalMetaData 构造函数现在不接受参数。 - [元数据]
BoundMetaData 已被移除,常规 MetaData 是等效的。 - [元数据]
数字和浮点类型现在有一个“asdecimal”标志;对于 Numeric,默认值为 True,对于 Float,默认值为 False。当为 True 时,值以 decimal.Decimal 对象返回;当为 False 时,值以 float() 返回。True/False 的默认值已经是 PG 和 MySQL 的 DBAPI 模块的行为。
参考:#646 - [元数据]
新的 SQL 运算符实现将所有硬编码的运算符从表达式结构中移除,并将它们移入编译中;允许更大灵活性的运算符编译;例如,在字符串上下文中,“+” 编译为“||”,在 MySQL 上则编译为“concat(a,b)”;而在数值上下文中,它编译为“+”。修复。
参考:#475 - [元数据]
“匿名”别名和标签名称现在以完全确定性的方式在 SQL 编译时生成……不再是随机的十六进制 ID - [元数据]
对 SQL 元素(ClauseElement)进行了重大的架构改造。所有元素共享一个通用的“可变性”框架,允许对元素进行一致的原地修改以及生成行为。改进了 ORM 的稳定性,ORM 对 SQL 表达式的变异使用频繁。 - [元数据]
select() 和 union() 现在具有“生成”行为。order_by() 和 group_by() 等方法返回一个 新 实例——原始实例保持不变。非生成方法也保留不变。 - [元数据]
select/union 的内部大大简化——所有关于“是否为子查询”和“关联性”的决策都推迟到 SQL 生成阶段。select() 元素现在永远不会被其包含的容器或任何方言的编译过程修改。
参考:#52,#569 - [元数据]
select(scalar=True) 参数已弃用;使用 select(…).as_scalar()。生成的对象遵循完整的“列”接口,并在表达式中表现更好。 - [元数据]
添加了 select().with_prefix(‘foo’),允许在 SELECT 的列子句之前放置任何一组关键字。
参考:#504 - [元数据]
添加了对行[]的数组切片支持。
参考:#686 - [元数据]
结果集将更好地尝试将游标描述中存在的 DBAPI 类型与方言定义的 TypeEngine 对象进行匹配,然后用于结果处理。请注意,这仅对文本 SQL 生效;构造的 SQL 语句始终具有显式类型映射。 - [metadata]
CRUD 操作的结果集立即关闭其底层游标,并且如果为操作定义了自动关闭连接,则也将自动关闭连接;这允许更有效地使用连接进行连续的 CRUD 操作,减少“悬挂连接”的机会。 - [metadata]
列默认值和 onupdate Python 函数(即传递给 ColumnDefault 的函数)可以接受零个或一个参数;一个参数是 ExecutionContext,您可以从中调用“context.parameters[someparam]”来访问附加到语句的其他绑定参数值。所使用的连接也可用,以便您可以预执行语句。
参考:#559 - [metadata]
为序列(即你可以在 Sequence 的每个方法上传递一个“connectable”来支持“显式”创建/删除/执行)添加了“显式”创建/删除/执行的支持。 - [metadata]
在操纵模式标识符时更好地引用标识符。 - [metadata]
标准化了表反射的行为,当无法定位类型时,将替换为 NullType,并发出警告。 - [metadata]
ColumnCollection(即表上的‘c’属性)遵循“contains”的字典语义。
参考:#606 - [engines]
速度!结果处理和绑定参数处理的机制已进行了彻底的改进、简化和优化,以尽可能少地发出方法调用。大量 INSERT 和大量行集迭代的基准测试显示,0.4 的速度是 0.3 的两倍多,使用的函数调用减少了 68%。 - [engines]
您现在可以钩入池的生命周期,并在每次新的 DBAPI 连接、池检出和检入时运行 SQL 语句或其他逻辑。 - [engines]
连接增加了 .properties 集合,其中的内容限定为底层 DBAPI 连接的生命周期 - [engines]
从 Pool 中删除了 auto_close_cursors 和 disallow_open_cursors 参数;由于游标通常由 ResultProxy 和 Connection 关闭,因此减少了开销。 - [postgres]
添加了 PGArray 数据类型,用于使用 postgres 数组数据类型。
0.4.8
发布日期:Sun Oct 12 2008
orm
- [orm]
修复了与传递的 inherit_condition 中的“A=B”与“B=A”导致错误的错误。
参考:#1039 - [orm]
在 SessionExtension.before_flush() 中对新的、脏的和已删除的集合所做的更改将在该次 flush 中生效。 - [orm]
在 InstrumentedAttribute 中添加了 label() 方法,以确立与 0.5 的前向兼容性。
sql
- [sql]
column.in_(someselect) 现在可以作为列子句表达式使用,而不会使子查询蔓延到 FROM 子句中
参考:#1074
mysql
- [mysql]
添加了 MSMediumInteger 类型。
参考:#1146
sqlite
- [sqlite]
提供了一个自定义的 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
orm
- [orm]
修复了关于 inherit_condition 传递“A=B”与“B=A”导致错误的 bug
参考:#1039 - [orm]
在 SessionExtension.before_flush() 中对新的、脏的和已删除的集合所做的更改将对该刷新生效。 - [orm]
在 InstrumentedAttribute 中添加了 label() 方法,以确立与 0.5 的向前兼容性。
sql
- [sql]
column.in_(someselect) 现在可以作为一个列子句表达式使用,而不会导致子查询泄漏到 FROM 子句中
参考:#1074
mysql
- [mysql]
添加了 MSMediumInteger 类型。
参考:#1146
sqlite
- [sqlite]
提供了一个自定义的 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
0.4.7p1
发布日期:Thu Jul 31 2008
orm
- [orm]
在 scoped_session 方法中添加了“add()”和“add_all()”。0.4.7 的解决方法:
from sqlalchemy.orm.scoping import ScopedSession, instrument setattr(ScopedSession, "add", instrument("add")) setattr(ScopedSession, "add_all", instrument("add_all")) • 1 • 2 • 3 • 4
- [orm]
修复了在 relation() 内部使用非 2.3 兼容的 set() 和生成器表达式的问题。
orm
- [orm]
在 scoped_session 方法中添加了“add()”和“add_all()”。0.4.7 的解决方法:
from sqlalchemy.orm.scoping import ScopedSession, instrument setattr(ScopedSession, "add", instrument("add")) setattr(ScopedSession, "add_all", instrument("add_all")) • 1 • 2 • 3 • 4
- [orm]
修复了在 relation() 内部使用非 2.3 兼容的 set() 和生成器表达式的问题。
0.4.7
发布日期:Sat Jul 26 2008
orm
- [orm]
当与多对多一起使用时,contains() 操作符会对次要(关联)表进行别名处理,以便多个 contains() 调用不会互相冲突
参考:#1058 - [orm]
修复了阻止 merge() 与 comparable_property() 结合使用的错误 - [orm]
现在在 relation() 上设置 enable_typechecks=False 只允许具有继承映射器的子类型。完全不相关的类型,或者未设置为针对目标映射器进行映射器���承的子类型仍然不被允许。 - [orm]
向 Sessions 添加了 is_active 标志以检测事务是否正在进行中。该标志在“transactional”(在 0.5 版本中为非“自动提交”)会话中始终为 True。
参考:#976
sql
- [sql]
修复了调用 select([literal(‘foo’)]) 或 select([bindparam(‘foo’)]) 时的错误。
模式
- [模式]
create_all()、drop_all()、create()、drop() 如果表名或模式名包含的字符数超过该方言配置的字符限制,则会引发错误。一些数据库可以在使用过程中处理过长的表名,SQLA 也可以处理这种情况。但是由于我们正在查找 DB 的目录表中的名称,因此各种反射/在创建期间进行 checkfirst 的场景会失败。
参考:#571 - [模式]
当在 Column 上说“index=True”时生成的索引名称会被截断为适合该方言的长度。此外,具有过长名称的索引不能使用 Index.drop() 明确删除,类似于。
参考:#571,#820
mysql
- [mysql]
将“CALL”添加到返回结果行的 SQL 关键字列表中。
oracle
- [oracle]
Oracle get_default_schema_name() 在返回之前会“规范化”名称,这意味着当检测到标识符不区分大小写时,它会返回一个小写名称。 - [oracle]
创建/删除表时会考虑模式名称,以便在搜索现有表时不会与其他所有者命名空间中具有相同名称的表发生冲突
参考:#709 - [oracle]
游标现在默认情况下的“arraysize”设置为 50,其值可以使用 Oracle 方言的 create_engine() 中的“arraysize”参数进行配置。这是为了考虑 cx_oracle 的默认设置为“1”,这会导致向 Oracle 发送许多往返。这实际上与 BLOB/CLOB 绑定的游标很好地配合使用,其中有任意数量可用,但仅在该行请求的生命周期内(因此仍然需要 BufferedColumnRow,但不那么多)。
参考:#1062 - [oracle]sqlite
- 添加了 SLFloat 类型,与 SQLite REAL 类型亲和。以前只提供了 SLNumeric,它满足 NUMERIC 亲和性,但与 REAL 不同。
杂项
- [postgres]
修复了 server_side_cursors 以正确检测 text() 子句。 - [postgres]
添加了 PGCidr 类型。
参考:#1092
orm
- [orm]
当与多对多一起使用时,contains() 运算符将为次要(关联)表设置别名,以便多个 contains() 调用不会互相冲突。
参考:#1058 - [orm]
修复了阻止 merge() 与 comparable_property() 结合使用的 bug。 - [orm]
relation() 上的 enable_typechecks=False 设置现在只允许具有继承映射器的子类型。完全不相关的类型,或者未设置与目标映射器的映射器继承的子类型仍然不被允许。 - [orm]
在 Sessions 中添加了 is_active 标志,用于检测事务是否正在进行中。当使用“transactional”(在 0.5 版本中是非“autocommit”)会话时,此标志始终为 True。
参考:#976
sql
- [sql]
修复了调用 select([literal(‘foo’)]) 或 select([bindparam(‘foo’)]) 时的 bug。
schema
- [schema]
create_all()、drop_all()、create()、drop() 如果表名或模式名包含的字符数超过该方言配置的字符限制,则会引发错误。一些数据库可以在使用过程中处理过长的表名,SQLA 也可以处理这种情况。但是由于我们正在查找 DB 的目录表中的名称,因此各种反射/在创建期间进行 checkfirst 的场景会失败。
参考:#571 - [schema]
当在 Column 上说“index=True”时生成的索引名称会被截断为适合该方言的长度。此外,具有过长名称的索引无法使用 Index.drop() 明确删除,类��于。
参考:#571, #820
mysql
- [mysql]
将 ‘CALL’ 添加到返回结果行的 SQL 关键字列表中。
oracle
- [oracle]
Oracle 的 get_default_schema_name() 在返回之前会“规范化”名称,这意味着当检测到标识符为大小写不敏感时,它会返回小写名称。 - [oracle]
在搜索现有表时,创建/删除表时会考虑模式名称,以避免与其他所有者命名空间中具有相同名称的表发生冲突。
参考:#709 - [oracle]
游标现在默认情况下具有“arraysize”设置为 50,其值可以使用 Oracle 方言的“arraysize”参数进行配置。这是为了考虑 cx_oracle 的默认设置为“1”,这会导致向 Oracle 发送许多往返。这实际上与 BLOB/CLOB 绑定的游标很好地配合使用,其中有任意数量可用,但仅在该行请求的生命周期内(因此仍然需要 BufferedColumnRow,但不那么需要)。
参考:#1062 - [oracle]sqlite
- 添加了
SLFloat
类型,该类型与 SQLite 的REAL
类型亲和。以前,只提供了SLNumeric
,它满足NUMERIC
亲和性,但这与REAL
不同。
杂项
- [postgres]
修复了server_side_cursors
以正确检测text()
子句。 - [postgres]
添加了PGCidr
类型。
参考:#1092
0.4.6
发布日期:2008 年 5 月 10 日(周六)
orm
- [orm]
修复了最近的relation()
重构,修复了在本地表和远程表之间多次连接的异国viewonly
关系,这些连接在连接之间共享公共列。 - [orm]
还重新建立了跨多个表连接的viewonly relation()
配置。 - [orm]
增加了实验性的relation()
标志,以帮助跨函数等处的primaryjoins
,_local_remote_pairs=[tuples]。这补充了一个复杂的primaryjoin
条件,允许您提供构成关系的本地和远程方的单个列对。还改进了延迟加载 SQL 生成,以处理将绑定参数放置在函数和其他表达式中的情况。(部分进展)
参考:#610 - [orm]
修复了单表继承,使您可以从加入表继承的映射器中单表继承而无需问题。
参考:#1036 - [orm]
修复了“连接元组”错误,该错误可能发生在Query.order_by()
中,如果进行了子句调整。
参考:#1027 - [orm]
移除了古老的断言,即映射的可选择性需要“别名” - 如果没有,则映射器现在会创建自己的别名。尽管在这种情况下,您需要使用类,而不是映射的可选择性,作为列属性的来源 - 因此仍会发出警告。 - [orm]
修复了涉及继承的“exists”函数的问题(any()
,has()
,~contains()
);完整的目标连接将被呈现到用于与子类关联的EXISTS
子句中。 - [orm]
恢复了仅在扩展存在且仅返回单个实体结果时为主查询行添加append_result()
扩展方法的用法。 - [orm]
还重新建立了跨多个表连接的viewonly relation()
配置。 - [orm]
移除了古老的断言,即映射的可选择性需要“别名” - 如果没有,则映射器现在会创建自己的别名。尽管在这种情况下,您需要使用类,而不是映射的可选择性,作为列属性的来源 - 因此仍会发出警告。 - [orm]
优化了mapper._save_obj()
,在flush
期间不必要地调用了标量值的__ne__()
。
参考:#1015 - [orm]
对急加载功能进行了更新,其中使用具有显式标签名称的 column_property() 设置的子查询(顺便说一句,这并不是必要的)在实例作为急加载连接的一部分时,将对标签进行匿名化处理,以防止与父对象上具有相同名称的子查询或列发生冲突。
参考:#1019 - [orm]
集合运算符 |=、-=、^= 和 &= 对其操作数更加严格,只能操作集合、frozensets 或集合类型的子类。以前,它们接受任何鸭子类型的集合。 - [orm]
添加了一个示例 dynamic_dict/dynamic_dict.py,演示了在 dynamic_loader 之上放置字典行为的简单方法。
sql
- [sql]
通过 .collate() 表达式操作符和 collate(, ) sql 函数添加了 COLLATE 支持。 - [sql]
修复了应用于非表连接选择语句的 union() 的错误。 - [sql]
改进了在作为 FROM 子句使用时的 text() 表达式的行为,例如 select().select_from(text(“sometext”))
参考:#1014 - [sql]
Column.copy() 尊重 “autoincrement” 的值,修复了与 Migrate 的使用。
参考:#1021
mssql
- [mssql]
在 engine / dburi 参数中添加了 “odbc_autotranslate” 参数。任何给定的字符串将传递到 ODBC 连接字符串中:
”AutoTranslate=%s” % odbc_autotranslate
- 参考:#1005
- [mssql]
在 engine / dburi 参数中添加了 “odbc_options” 参数。给定的字符串将简单地附加到 SQLAlchemy 生成的 odbc 连接字符串中。
这应该可以避免将来需要添加大量 ODBC 选项的需要。
杂项
- [declarative] [extension]
联合表继承映射器使用稍微放松的函数来创建父表的 “继承条件”,以便对尚未声明的 Table 对象的其他外键不会触发错误。 - [declarative] [extension]
修复了当在 ForeignKey 中使用已声明属性时出现的重入映射器编译挂起的 bug,即 ForeignKey(MyOtherClass.someattribute)。 - [engines]
现在可以将池监听器提供为可调用对象的字典或 PoolListener 的(可能是部分的)鸭子类型,任你选择。 - [engines]
在 Pool 中添加了 “rollback_returned” 选项,该选项将禁用返回连接时发出的 rollback()。此标志仅在不支持事务的数据库(例如 MySQL/MyISAM)中使用时才安全。 - [ext]
集合运算符 |=、-=、^= 和 &= 对其操作数更加严格,只能操作集合、frozensets 或其他关联代理。以前,它们接受任何鸭子类型的集合。 - [firebird]
处理 “SUBSTRING(:string FROM :start FOR :length)” 内建函数。
orm
- [orm]
修复了最近 relation() 重构中的问题,修复了在本地表和远程表之间多次进行连接的特殊视图只读关系,并且这些连接之间有一个共享列的情况。 - [orm]
同时重新建立了跨多个表连接的视图只读关系配置。 - [orm]
添加了用于帮助跨函数等进行主连接的实验性 relation() 标志,_local_remote_pairs=[tuples]。这与复杂的 primaryjoin 条件相辅相成,允许您提供构成关系本地和远程侧的个别列对。还改进了惰性加载 SQL 生成,以处理将绑定参数放置在函数和其他表达式内的情况。(部分进展)
参考:#610 - [orm]
修复了单表继承,以便您可以从具有连接表继承的映射器进行单表继承而不会出现问题。
参考:#1036 - [orm]
修复了 Query.order_by() 中可能发生的“连接元组”错误,如果进行了子句适应。
参考:#1027 - [orm]
移除了关于映射可选择项需要“别名”的古老断言 - 如果没有别名,则映射现在会自己创建别名。不过,在这种情况下,您需要使用类,而不是映射的可选择项,作为列属性的来源 - 因此仍会发出警告。 - [orm]
修复了涉及继承的“exists”函数(any()、has()、~contains())的问题;对于连接到子类的关系,完整的目标连接将被呈现到 EXISTS 子句中。 - [orm]
恢复了对主查询行使用 append_result() 扩展方法的使用,当存在该扩展并且只返回单个实体结果时。 - [orm]
同时重新建立了跨多个表连接的视图只读关系配置。 - [orm]
移除了关于映射可选择项需要“别名”的古老断言 - 如果没有别名,则映射现在会自己创建别名。不过,在这种情况下,您需要使用类,而不是映射的可选择项,作为列属性的来源 - 因此仍会发出警告。 - [orm]
优化了 mapper._save_obj(),在 flush 期间不必要地对标量值调用 ne()。
参考:#1015 - [orm]
增加了一个特性,即贪婪加载中的子查询被设置为 column_property() 并具有显式标签名称(顺便说一句,这并不是必需的)时,当实例成为贪婪连接的一部分时,标签将被匿名化,以防止与父对象上的同名子查询或列发生冲突。
参考:#1019 - [orm]
使用集合操作符 |=、-=、^= 和 &= 时对其操作数的要求更为严格,只能操作集合、冻结集合或其子类的集合类型。之前,它们会接受任何类似集合的对象。 - [orm]
添加了一个示例 dynamic_dict/dynamic_dict.py,演示了在 dynamic_loader 之上放置字典行为的简单方法。
sql
- [sql]
通过.collate()表达式操作符和 collate(, ) sql 函数添加了 COLLATE 支持。 - [sql]
修复了将 union()应用于非 Table 连接的 select 语句时的错误 - [sql]
当作为 FROM 子句使用时,text()表达式的行为得到改进,例如 select().select_from(text(“sometext”))
参考:#1014 - [sql]
Column.copy()尊重“autoincrement”的值,修复了与 Migrate 的使用
参考:#1021
mssql
- [mssql]
向 engine / dburi 参数添加了“odbc_autotranslate”参数。任何给定的字符串都将传递到 ODBC 连接字符串中:
”AutoTranslate=%s” % odbc_autotranslate
- 参考:#1005
- [mssql]
向 engine / dburi 参数添加了“odbc_options”参数。给定的字符串简单地附加到 SQLAlchemy 生成的 odbc 连接字符串上。
这应该消除将来添加大量 ODBC 选项的需要。
杂项
- [声明式] [扩展]
连接表继承映射器使用稍微放松的函数来创建到父表的“继承条件”,以便对尚未声明的 Table 对象的其他外键不触发错误。 - [声明式] [扩展]
修复了在 ForeignKey 中使用已声明属性时的重入映射编译挂起问题,即 ForeignKey(MyOtherClass.someattribute) - [引擎]
现在可以将池监听器提供为可调用的字典或(可能是部分)PoolListener 的鸭子类型,任君选择。 - [引擎]
向 Pool 添加了“rollback_returned”选项,该选项将禁用在连接返回时发出的 rollback()。此标志仅适用于不支持事务的数据库(���MySQL/MyISAM)。 - [扩展]
基于集合的关联代理 |=, -=, ^= 和 &= 对其操作数更为严格,仅操作于集合、frozenset 或其他关联代理。以前,它们会接受任何鸭子类型的集合。 - [firebird]
处理“SUBSTRING(:string FROM :start FOR :length)”内置函数。
SqlAlchemy 2.0 中文文档(六十九)(3)https://developer.aliyun.com/article/1560785