0.3 更新日志

0.3.11

发布日期: 2007 年 10 月 14 日 星期日

orm

  • [orm]

    添加了使用 join() 从 A->B 连接,沿着两个不同的 m2m 表的检查。这在 0.3 中会引发错误,但在 0.4 中使用别名时是可能的。

    参考: #687

  • [orm]

    修复了 Session.merge() 中的一个小的异常抛出错误

  • [orm]

    修复了 mapper 链接到一个连接,其中一个表没有 PK 列时,不会检测到连接的表没有 PK 的错误。

  • [orm]

    修复了从自定义继承条件确定正确同步子句的错误

    参考: #769

  • [orm]

    backref 删除对象操作在另一侧集合不包含该项时不会失败,支持 noload 集合

    参考: #813

引擎

  • [engine]

    修复了另一个偶尔出现的竞争条件,当使用带有 threadlocal 设置的 pool 时可能会发生

sql

  • [sql]

    调整了类似 func.count(t.c.col.distinct()) 子句的 DISTINCT 优先级

  • [sql]

    修复了 :bind$params 中内部 ‘$’ 字符的检测

    参考: #719

  • [sql]

    不要假设连接条件仅由列对象组成

    参考: #768

  • [sql]

    调整了 NOT 运算符的优先级以匹配 ‘==’ 和其他运算符,以便 ~(x==y) 生成 NOT (x=y),这与 MySQL < 5.0 兼容(不喜欢 “NOT x=y”)

    参考: #764

mysql

  • [mysql]

    修复了生成模式时 YEAR 列的规范

sqlite

  • [sqlite]

    传递字符串化的日期

mssql

  • [mssql]

    添加了对 TIME 列的支持(使用 DATETIME 模拟)

    参考: #679

  • [mssql]

    添加了对 BIGINT、MONEY、SMALLMONEY、UNIQUEIDENTIFIER 和 SQL_VARIANT 的支持

    参考: #721

  • [mssql]

    从反射表中删除索引时,索引名称现在被引用

    参考: #684

  • [mssql]

    现在可以为 PyODBC 指定 DSN,使用类似 mssql:///?dsn=bob 的 URI

oracle

  • [oracle]

    从 “binary” 类型中移除了 LONG_STRING、LONG_BINARY,因此类型对象不会尝试将其值作为 LOB 读取。

    参考: #622, #751

misc

  • [postgres]

    当从备用模式反射表时,主键上的 “default” 放置(即通常是序列名称)无条件地引用 “schema” 名称,以便需要引用的模式名称可以正常工作。对于不需要引用的模式名称,这稍微有些不必要,但没有危害。

  • [firebird]

    supports_sane_rowcount() 由于 ticket #370(正确的方法)设置为 False。

  • [firebird]

    修复了 Column 的 nullable 属性的反射。

0.3.10

发布日期: 2007 年 7 月 20 日 星期五

通用

  • [general]

    0.3.9 中添加的新互斥锁导致 pool_timeout 功能在竞争条件下失败;如果许多线程同时将池推入溢出状态,线程会立即引发 TimeoutError,而不会有延迟。此问题已得到修复。

orm

  • [orm]

    清理了连接绑定的会话 SessionTransaction

sql

  • [sql]

    使连接绑定的元数据与隐式执行一起工作

  • [sql]

    外键规范可以在其标识符中包含任何字符

    参考: #667

  • [sql]

    为二进制子句比较添加了交换性感知,改进了 ORM 延迟加载优化

    参考: #664

misc

  • [postgres]

    修复了最大标识符长度 (63)

    参考: #571

0.3.9

发布日期: 2007 年 7 月 15 日 星期日

通用

  • [general]

    NoSuchColumnError 的更好错误消息

    参考: #607

  • [general]

    最终弄清楚了如何获取 setuptools 版本,可作为 sqlalchemy.__version__ 使用

    参考: #428

  • [general]

    各种 “engine” 参数,例如 “engine”、“connectable”、“engine_or_url”、“bind_to” 等,都存在,但已弃用。它们都被单个术语 “bind” 替换。您还可以使用 metadata.bind = <引擎或连接> 设置 MetaData 的 “bind”

orm

  • [orm]

    与 0.4 向前兼容:向 Query 添加了 one()、first() 和 all()。来自 0.4 的几乎所有 Query 功能都存在于 0.3.9 中,以实现向前兼容性。

  • [orm]

    reset_joinpoint() 这次真的真的有效了,保证! 让您可以从根重新连接:query.join(['a', 'b']).filter(<crit>).reset_joinpoint().join(['a', 'c']).filter(<some other crit>).all() 在 0.4 中,所有 join() 调用都从 “根” 开始

  • [orm]

    在 mapper() 构造步骤中添加了同步,以避免在不同线程中预先存在的 mapper 正在编译时发生线程冲突

    参考: #613

  • [orm]

    当两个同名的主键列被合并为单个属性时,Mapper 会发出警告。当映射到连接(或继承)时,这种情况经常发生。

  • [orm]

    所有 Query joining/with_parent 操作完全支持 synonym() 属性

    参考: #598

  • [orm]

    修复了删除具有多对多 uselist=False 关系的项时非常愚蠢的错误

  • [orm]

    还记得关于 polymorphic_union 的所有内容吗?用于连接表继承?有趣的是……对于连接表继承,您似乎不需要它,您可以只通过 outerjoin() 将所有表连接在一起。但是,如果涉及具体表,UNION 仍然适用(因为没有什么可以连接它们的)。

  • [orm]

    对急切加载的小修复,以便更好地与使用直接 “outerjoin” 子句的多态 mapper 的急切加载一起工作

sql

  • [sql]

    到非默认模式中的表的 ForeignKey 需要显式模式;即 ForeignKey('alt_schema.users.id')

  • [sql]

    MetaData 现在可以像 BoundMetaData 一样,使用引擎或 url 作为第一个参数来构造

  • [sql]

    BoundMetaData 现在已弃用,MetaData 是直接替代品。

  • [sql]

    DynamicMetaData 已重命名为 ThreadLocalMetaData。DynamicMetaData 名称已弃用,并且是 ThreadLocalMetaData 或常规 MetaData 的别名,如果 threadlocal=False

  • [sql]

    复合主键表示为非键控集合,以允许由具有相同名称的列组成的复合键;发生在 Join 中。帮助继承场景制定正确的 PK。

  • [sql]

    提高了从连接中获取 “正确” 和最少主键列集的能力,使外键和以其他方式等同的列相等。这主要也是为了帮助继承场景制定主键列的最佳选择。

    参考: #185

  • [sql]

    为 Sequence.create()/drop()、ColumnDefault.execute() 添加了 ‘bind’ 参数

  • [sql]

    可以在反射表中覆盖列,使用与列名不同的 “key” 属性,包括主键列

    参考: #650

  • [sql]

    修复了 “ambiguous column” 结果检测,当结果中存在重复的列名时

    参考: #657

  • [sql]

    对 “column targeting” 进行了一些增强,即能够将列匹配到另一个 selectable 中的 “corresponding” 列。这主要影响 ORM 映射到复杂连接的能力

  • [sql]

    MetaData 和所有 SchemaItems 都可以安全地与 pickle 一起使用。可以将慢速表反射转储到 pickle 文件中以供以后重用。解封后,只需将引擎重新连接到元数据即可。

    参考: #619

  • [sql]

    为 QueuePool 的 “overflow” 计算添加了互斥锁,以防止可能绕过 max_overflow 的竞争条件

  • [sql]

    修复了复合 select 的分组以给出正确的结果。在某些情况下将在 sqlite 上中断,但这些情况无论如何都会产生不正确的结果,sqlite 不支持分组的复合 select

    参考: #623

  • [sql]

    修复了运算符的优先级,以便正确应用括号

    参考: #620

  • [sql]

    调用 <column>.in_() (即不带参数)将返回 “CASE WHEN (<column> IS NULL) THEN NULL ELSE 0 END = 1)”,以便在所有情况下都返回 NULL 或 False,而不是抛出错误

    参考: #545

  • [sql]

    修复了 select() 的 “where”/“from” 条件,以接受 unicode 字符串以及常规字符串 - 两者都转换为 text()

  • [sql]

    除了 column.distinct() 之外,还添加了独立的 distinct() 函数

    参考: #558

  • [sql]

    result.last_inserted_ids() 应返回一个列表,该列表的大小与表的主键约束完全相同。通过 cursor.lastrowid “被动” 创建且不可用的值将为 None。

  • [sql]

    长标识符检测已修复为使用 > 而不是 >= 来表示最大标识符长度

    参考: #589

  • [sql]

    修复了 selectable.corresponding_column(selectable.c.col) 在 selectable 是表和涉及同一表的另一个连接的连接时不会返回 selectable.c.col 的错误。搞乱了 ORM 决策

    参考: #593

  • [sql]

    向 types.py 添加了 Interval 类型

    参考: #595

mysql

  • [mysql]

    修复了捕获一些暗示连接断开的错误

    参考: #625

  • [mysql]

    修复了取模运算符的转义

    参考: #624

  • [mysql]

    将 ‘fields’ 添加到保留字

    参考: #590

  • [mysql]

    各种反射增强/修复

sqlite

  • [sqlite]

    重新安排了方言初始化,使其有时间警告 pysqlite1 版本过旧。

  • [sqlite]

    sqlite 更好地处理了 datetime/date/time 对象与各种 Date/Time/DateTime 列的混合和匹配

  • [sqlite]

    字符串 PK 列插入不会被 OID 覆盖

    参考: #603

mssql

  • [mssql]

    修复了 pyodbc 的端口选项处理

    参考: #634

  • [mssql]

    现在能够反射标识列的起始值和增量值

  • [mssql]

    初步支持将 scope_identity() 与 pyodbc 一起使用

oracle

  • [oracle]

    datetime 修复:使亚秒 TIMESTAMP 工作,添加了仅支持年/月/日的 OracleDate 以支持 types.Date

    参考: #604

  • [oracle]

    添加了方言标志 “auto_convert_lobs”,默认为 True;将导致在结果集中检测到的任何 LOB 对象被强制转换为 OracleBinary,以便自动 read() LOB,如果不存在类型映射(即,如果发出了文本 execute())。

  • [oracle]

    模运算符 ‘%’ 生成 MOD

    参考: #624

  • [oracle]

    当使用 Python 2.3 时,将 cx_oracle datetime 对象转换为 Python datetime.datetime

    参考: #542

  • [oracle]

    修复了 Oracle TEXT 类型中的 unicode 转换

misc

  • [ext]

    对 dict 关联代理的迭代现在类似于 dict,而不是类似于 InstrumentedList(例如,遍历键而不是值)

  • [ext]

    关联代理不再紧密绑定到源集合,而是使用 thunk 构建

    参考: #597

  • [ext]

    为 assignmapper 添加了 selectone_by()

  • [postgres]

    修复了取模运算符的转义

    参考: #624

  • [postgres]

    添加了对域反射的支持

    参考: #570

  • [postgres]

    反射期间缺少的类型解析为 Null 类型,而不是引发错误

  • [postgres]

    上面的 “schema” 中的修复修复了从 alt-schema 表到公共模式表的外键反射

0.3.8

发布日期: 2007 年 6 月 2 日 星期六

orm

  • [orm]

    向 Query 添加了 reset_joinpoint() 方法,将 “join point” 移回起始 mapper。0.4 将更改 join() 的行为,以在所有情况下重置 “join point”,因此这是一个临时方法。为了向前兼容性,请确保使用单个 join() 指定跨多个关系的连接,即 join(['a', 'b', 'c'])。

  • [orm]

    修复了 query.instances() 中的错误,该错误无法处理多个附加 mapper 或一个附加列。

  • [orm]

    “delete-orphan” 不再暗示 “delete”。正在努力分离这两个操作的行为。

  • [orm]

    多对多关系正确设置了关联表上删除操作的绑定参数类型

  • [orm]

    多对多关系检查删除操作从关联表中删除的行数是否与预期结果匹配

  • [orm]

    session.get() 和 session.load() 将 **kwargs 传播到 query

  • [orm]

    修复了多态查询,允许将原始 polymorphic_union 嵌入到关联子查询中

    参考: #577

  • [orm]

    修复了 select_by(<propname>=<object instance>) 风格的连接与多对多关系结合使用时的错误,r2556 中引入的错误

  • [orm]

    mapper() 的 “primary_key” 参数传播到 “polymorphic” mapper。此列表中的主键列将标准化为 mapper 本地表的列。

  • [orm]

    恢复了 sa.orm.strategies logger 下 “lazy loading clause” 的日志记录,在 0.3.7 中删除

  • [orm]

    改进了对映射到 select() 语句的 mapper 的属性的急切加载的支持;即,eagerloader 更擅长查找正确的 selectable 以附加其 LEFT OUTER JOIN。

sql

  • [sql]

    _Label 类覆盖 compare_self 以返回其最终对象。意思是,如果您说 someexpr.label('foo') == 5,它会生成正确的 “someexpr == 5”。

  • [sql]

    _Label 传播 “_hide_froms()”,以便标量 select 在 FROM 子句方面表现得更正确 #574

  • [sql]

    修复了使用 oid_column 作为 order by 时的长名称生成(oids 在 mapper 查询中大量使用)

  • [sql]

    ResultProxy 的显着速度改进,预缓存 TypeEngine 方言实现并节省每个列的函数调用

  • [sql]

    括号通过新的 _Grouping 构造应用于子句。使用运算符优先级更智能地将括号应用于子句,提供更清晰的子句嵌套(不会改变放置在其他子句中的子句,即没有 ‘parens’ 标志)

  • [sql]

    添加了 ‘modifier’ 关键字,其工作方式类似于 func.<foo>,但不添加括号。例如 select([modifier.DISTINCT(…)]) 等。

  • [sql]

    删除了 “作为 UNION 一部分的 select 中不允许 group by” 的限制

    参考: #578

mysql

  • [mysql]

    现在几乎支持所有 MySQL 列类型进行声明和反射。添加了 NCHAR、NVARCHAR、VARBINARY、TINYBLOB、LONGBLOB、YEAR

  • [mysql]

    sqltypes.Binary 传递现在始终构建 BLOB,避免了与非常旧的数据库版本的问题

  • [mysql]

    支持列级 CHARACTER SET 和 COLLATE 声明,以及 ASCII、UNICODE、NATIONAL 和 BINARY 简写。

misc

  • [engines]

    向 Connection 添加了 detach(),允许将底层 DBAPI 连接从其池中分离,在取消引用/close() 时关闭,而不是被池重用。

  • [engines]

    向 Connection 添加了 invalidate(),立即使 Connection 及其底层 DBAPI 连接无效。

  • [firebird]

    将最大标识符长度设置为 31

  • [firebird]

    supports_sane_rowcount() 由于 ticket #370 设置为 False。versioned_id_col 功能在 FB 中不起作用。

  • [firebird]

    一些执行修复

  • [firebird]

    新的关联代理实现,实现了到基于列表、字典和集合的关系集合的完整代理

  • [firebird]

    添加了 orderinglist,一个自定义列表类,它将对象属性与该对象在列表中的位置同步

  • [firebird]

    对 SelectResultsExt 的小修复,以防止在 select() 期间绕过自身。

  • [firebird]

    为 assignmapper 添加了 filter()、filter_by()

0.3.7

发布日期: 2007 年 4 月 29 日 星期日

orm

  • [orm]

    修复了关键问题,即在使用 options(eagerload()) 后,mapper 随后总是对所有后续 LIMIT/OFFSET/DISTINCT 查询应用查询 “包装” 行为,即使在这些后续查询上未应用急切加载。

  • [orm]

    添加了 query.with_parent(someinstance) 方法。使用来自父实例的延迟连接条件搜索目标实例。采用可选的字符串 “property” 来隔离所需的关联。还添加了静态 Query.query_from_parent(instance, property) 版本。

    参考: #541

  • [orm]

    改进了 query.XXX_by(someprop=someinstance) 查询,以使用类似于 with_parent 的方法,即使用 “延迟” 子句,该子句阻止将远程实例的表添加到 SQL,从而使更复杂的条件成为可能

    参考: #554

  • [orm]

    向 query 添加了聚合的生成版本,即 sum()、avg() 等。通过 query.apply_max()、apply_sum() 等使用。#552

  • [orm]

    修复了在 join() 和类似情况下结合使用 distinct() 或 distinct=True 的问题

  • [orm]

    与 label/bindparam 名称生成相对应,急切加载器为它们使用 md5 哈希创建的别名生成确定性名称。

  • [orm]

    改进/修复了自定义集合类,当为其提供 “set”/“sets.Set” 类或子类时(在延迟加载期间仍在查找它们的 append() 方法)

  • [orm]

    恢复了旧的 “column_property()” ORM 函数 (以前称为 “column()”),以强制将任何列表达式作为属性添加到映射器上,特别是那些在映射的可选对象中不存在的表达式。这允许将任何类型的 “标量表达式” 添加为关系(尽管它们在预加载方面存在问题)。

  • [orm]

    修复了以多态映射器为目标的多对多关系

    参考链接: #533

  • [orm]

    在 session.merge() 方面取得进展,并将其用法与 entity_name 相结合

    参考链接: #543

  • [orm]

    通常对继承映射器之间的关系进行调整,在这种情况下,建立与子类映射器的 relation()s,其中连接条件来自超类的表

sql

  • [sql]

    结果集列的 keys() 不再小写,而是完全按照它们在 cursor.description 中表达的方式返回。请注意,这会导致列名在 oracle 中全部为大写。

  • [sql]

    为支持 Unicode 的数据库添加了对 unicode 表名、列名和 SQL 语句的初步支持。目前适用于 sqlite 和 postgres。MySQL *大部分* 工作正常,但 has_table() 函数不起作用。反射也有效。

  • [sql]

    Unicode 类型现在是 String 的直接子类,String 现在包含所有 “convert_unicode” 逻辑。这有助于更好地处理 MS-SQL 等数据库中出现的各种 unicode 情况,并允许对 Unicode 数据类型进行子类化。

    参考链接: #522

  • [sql]

    ClauseElements 现在可以用于 in_() 子句,例如绑定参数等。#476

  • [sql]

    CompareMixin 元素实现了反向运算符,允许像 “5 + somecolumn” 等表达式。#474

  • [sql]

    update() 和 delete() 的 “where” 条件现在将嵌入的 select() 语句与正在更新或删除的表相关联。这与嵌套的 select() 语句关联的工作方式相同,可以通过嵌入的 select() 上的 correlate=False 标志禁用。

  • [sql]

    列标签现在在编译阶段生成,这意味着它们的长度取决于方言。因此,在 oracle 上被截断为 30 个字符的标签在 postgres 上将扩展到 63 个字符。此外,真实的标签名始终作为访问器附加到父 Selectable 上,因此无需注意 “截断的” 标签名。

    参考链接: #512

  • [sql]

    列标签和绑定参数 “截断” 现在也生成确定性的名称,基于它们在正在编译的完整语句中的排序。这意味着相同的语句将在应用程序重启时产生相同的字符串,并使数据库查询计划缓存更好地工作。

  • [sql]

    当使用子查询时生成的 “迷你” 列标签(旨在解决 SQLite 的小故障行为,该行为不理解 “foo.id” 等同于 “id”)现在仅在从这些命名列(的一部分)中选择的情况下生成

    参考链接: #513

  • [sql]

    ColumnElement 上的 label() 方法将正确地将基础元素的 TypeEngine 传播到标签,包括从 scalar=True select() 语句创建的 label()。

  • [sql]

    MS-SQL 更好地检测查询是否为子查询,并知道不为这些子查询生成 ORDER BY 短语

    参考链接: #513

  • [sql]

    修复了 fetchmany() “size” 参数在大多数 dbapis 中是位置参数的问题

    参考链接: #505

  • [sql]

    将 None 作为参数发送给 func.<something> 将产生 NULL 参数

  • [sql]

    unicode URL 中的查询字符串的键被编码为 ascii 以实现 **kwargs 兼容性

  • [sql]

    对原始 execute() 更改的轻微调整,以支持位置参数的元组,而不仅仅是列表

    参考链接: #523

  • [sql]

    修复了 case() 构造,以将第一个 WHEN 条件的类型传播为 case 语句的返回类型

extensions

  • [extensions]

    对 AssociationProxy 的重大修复,以便可以将多个 AssociationProxy 对象与单个关联集合相关联。

  • [extensions]

    根据 assign_mapper 名称方法的键(即 __name__)命名它们 #551

mysql

  • [mysql]

    支持作为 URL 查询字符串内联给出的 SSL 参数,前缀为 “ssl_”,由 terjeros@gmail.com 提供。

  • [mysql] [<schemaname>]

    mysql 使用 “DESCRIBE.<tablename>”,捕获表不存在时的异常,以确定表是否存在。这支持 unicode 表名以及模式名。已使用 MySQL5 测试,但应该也适用于 4.1 系列。(#557)

sqlite

  • [sqlite]

    移除了 sqlite 会将 UNIQUE 索引反射为主键一部分的愚蠢行为(?!)

mssql

  • [mssql]

    pyodbc 现在是 MSSQL 的首选 DB-API,如果没有明确请求模块,则将在模块探测时首先加载。

  • [mssql]

    现在使用 @@SCOPE_IDENTITY 而不是 @@IDENTITY。此行为可以使用 engine_connect “use_scope_identity” 关键字参数覆盖,该参数也可以在 dburi 中指定。

oracle

  • [oracle]

    小修复,允许连续编译具有 LIMIT/OFFSET 功能的相同 SELECT 对象。oracle 方言需要修改对象以具有 ROW_NUMBER OVER,并且没有在连续编译时执行完整的一系列步骤。

misc

  • [engines]

    warnings 模块用于发出警告(而不是日志记录)

  • [engines]

    清理了所有引擎的 DBAPI 导入策略

    参考链接: #480

  • [engines]

    引擎内部结构的重构,降低了复杂性,减少了代码路径的数量;将更多状态置于 ExecutionContext 内部,以允许更多方言控制游标处理、结果集。ResultProxy 完全重构,并且还具有用于不同目的的两个版本的 “缓冲” 结果集。

  • [engines]

    服务器端游标支持在 postgres 中完全可用。

    参考链接: #514

  • [engines]

    改进了自动使已丢失底层数据库的连接失效的框架,通过方言特定的异常检测来检测与该数据库的断开连接相关错误消息。此外,当检测到 “连接不再打开” 的情况时,整个连接池将被丢弃并替换为新实例。#516

  • [engines]

    sqlalchemy.databases 中的方言成为 setuptools 入口点。加载内置数据库方言的工作方式与以往相同,但如果未找到,将回退到尝试 pkg_resources 加载外部模块

    参考链接: #521

  • [engines]

    Engine 包含一个 “url” 属性,引用 create_engine() 使用的 url.URL 对象。

  • [informix]

    添加了 informix 支持!感谢 James Zhang,他为此付出了巨大的努力。

0.3.6

发布日期:2007 年 3 月 23 日 星期五

orm

  • [orm]

    SelectResults 扩展的完整功能集已合并到 Query 提供的一组新方法中。这些方法都提供 “生成式” 行为,Query 会被复制,并返回一个新的 Query,其中添加了额外的条件。新方法包括

    • filter() - 将选择条件应用于查询

    • filter_by() - 将 “by” 风格的条件应用于查询

    • avg() - 返回给定列的 avg() 函数

    • join() - 连接到属性(或跨属性列表)

    • outerjoin() - 类似于 join(),但使用 LEFT OUTER JOIN

    • limit()/offset() - 应用基于 LIMIT/OFFSET 范围的访问,该访问应用 limit/offset:session.query(Foo)[3:5]

    • distinct() - 应用 DISTINCT

    • list() - 评估条件并返回结果

    Query 的 API 没有进行不兼容的更改,也没有弃用任何方法。像 select()、select_by()、get()、get_by() 这样的现有方法都像以前一样立即执行查询并返回结果。join_to()/join_via() 仍然存在,尽管生成式的 join()/outerjoin() 方法更容易使用。

  • [orm]

    与 instances() 一起使用的多个映射器的返回值现在返回请求的映射器列表的笛卡尔积,表示为元组列表。这与文档记录的行为相符。为了使实例正确匹配,当使用此功能时,将禁用 “去重”。

  • [orm]

    Query 具有 add_entity() 和 add_column() 生成式方法。这些方法将在编译时将给定的映射器/类或 ColumnElement 添加到查询中,并将它们应用于 instances() 方法。用户负责构建合理的连接条件(否则可能会得到完整的笛卡尔积)。结果集是元组列表,未去重。

  • [orm]

    字符串和列也可以发送到 instances() 的 *args 中,其中这些确切的结果列将成为结果元组的一部分。

  • [orm]

    可以将完整的 select() 构造传递给 query.select()(无论如何都可以工作),以及 query.selectfirst()、query.selectone(),它们将按原样使用(即不编译查询)。工作方式类似于将结果发送到 instances()。

  • [orm]

    预加载不会 “别名化” 由 eager loader 自身以外的其他内容放置在 select 语句中的 “order by” 子句,以修复如示例中所示的重复列的可能性。但是,这意味着您必须更加小心放置在 Query.select() 的 “order by” 中的列,您必须在条件中显式命名它们(即,您不能依赖 eager loader 为您添加它们)

    参考链接: #495

  • [orm]

    为 Session 添加了一个方便的多用途 “identity_key()” 方法,允许为主要键值、实例和行生成身份键,由 Daniel Miller 提供

  • [orm]

    即使在 “backref” 侧进行操作,多对多表也将被正确处理

    参考链接: #249

  • [orm]

    添加了 “refresh-expire” 级联。允许 refresh() 和 expire() 调用沿关系传播。

    参考链接: #492

  • [orm]

    对多态关系的更多修复,包括对多对一关系到多态映射器的正确延迟子句生成。还修复了 “方向” 的检测,更具体地针对属于多态联合的列与不属于多态联合的列。

    参考链接: #493

  • [orm]

    当使用 “viewonly=True” 将其他表拉入连接条件中,而这些表不是关系的父/子映射的父项时,对关系计算的一些修复

  • [orm]

    当循环链中的某些对象实际上不属于刷新的一部分时,对包含对循环链外部的其他实例的引用的循环引用关系的刷新修复

  • [orm]

    对 “刷新对象 A,其中包含 B 的集合,但您将 C 放入集合中” 错误条件进行了严格检查 - 即使 C 是 B 的子类,除非 B 的映射器以多态方式加载。否则,集合稍后将加载一个 “B”,它应该是 “C”(因为它不是多态的),这在双向关系中会中断(即 C 有它的 A,但 A 的 backref 将延迟加载它作为类型 “B” 的不同实例)。此检查将影响一些没有问题地执行此操作的用户,因此错误消息还将记录一个标志 “enable_typechecks=False” 以禁用此检查。但请注意,特别是在没有此检查的情况下,双向关系会变得脆弱。

    参考链接: #500

sql

  • [sql]

    bindparam() 名称现在可重复!在单个语句中指定两个具有相同名称的不同 bindparam(),键将被共享。正确的按位置/命名参数在编译时转换。对于 “别名化” 具有冲突名称的绑定参数的旧行为,请指定 “unique=True” - 此选项仍在内部用于所有自动生成的(基于值的)绑定参数。

  • [sql]

    稍微更好地支持作为列子句的绑定参数,通过 bindparam() 或通过 literal(),例如 select([literal(‘foo’)])

  • [sql]

    MetaData 可以通过构造函数的 “url” 或 “engine” kwargs 或使用 connect() 方法绑定到引擎。BoundMetaData 与 MetaData 完全相同,只是需要 engine_or_url 参数。DynamicMetaData 也相同,并默认提供线程本地连接。

  • [sql]

    exists() 变得可用作独立的 selectable,而不仅仅是在 WHERE 子句中,例如 exists([columns], criterion).select()

  • [sql]

    相关的子查询在 ORDER BY、GROUP BY 内部工作

  • [sql]

    修复了使用显式连接的函数执行,例如 conn.execute(func.dosomething())

  • [sql]

    select() 上的 use_labels 标志不会为文字文本列元素自动创建标签,因为我们无法对文本做出任何假设。要为文字列创建标签,您可以说 “somecol AS somelabel”,或使用 literal_column(“somecol”).label(“somelabel”)

  • [sql]

    当文字列 “代理” 到其 selectable 的列集合中时,不会对文字列进行引用(is_literal 标志已传播)。文字列通过 literal_column(“somestring”) 指定。

  • [sql]

    为 Join.select() 添加了 “fold_equivalents” 布尔参数,该参数从生成的列子句中删除基于连接条件已知等效的 ‘重复’ 列。当构造 Postgres 抱怨存在重复列名的连接子查询时,这非常有用。

  • [sql]

    修复了 ForeignKeyConstraint 上的 use_alter 标志

    参考链接: #503

  • [sql]

    修复了 topological.py 中仅限 2.4 版本的 “reversed” 的用法

    参考链接: #506

  • [sql]

    对于黑客,重构了 ClauseElement 和 SchemaItem 的 “visitor” 系统,以便项目的遍历由 ClauseVisitor 本身控制,使用方法 visitor.traverse(item)。accept_visitor() 方法仍然可以直接调用,但不会对子项进行任何遍历。ClauseElement/SchemaItem 现在具有可配置的 get_children() 方法,用于返回每个父对象的子元素集合。这使得项目的完整遍历清晰明确(以及可记录的),并提供了一种限制遍历的简单方法(只需传递标志,这些标志由适当的 get_children() 方法拾取)。

    参考链接: #501

  • [sql]

    case 语句的 “else_” 参数现在在设置为零时可以正常工作。

extensions

  • [extensions]

    SelectResults 上的 options() 方法现在像其余的 SelectResults 方法一样以 “生成式” 方式实现。但无论如何您都将只使用 Query。

    参考链接: #472

  • [extensions]

    assignmapper 添加了 query() 方法。这有助于导航到 Query 上的所有新的生成式方法。

mysql

  • [mysql]

    为 MSString 添加了 catchall **kwargs,以帮助反射模糊类型(例如 MS 4.0 中的 “varchar() binary”)

  • [mysql]

    添加了显式的 MSTimeStamp 类型,该类型在使用 types.TIMESTAMP 时生效。

oracle

  • [oracle]

    使二进制文件适用于任何大小的输入!cx_oracle 工作正常,这是我的错误,因为 BINARY 被传递而不是 BLOB 用于 setinputsizes(而且单元测试甚至没有设置输入大小)。

  • [oracle]

    还在单独的变更集中修复了 CLOB 读/写。

  • [oracle]

    auto_setinputsizes 默认为 Oracle 为 True,修复了它不正确地传播错误类型的情况。

misc

  • [ms-sql]

    移除了 DATE 列类型上的秒输入 (可能

    应该完全移除时间)

  • [ms-sql]

    浮点字段中的 null 值不再引发错误

  • [ms-sql]

    现在 LIMIT 与 OFFSET 一起使用会引发错误(MS-SQL 没有 OFFSET 支持)

  • [ms-sql]

    添加了一个工具,可以使用 MSSQL 类型 VARCHAR(max) 而不是 TEXT 用于大型无大小的字符串字段。使用新的 “text_as_varchar” 来启用它。

    参考链接: #509

  • [ms-sql]

    在子查询中,现在会剥离没有 LIMIT 的 ORDER BY 子句,因为 MS-SQL 禁止这种用法

  • [ms-sql]

    清理了模块导入代码;可指定的 DB-API 模块;更明确的模块偏好排序。

    参考链接: #480

0.3.5

发布日期:2007 年 2 月 22 日 星期四

orm

  • [orm] [bugs]

    对关系计算的又一次重构。允许更准确的 ORM 行为,包括来自/到/在映射器之间的关系,特别是多态映射器,以及它们与 Query、SelectResults 的用法。票据包括 ,,。

    参考链接: #439, #441, #448

  • [orm] [bugs]

    移除了在类上指定自定义集合的已弃用方法;您现在必须使用 “collection_class” 选项。当人们使用 assign_mapper() 时,旧方法开始产生冲突,assign_mapper() 现在修补了 “options” 方法,并结合了名为 “options” 的关系。(关系优先于 monkeypatched assign_mapper 方法)。

  • [orm] [bugs]

    extension() 查询选项传播到 Mapper._instance() 方法,以便调用所有与加载相关的方法

    参考链接: #454

  • [orm] [bugs]

    如果关系没有返回行,则继承映射器的预加载关系不会失败。

  • [orm] [bugs]

    修复了多个后代类上的预加载关系的预加载关系加载错误

    参考链接: #486

  • [orm] [bugs]

    修复了非常大的拓扑排序,由 ants.aasma at gmail 提供

    参考链接: #423

  • [orm] [bugs]

    预加载在检测 “自引用” 关系方面稍微严格一些,特别是在多态映射器之间。这导致 “预加载降级” 为延迟加载。

  • [orm] [bugs]

    改进了对嵌入到 query.select() 的 “where” 条件中的复杂查询的支持

    参考链接: #449

  • [orm] [bugs]

    像 eagerload()、lazyload()、deferred() 这样的映射器选项将适用于 “synonym()” 关系

    参考链接: #485

  • [orm] [bugs]

    修复了级联操作错误地将已删除的集合项包含在级联中的错误

    参考链接: #445

  • [orm] [bugs]

    修复了当一对多子项在单个工作单元中移动到新父项时的关系删除错误

    参考链接: #478

  • [orm] [bugs]

    修复了关系删除错误,其中子项上具有单列作为 PK/FK 的父/子项将引发 “清空主键” 错误,如果手动删除或使用不带 “delete-orphan” 的 “delete” 级联

  • [orm] [bugs]

    修复了 deferred,以便仅在设置 PK 列属性时不会错误地发生加载操作

  • [orm] [enhancements]

    为 mapper 实现了 foreign_keys 参数。与 primaryjoin/secondaryjoin 参数结合使用,以指定/覆盖在 Table 实例上定义的外键。

    参考: #385

  • [orm] [enhancements]

    contains_eager(‘foo’) 自动暗示 eagerload(‘foo’)

  • [orm] [enhancements]

    为 contains_eager() 添加了 “alias” 参数。使用它来指定查询中用于预先加载子项的别名的字符串名称或 Alias 实例。比 “decorator” 更容易使用

  • [orm] [enhancements]

    为结果集映射到映射表的别名添加了 “contains_alias()” 选项

  • [orm] [enhancements]

    为带有 SessionTransaction 的 py2.5 “with” 语句添加了支持

    参考: #468

sql

  • [sql]

    “case_sensitive” 的值现在默认为 True,无论标识符的大小写如何,除非明确设置为 False。这是因为对象可能被标记为其他包含混合大小写的内容,并且传播 “case_sensitive=False” 会破坏这一点。修复了使用标签和 “fake” 列对象时的其他引用问题

  • [sql]

    为 ClauseElement 添加了 “supports_execution()” 方法,以便各种子句可以表达它们是否适合执行……例如,您可以执行 “select”,但不能执行 “Table” 或 “Join”。

  • [sql]

    修复了在引擎、连接上对纯文本执行 execute() 的参数传递。可以处理 *args 或列表实例作为位置参数,**kwargs 或字典实例作为命名参数,或列表的列表或字典来调用 executemany()

  • [sql]

    对 BoundMetaData 进行了小修复,以接受 unicode 或字符串 URL

  • [sql]

    修复了命名 PrimaryKeyConstraint 的生成,感谢 andrija at gmail

    参考: #466

  • [sql]

    修复了列上 CHECK 约束的生成

    参考: #464

  • [sql]

    修复了 tometadata() 操作,以传播列和表级别的 Constraints

extensions

  • [extensions]

    为 SelectResults 添加了 distinct() 方法。通常只在使用 count() 时才会有区别。

  • [extensions]

    为 SelectResults 添加了 options() 方法,等同于 query.options()

    参考链接: #472

  • [extensions]

    为 ActiveMapper 添加了可选的 __table_opts__ 字典,将 kw 选项发送到 Table 对象

    参考: #462

  • [extensions]

    为 assign_mapper 添加了 selectfirst(), selectfirst_by()

    参考: #467

mysql

  • [mysql]

    修复了较旧数据库上可能为 “show variables like” 语句返回 array() 类型的反射问题

mssql

  • [mssql]

    pyodbc 的初步支持 (耶!)

    参考: #419

  • [mssql]

    增加了对 NVARCHAR 类型的更好支持

    参考: #298

  • [mssql]

    修复了 pymssql 上的 commit 逻辑

  • [mssql]

    修复了带有 schema 的 query.get()

    参考: #456

  • [mssql]

    修复了非整数关系

    参考: #473

  • [mssql]

    DB-API 模块现在可以在运行时选择

    参考: #419

  • [mssql] [415] [481] [tickets:422]

    现在通过了更多的单元测试

  • [mssql]

    更好地兼容使用 ANSI 函数的单元测试

    参考: #479

  • [mssql]

    改进了对带有自动插入的隐式序列 PK 列的支持

    参考: #415

  • [mssql]

    修复了 adodbapi 中的空白密码

    参考: #371

  • [mssql]

    修复了使单元测试与 pyodbc 一起工作的问题

    参考: #481

  • [mssql]

    修复了 db-url 查询上的 auto_identity_insert

  • [mssql]

    为 db-url 查询参数添加了 query_timeout。目前仅适用于 pymssql

  • [mssql]

    已使用 pymssql 0.8.0(现在是 LGPL)进行测试

oracle

  • [oracle]

    当返回 “rowid” 作为 ORDER BY 列或与 ROW_NUMBER OVER 一起使用时,oracle 方言会检查它所应用的 selectable,如果不可用(即对于 UNION),则会切换到表 PK。检查 DISTINCT、GROUP BY(rowid 无效的其他位置)仍然是 TODO。允许多态映射正常工作。

    参考: #436

  • [oracle]

    非 pk 列上的序列将在 INSERT 时正确触发

  • [oracle]

    添加了 PrefetchingResultProxy 支持,以便在已知 LOB 列存在时预先获取它们,修复了

    参考: #435

  • [oracle]

    实现了基于同义词的表反射,包括跨数据库链接

    参考: #379

  • [oracle]

    当由于某些权限错误而无法反射相关表时,发出日志警告

    参考: #363

misc

  • [postgres]

    更好地反射备用 schema 表的序列

    参考: #442

  • [postgres]

    非 pk 列上的序列将在 INSERT 时正确触发

  • [postgres]

    添加了 PGInterval 类型,PGInet 类型

    参考: #444, #460

0.3.4

发布日期:2007 年 1 月 23 日星期二

general

  • [general]

    全局 “insure”->”ensure” 更改。在美国英语中,“insure” 实际上与 “ensure” 大致可以互换(字典上是这么说的),所以我并不是完全文盲,但明确地使用 “ensure” 肯定更优。

orm

  • [orm]

    在漏洞百出的罐子上戳了第一个洞:说 query.select_by(somerelationname=someinstance) 将创建由 “somerelationname” 的 mapper 表示的主键列与 “someinstance” 中的实际主键的连接。

  • [orm]

    重做了关系如何与 “polymorphic” mapper 交互,即具有 select_table 以及多态标志的 mapper。更好地确定适当的连接条件、与用户定义的连接条件的交互以及对自引用多态 mapper 的支持。

  • [orm]

    与多态映射关系相关,在编译关系时进行了一些更深入的错误检查,以检测当关系的双方在主连接条件中都有外键引用时,是否存在不明确的 “primaryjoin”。还收紧了用于定位 “关系方向” 的条件,将关系的 “foreignkey” 与 “primaryjoin” 关联起来

  • [orm]

    对 “concrete” 继承映射的概念进行了一点改进,尽管这个概念还没有完全充实(添加了测试用例以支持在多态基类之上的 concrete mapper)。

  • [orm]

    修复了 synonym() 上的 “proxy=True” 行为

  • [orm]

    修复了 delete-orphan 基本上无法与多对多关系一起工作的错误,backref 的存在通常隐藏了症状

    参考: #427

  • [orm]

    为 mapper 编译步骤添加了互斥锁。我一直不情愿在 SA 中添加任何类型的线程,但这是一个真正需要它的地方,因为 mapper 通常是 “全局的”,并且虽然它们的状态在正常操作期间不会改变,但初始编译步骤确实显着地修改了内部状态,并且此步骤通常不会在模块级初始化时发生(除非您调用 compile()),而是在首次请求时发生

  • [orm]

    “session.merge()” 的基本思想实际上已实现。需要更多测试。

  • [orm]

    添加了 “compile_mappers()” 函数作为编译所有 mapper 的快捷方式

  • [orm]

    修复了 MapperExtension create_instance,以便 entity_name 与新实例正确关联

  • [orm]

    ORM 对象实例化、行的预先加载的速度增强

  • [orm]

    发送到 ‘cascade’ 字符串的无效选项将引发异常

    参考: #406

  • [orm]

    修复了 mapper 刷新/过期的错误,即预先加载器没有正确地重新填充项目列表

    参考: #407

  • [orm]

    修复了 post_update,以确保即使在非插入/删除场景下也更新行

    参考: #413

  • [orm]

    如果您实际上尝试修改实体上的主键值然后刷新它,则添加了一条错误消息

    参考: #412

sql

  • [sql]

    为 ResultProxy 添加了 “fetchmany()” 支持

  • [sql]

    添加了对列 “key” 属性的支持,使其可在 row[<key>]/row.<key> 中使用

  • [sql]

    将 “BooleanExpression” 更改为从 “BinaryExpression” 子类化,以便布尔表达式也可以遵循列子句行为(即 label() 等)。

  • [sql]

    从 func.<xxx> 调用中修剪了尾随下划线,例如 func.if_()

  • [sql]

    修复了当 select 语句的列列表是通过单独调用 append_column() 构建时,子查询的相关性问题;这修复了一个 ORM 错误,即嵌套的 select 语句没有与 Query 对象生成的主 select 语句相关联。

  • [sql]

    对子查询相关性的另一个修复,以便仅具有一个 FROM 元素的子查询 *不会* 关联该单个元素,因为查询中至少需要一个 FROM 元素。

  • [sql]

    默认 “timezone” 设置现在为 False。这对应于 Python 的 datetime 行为以及 Postgres 的 timestamp/time 类型(这是目前唯一对时区敏感的方言)

    参考: #414

  • [sql]

    “op()” 函数现在被视为 “operation”,而不是 “comparison”。区别在于,operation 生成一个 BinaryExpression,从中可以发生进一步的操作,而 comparison 生成更具限制性的 BooleanExpression

  • [sql]

    尝试将反射的主键列重新定义为非主键会引发错误

  • [sql]

    类型系统略作修改,以支持可以被方言覆盖的 TypeDecorator(好吧,这不是很清楚,它允许下面的 mssql 调整成为可能)

extensions

  • [extensions]

    为 assign_mapper 添加了 “validate=False” 参数,如果为 True,将确保仅命名映射的属性

    参考: #426

  • [extensions]

    assign_mapper 获取了 “options”、“instances” 函数(即 MyClass.instances())

mysql

  • [mysql]

    mysql 在 SHOW CREATE TABLE 期间在外键中使用的引号类型不一致,反射已更新以适应所有三种样式

    参考: #420

  • [mysql]

    mysql 表创建选项现在可以在通用传递中使用,例如 Table(…, mysql_engine=’InnoDB’, mysql_collate=”latin1_german2_ci”, mysql_auto_increment=”5”, mysql_<somearg>…),有帮助

    参考: #418

mssql

  • [mssql]

    添加了 NVarchar 类型(生成 NVARCHAR),以及 MSUnicode,它为 NVarchar 提供 Unicode 转换,而与方言 convert_unicode 设置无关。

oracle

  • [oracle]

    轻微 支持二进制,但仍然需要弄清楚如何插入相当大的值(超过 4K)。需要发送 auto_setinputsizes=True 到 create_engine(),行必须单独完全获取等等。

misc

  • [postgres]

    修复了表的初始 checkfirst 以考虑当前 schema

    参考: #424

  • [postgres]

    postgres 有一个可选的 “server_side_cursors=True” 标志,它将利用服务器端游标。这些适用于仅获取部分结果,并且对于处理非常大的无界结果集是必要的。虽然我们希望这是默认行为,但不同的环境似乎有不同的结果,并且原因尚未隔离,因此我们暂时将此功能默认关闭。使用最近在 psycopg 邮件列表中发现的显然未记录的 psycopg2 行为。

  • [postgres]

    为带有 PGBigInteger/autoincrement 的 postgres 表添加了 “BIGSERIAL” 支持

  • [postgres]

    修复了 postgres 反射以更好地处理 schema 名称存在的情况;感谢 jason (at) ncsmags.com

    参考: #402

  • [firebird]

    约束创建的顺序是将主键放在所有其他约束之前;firebird 需要这样做,对于其他数据库来说也不是一个坏主意

    参考: #408

  • [firebird]

    Firebird 修复了自动加载多字段外键的问题

    参考: #409

  • [firebird]

    Firebird NUMERIC 类型正确处理没有精度的类型

    参考: #409

0.3.3

发布日期:2006 年 12 月 15 日星期五
  • [no_tags]

    修复了基于字符串的 FROM 子句,例如 select(…, from_obj=[“sometext”])

  • [no_tags]

    修复了 passive_deletes 标志,lazy=None (noload) 标志

  • [no_tags]

    添加了处理大型集合的示例/文档

  • [no_tags]

    为 sqlalchemy 命名空间添加了 object_session() 方法

  • [no_tags]

    修复了 QueuePool 错误,使其能够更好地重新连接到无法访问的数据库(感谢 Sébastien Lelong),还修复了 dispose() 方法

  • [no_tags]

    使 MySQL rowcount 正确工作的补丁!

    参考: #396

  • [no_tags]

    修复了 MySQL 对 2006/2014 错误的捕获,以正确地重新引发 OperationalError 异常

0.3.2

发布日期:2006 年 12 月 10 日星期日
  • [no_tags]

    修复了主要的连接池错误。修复了 MySQL 同步错误,还将防止事务在所有数据库中意外回滚

    参考: #387

  • [no_tags]

    相对于 0.3.1 进行了主要的提速,使速度恢复到 0.2.8 水平

  • [no_tags]

    有条件地生成了数十个调试日志调用,这些调用在生成日志消息时非常耗时

  • [no_tags]

    修复了级联规则中的错误,整个对象图可能在保存/更新级联上不必要地级联

  • [no_tags]

    属性模块中的各种加速

  • [no_tags]

    Session 中的标识映射默认情况下不再是弱引用。要使其成为弱引用,请使用 create_session(weak_identity_map=True) 修复

    参考: #388

  • [no_tags]

    MySQL 检测到错误 2006(服务器已关闭)和 2014(命令不同步),并使发生错误的连接无效。

  • [no_tags]

    MySQL bool 类型修复

    参考: #307

  • [no_tags]

    postgres 反射修复

    参考: #349, #382

  • [no_tags]

    为 EXCEPT、INTERSECT、EXCEPT ALL、INTERSECT ALL 添加了关键字

    参考: #247

  • [no_tags]

    assignmapper 扩展中的 assign_mapper 返回创建的 mapper

    参考: #2110

  • [no_tags]

    为 Select 类添加了 label() 函数,当 scalar=True 用于创建标量子查询时,例如 “select x, y, (select max(foo) from table) AS foomax from table”

  • [no_tags]

    为 ForeignKey 添加了 onupdate 和 ondelete 关键字参数;如果存在,则传播到基础 ForeignKeyConstraint。(但是,不要在另一个方向传播)

  • [no_tags]

    修复了 session.update() 以保留传入对象的 “dirty” 状态

  • [no_tags]

    通过 in_() 函数将 selectable 发送到 IN 不再从多个 selects 中创建 “union”;现在只允许将一个 selectable 发送到 in_() 函数(如果需要 union,请自己制作 union)

  • [no_tags]

    改进了通过 cascade=”none” 等禁用保存-更新级联的支持。

  • [no_tags]

    为 relation() 添加了 “remote_side” 参数,仅与自引用 mapper 一起使用,以强制父/子关系的方向。替换了 “foreignkey” 参数用于 “切换” 方向的用法。“foreignkey” 参数已弃用用于所有用途,最终将被专用于 mapper 上 ForeignKey 规范的参数替换。

0.3.1

发布日期:2006 年 11 月 13 日星期一

orm

  • [orm]

    “delete” 级联将加载所有子对象(如果尚未加载)。可以通过在 relation() 上设置 passive_deletes=True 来关闭此功能(即旧行为)。

  • [orm]

    调整了重新设计的预先查询生成,以避免在循环预先加载的关系(如 backref)上失败

  • [orm]

    修复了 eagerload()(或 lazyload())选项未正确指示 Query 在生成 LIMIT 查询时是否使用 “nesting” 的错误。

  • [orm]

    修复了刷新时循环依赖排序中的错误;如果对象 A 包含与对象 B 的循环多对一关系,并且对象 B 刚刚附加到对象 A, 对象 B 本身未更改,则 B 的主键属性到 A 的外键属性的多对一同步将不会发生。

    参考: #360

  • [orm]

    为 query.count 实现了 from_obj 参数,改进了 selectresults 上的 count 函数

    参考: #325

  • [orm]

    在 ORM 关系的 “cascade” 步骤中添加了一个断言,以检查附加到父对象的对象的类是否合适(即,如果 A.items 存储 B 对象,则在将 C 附加到 A.items 时引发错误)

  • [orm]

    新的扩展 sqlalchemy.ext.associationproxy,提供透明的 “关联对象” 映射。新示例 examples/association/proxied_association.py 说明了这一点。

  • [orm]

    改进了单表继承以加载目标类下的完整层次结构

  • [orm]

    修复了拓扑排序中节点可能出现两次的细微条件,对于

    参考: #362

  • [orm]

    拓扑排序的额外返工、重构,为了

    参考:#365

  • [orm]

    对于某种类型,“delete-orphan” 可以设置在多个父类上;实例只有在未附加到任何这些父类时才是“孤立的”

杂项

  • [engine/pool]

    一些新的 Pool 实用程序类,更新的文档

  • [engine/pool]

    Pool 上的 “use_threadlocal” 默认为 False(与 create_engine 相同)

  • [engine/pool]

    修复了 Compiled 对象的直接执行

  • [engine/pool]

    create_engine() 重构为严格对待传入的 **kwargs。所有关键字参数必须被方言、连接池和引擎构造函数之一使用,否则将抛出 TypeError,其中描述了相对于所选方言/池/引擎配置的完整无效 kwargs 集。

  • [databases/types]

    MySQL 捕获 “describe” 上的异常并报告为 NoSuchTableError

  • [databases/types]

    进一步修复 sqlite 布尔值,作为默认值时不起作用

  • [databases/types]

    修复了在使用模式时 postgres 序列引用问题

0.3.0

发布日期:2006 年 10 月 22 日星期日

通用

  • [general]

    日志记录现在通过标准 python “logging” 模块实现。“echo” 关键字参数仍然有效,但为其各自的类/实例设置/取消设置日志级别。所有日志记录都可以通过 Python API 直接控制,方法是在 “sqlalchemy” 命名空间中为记录器设置 INFO 和 DEBUG 级别。类级别日志记录在 “sqlalchemy.<module>.<classname>” 下,实例级别日志记录在 “sqlalchemy.<module>.<classname>.0x..<00-FF>” 下。测试套件包括 “–log-info” 和 “–log-debug” 参数,它们独立于 –verbose/–quiet 工作。日志记录已添加到 orm 以允许跟踪映射器配置、行迭代。

  • [general]

    文档生成系统已经过彻底改造,设计更简单,与 Markdown 的集成度更高

orm

  • [orm]

    属性跟踪已修改为更智能地检测更改,特别是对于可变类型。TypeEngine 对象现在在定义如何比较两个标量实例方面发挥更大的作用,包括添加 PickleType 实现的 MutableType mixin。单元工作现在将 “dirty” 列表跟踪为属性管理器检测到更改的所有持久对象的表达式。修复的基本问题是检测 PickleType 对象上的更改,但也概括了类型处理和 “modified” 对象检查,使其更完整和可扩展。

  • [orm]

    对 “attribute loader” 和 “options” 架构进行了广泛的重构。ColumnProperty 和 PropertyLoader 通过可切换的 “策略” 定义其加载行为,MapperOptions 不再使用映射器/属性复制来运行;它们在查询/实例时通过 QueryContext 和 SelectionContext 对象传播。用于处理继承以及 options() 的所有内部映射器和属性复制都已删除;映射器和属性的结构比以前简单得多,并且在新 ‘interfaces’ 模块中清晰地列出。

  • [orm]

    与映射器/属性的彻底改造相关,对映射器 instances() 方法进行了内部重构,以使用 SelectionContext 对象来跟踪操作期间的状态。轻微的 API 破坏:MapperExtension 上的 append_result() 和 populate_instances() 方法由于更改而具有略微不同的方法签名;希望这些方法目前尚未被广泛使用。

  • [orm]

    instances() 方法已移动到 Query,向后兼容版本保留在 Mapper 上。

  • [orm]

    添加了 contains_eager() MapperOption,与 instances() 结合使用以指定应从结果集中急切加载的属性,默认情况下使用其纯列名,或者使用自定义行转换函数进行转换。

  • [orm]

    对单元工作提交方案进行了更多重新排列,以更好地允许循环刷新中的依赖关系正常工作……更新了任务遍历/日志记录实现

  • [orm]

    多态映射器(即使用继承)现在按所有继承类中的表的顺序生成 INSERT 语句

    参考:#321

  • [orm]

    为映射添加了自动 “行切换” 功能,它将检测具有相同标识键的挂起实例/已删除实例对,并将 INSERT/DELETE 转换为单个 UPDATE

  • [orm]

    “关联” 映射简化为利用自动 “行切换” 功能

  • [orm]

    “自定义列表类” 现在通过 relation() 的 “collection_class” 关键字参数实现。旧方法仍然有效,但已弃用

    参考:#212

  • [orm]

    向 relation() 添加了 “viewonly” 标志,允许构建对 flush() 过程没有影响的关系。

  • [orm]

    向基本 Query select/get 函数添加了 “lockmode” 参数,包括 “with_lockmode” 函数以获取具有默认锁定模式的 Query 副本。会将 “read”/“update” 参数转换为 select 端的 for_update 参数。

    参考:#292

  • [orm]

    在 Query/Mapper 中实现了 “版本检查” 逻辑,当 version_id_col 生效且 query.with_lockmode() 用于 get() 已加载的实例时使用

  • [orm]

    post_update 行为得到改进;在不更新太多行方面做得更好,仅更新必需的列

    参考:#208

  • [orm]

    调整了急切加载,使其 “急切链” 与正常的映射器设置保持分离,从而防止与延迟加载器操作冲突,修复了

    参考:#308

  • [orm]

    修复了延迟组加载

  • [orm]

    session.flush() 不会关闭它打开的连接

    参考:#346

  • [orm]

    为映射器添加了 “batch=True” 标志;如果为 False,save_obj 将一次完全保存一个对象,包括调用 before_XXXX 和 after_XXXX

  • [orm]

    为映射器添加了 “column_prefix=None” 参数;将给定的字符串(通常为 ‘_’)前置到从映射器的 Table 自动设置的基于列的属性

  • [orm]

    在 query.select() 的 from_obj 参数中指定连接将替换查询的主表,如果该表在给定的 from_obj 中的某个位置。这使得在查询中生成自定义连接和外连接成为可能,而不会使主表添加两次。

    参考:#315

  • [orm]

    急切加载已调整为更周到地将其 LEFT OUTER JOIN 连接到给定的查询,查找可能已设置的自定义 “FROM” 子句。

  • [orm]

    向 SelectResults 添加了 join_to 和 outerjoin_to 转换方法,以基于属性名称构建 join/outerjoin 条件。还添加了 select_from 以显式设置 from_obj 参数。

  • [orm]

    从映射器中删除了 “is_primary” 标志。

sql

  • [sql] [construction]

    将 “for_update” 参数更改为接受 False/True/“nowait” 和 “read”,后两者仅由 Oracle 和 MySQL 解释

    参考:#292

  • [sql] [construction]

    向 sql 方言添加了 extract() 函数(SELECT extract(field FROM expr))

  • [sql] [construction]

    BooleanExpression 包括新的 “negate” 参数,用于指定适当的否定运算符(如果可用)。

  • [sql] [construction]

    在 “IN” 或 “IS” 子句上调用否定将导致 “NOT IN”、“IS NOT”(而不是 NOT (x IN y))。

  • [sql] [construction]

    Function 对象现在知道在 FROM 子句中做什么。它们的行为应该相同,只是现在您还可以执行 select([‘*’], from_obj=[func.my_function()]) 之类的操作,以从结果中获取多个列,甚至可以使用 sql.column() 构造来命名返回列

    参考:#172

schema

  • [schema]

    对 schema 包进行了相当多的清理,删除了模棱两可的方法、不再需要的方法。稍微更受约束的用法,更强调显式性

  • [schema]

    Table 和其他可选择对象的 “primary_key” 属性变为类集合 ColumnCollection 对象;已排序但未按数字索引。可以通过 table1.primary_key==table2.primary_key 生成从相同底层表派生的两个 pk 之间的比较子句(例如两个 Alias 对象)

  • [schema]

    ForeignKey(Constraint) 支持 “use_alter=True”,通过 ALTER 创建/删除外键。这允许设置循环外键关系。

  • [schema]

    从 Table 和 Column 中删除了 append_item() 方法;最好内联构造 Table/Column/相关对象,但如果需要,请使用 append_column()、append_foreign_key()、append_constraint() 等。

  • [schema]

    table.create() 不再返回 Table 对象,而是没有返回值。通常的情况是通过元数据创建表,这是首选的,因为它将处理表依赖关系。

  • [schema]

    添加了 UniqueConstraint(在 Table 级别)和 CheckConstraint(在 Table 或 Column 级别)。

  • [schema]

    Column 上的 index=False/unique=True 现在创建一个 UniqueConstraint,index=True/unique=False 创建一个普通 Index,Column 上的 index=True/unique=True 创建一个唯一 Index。column 的 ‘index’ 和 ‘unique’ 关键字参数现在仅为布尔值;对于索引或唯一约束的显式名称和分组,请显式使用 UniqueConstraint/Index 构造。

  • [schema]

    向 Column 添加了 autoincrement=True;如果显式设置为 False,将禁用 postgres/mysql/mssql 的 SERIAL/AUTO_INCREMENT/identity seq 的模式生成

  • [schema]

    TypeEngine 对象现在具有处理复制和比较其特定类型值的方法。目前由 ORM 使用,请参见下文。

  • [schema]

    修复了在显式覆盖主键列时反射期间发生的条件,其中 PrimaryKeyConstraint 会将反射列和程序化列都加倍

  • [schema]

    通常,Column 和 ColumnElement 上的 “foreign_key” 属性已弃用,取而代之的是基于列表/集合的 “foreign_keys” 属性,该属性考虑了一个列上的多个外键。“foreign_key” 将返回 “foreign_keys” 列表/集合中的第一个元素,如果列表为空,则返回 None。

sqlite

  • [sqlite]

    sqlite 布尔数据类型默认将 False/True 转换为 0/1

  • [sqlite]

    修复了 Date/Time (SLDate/SLTime) 类型;现在和 postgres 一样好用

    参考:#335

oracle

  • [oracle]

    Oracle 具有对 cx_Oracle.TIMESTAMP 的实验性支持,这需要在游标上调用 setinputsizes(),现在通过 oracle 方言的 ‘auto_setinputsizes’ 标志启用。

杂项

  • [ms-sql]

    修复了 bug 261(MS-SQL 区分大小写数据库的表反射已损坏)

  • [ms-sql]

    现在可以为 pymssql 指定端口

  • [ms-sql]

    为 IDENTITY 列指定值时,引入了新的 “auto_identity_insert” 选项,用于在 “SET IDENTITY_INSERT” 模式之间自动切换

  • [ms-sql]

    现在支持多列外键

  • [ms-sql]

    修复了反射日期/日期时间列

  • [ms-sql]

    添加了 NCHAR 和 NVARCHAR 类型支持

  • [firebird]

    别名不使用 “AS”

  • [firebird]

    在反射不存在的表时正确引发 NoSuchTableError

  • [connections/pooling/execution]

    连接池跟踪打开的游标,并在连接返回到池时自动关闭它们,如果连接返回到池时游标仍然打开。可能会受到选项的影响,这些选项会导致它引发错误,或者什么也不做。修复了 MySQL 和其他问题

  • [connections/pooling/execution]

    修复了 Connection 在 commit/rollback 后不会丢失其 Transaction 的 bug

  • [connections/pooling/execution]

    向 ComposedSQLEngine、ResultProxy 添加了 scalar() 方法

  • [connections/pooling/execution]

    ResultProxy 将在 ResultProxy 本身关闭时 close() 底层游标。这将为已获取所有行(或已调用 scalar())的 ResultProxy 对象自动关闭游标。

  • [connections/pooling/execution]

    ResultProxy.fetchall() 内部使用 DBAPI fetchall() 以获得更好的效率,也添加到映射器迭代中(感谢 Michael Twomey)