对于支持它的后端,跨后端的功能差异很大,包括对 executemany() 和其他返回多行的语句的限制。请阅读正在使用的数据库的文档注释,以确定 RETURNING 的可用性。...对于支持它的后端,跨后端的功能差异很大,包括对 executemany() 和其他返回多行语句的限制。请阅读正在使用的数据库的文档注释,以确定 RETURNING 的可用性。...对于支持的后端,跨后端的功能差异很大,包括对 executemany() 和其他返回多行的语句的限制。请阅读所使用数据库的文档注释,以确定 RETURNING 的可用性。...对于支持它的后端,跨后端的功能差异很大,包括对 executemany()和返回多行的其他语句的限制。请阅读所使用数据库的文档注释,以确定 RETURNING 的可用性。...对于支持它的后端,跨后端的功能差异很大,包括对 executemany()和其他返回多行的语句的限制。请阅读所使用数据库的文档注释,以确定 RETURNING 的可用性。
发送到Session.execute.params参数的参数字典列表,与Insert对象本身分开,将为语句调用批量插入模式,这基本上意味着该操作将尽可能地优化多行: >>> from sqlalchemy...使用 RETURNING 获取新对象 批量 ORM 插入功能支持选定后端的 INSERT…RETURNING,该功能可以返回一个Result对象,该对象可能会返回单个列以及对应于新生成记录的完全构造的...举例来说,下面发出一个 UPDATE,影响多行的“fullname”字段 >>> from sqlalchemy import update >>> stmt = ( ......举个例子,下面发出了一个更新,影响了多行的“fullname”字段 >>> from sqlalchemy import update >>> stmt = ( ......要删除多行联接继承对象而不使用级联外键,需分别为每个表发出 DELETE 语句: >>> from sqlalchemy import delete >>> session.execute(delete
在这种情况下,SQLAlchemy 使用特殊逻辑重新组织 INSERT 语句,以便在支持 RETURNING 的同时可以为多行调用它。...在这种情况下,SQLAlchemy 利用特殊逻辑重新组织 INSERT 语句,以便可以为多行调用它,同时仍支持 RETURNING。...但是 RETURNING 子句也可以使用 `Insert.returning()` 方法来明确指定;在这种情况下,执行语句时返回的 `Result` 对象具有可提取的行: ```py >>> insert_stmt...但是,也可以使用Insert.returning()方法显式指定 RETURNING 子句;在这种情况下,执行该语句时返回的Result对象具有可以获取的行: >>> insert_stmt = insert...但是,也可以使用Insert.returning()方法显式指定 RETURNING 子句;在这种情况下,执行该语句时返回的Result对象具有可以获取的行: >>> insert_stmt = insert
在使用 ORM 时,对所有 INSERT、UPDATE 和 DELETE 语句使用 Session.execute() 方法会返回此类型的对象。...在使用 ORM 时,Session.execute() 方法为所有 INSERT、UPDATE 和 DELETE 语句返回此类型的对象。...ORM 的批量/多行功能Session直接使用insert()、update()和delete()构造,并且它们的使用方式类似于与 SQLAlchemy Core 一起使用它们的方式(首次在本教程中介绍于使用...批量/多行 INSERT、upsert、UPDATE 和 DELETE 此部分讨论的工作单元技术旨在将 dml 或 INSERT/UPDATE/DELETE 语句与 Python 对象机制集成,通常涉及复杂的相互关联对象图...ORM Session的批量/多行功能直接使用了 insert()、update() 和 delete() 构造,并且它们的使用方式类似于它们在 SQLAlchemy Core 中的使用方式(首次在本教程中介绍了使用
这允许在一个语句中插入许多行,同时还能返回新生成的主键值以及 SQL 和服务器默认值。...基准测试 SQLAlchemy 在examples/目录中包含一个性能套件,我们可以利用bulk_insert套件以不同的方式使用 Core 和 ORM 来对许多行进行 INSERT 的基准测试。...这允许一次插入许多行,同时还能够返回新生成的主键值以及 SQL 和服务器默认值。...基准测试 SQLAlchemy 在examples/目录中包含一个性能套件,在这里我们可以利用bulk_insert套件以不同的方式使用 Core 和 ORM 来对插入多行的 INSERT 进行基准测试...bulk_insert 套件以不同方式使用 Core 和 ORM 来对插入多行的性能进行基准测试。
SQLAlchemy 的反射过程,在检查类型时,使用一个简单的查找表将返回的关键字链接到提供的 SQLAlchemy 类型。这个查找表存在于 SQLite 方言中,就像所有其他方言一样。...该类基于方言无关的 Insert 结构,可以使用 SQLAlchemy Core 中的 insert() 函数构造。...(): >>> from sqlalchemy.dialects.sqlite import insert >>> insert_stmt = insert(my_table).values( ......使用将在约束失败时插入的值更新行: >>> stmt = insert(my_table).values( ......当 SQLAlchemy 的反射过程检查类型时,它使用一个简单的查找表将返回的关键字链接到提供的 SQLAlchemy 类型。这个查找表存在于 SQLite 方言中,就像存在于所有其他方言中一样。
为了解决仅返回主实体对象而不是额外列的问题,使用 Result.columns() 方法: # 1.4 / 2.0 code stmt = ( select(User, Address.email_address...ORM 行默认情况下不唯一 概要 通过session.execute(stmt)返回的 ORM 行不再自动“唯一化”。...要解决仅返回主实体对象而不是额外列的问题,请使用Result.columns()方法: # 1.4 / 2.0 code stmt = ( select(User, Address.email_address...要解决仅返回主实体对象而不是额外列的问题,请使用Result.columns() 方法: # 1.4 / 2.0 code stmt = ( select(User, Address.email_address...默认情况下 ORM 行不唯一 简介 session.execute(stmt) 返回的 ORM 行不再自动“唯一”。
此扩展方法允许在单个语句中插入多行,使用语句的扩展 VALUES 子句。...- 10}, synchronize_session="fetch" ) 如果后端数据库支持,现在将使用 RETURNING;目前包括 PostgreSQL 和 SQL Server(Oracle 方言不支持返回多行...此扩展方法允许在单个语句中插入多行,使用语句的扩展 VALUES 子句。...这个扩展方法允许在单个语句中插入多行,使用扩展的 VALUES 子句。...这个扩展方法允许在单个语句中插入多行,使用扩展的 VALUES 子句。
#2161 行为变化 - ORM 当按属性查询时,现在会返回组合属性的对象形式 现在,将Query与组合属性结合使用时,会返回由该组合维护的对象类型,而不是被拆分为个别列。...这与 SQLAlchemy 中缺少多对一关系返回 None 的事实一致,因此代理值也应该如此。...同样,这个操作也会在Insert或Update中发生: stmt = mytable.update().values(col=bp) 在上面的例子中,bp保持不变,但在执行语句时将使用String类型,...类似地,这个操作发生在Insert或Update中: stmt = mytable.update().values(col=bp) 在上面的例子中,bp保持不变,但当语句执行时将使用String类型,我们可以通过检查...类似地,这个操作发生在Insert或Update中: stmt = mytable.update().values(col=bp) 在上面的例子中,bp保持不变,但当语句执行时将使用String类型,我们可以通过检查
当覆盖内置 SQL 结构的编译时,@compiles 装饰器会调用适当的类(确保使用类,即 Insert 或 Select,而不是创建函数,比如 insert() 或 select())。...当重写内置 SQL 构造的编译时,@compiles 装饰器会在适当的类上调用(确保使用类,即 Insert 或 Select,而不是创建函数,如 insert() 或 select())。...返回值是一个Compiled对象。对返回值调用str()或unicode()将产生结果的字符串表示。Compiled对象还可以使用params访问器返回绑定参数名称和值的字典。...使用 lambda_stmt() 函数构建 StatementLambdaElement: from sqlalchemy import lambda_stmt stmt = lambda_stmt(...例如: >>> def my_stmt(parameter): ... stmt = lambda_stmt( ...
;通常,只应该使用返回行的 SQL 语句与此选项一起使用。...(): >>> from sqlalchemy.dialects.mysql import insert >>> insert_stmt = insert(my_table).values( ......(): >>> from sqlalchemy.dialects.mysql import insert >>> insert_stmt = insert(my_table).values( ......insert_stmt = insert(my_table).values( ......为了引用所提出的插入行,特殊别名 Insert.inserted 可作为 Insert 对象的属性使用;这个对象是一个包含目标表所有列的 ColumnCollection: >>> stmt = insert
insert insert_stmt = insert(my_table).values(id="some_id", data="some data to insert") on_conflict_stmt...insert insert_stmt = insert(my_table).values(id="some_id", data="some data to insert") on_conflict_stmt...insert insert_stmt = insert(my_table).values(id="some_id", data="some data to insert") on_conflict_stmt...在 SQLAlchemy 中,如果很少(如果有的话)使用了 auto_convert_lobs=False 选项,并且在 LOB 对象可以被消耗之前读取了更多行,则可能会发生错误。...在 SQLAlchemy 中,该错误可能发生在很少(如果有的话)使用了 auto_convert_lobs=False 选项,并且与之前的 cx_Oracle 5.x 系列一起使用,以及在 LOB 对象可以被消耗之前读取了更多行的情况下
,用于返回数组的array_agg() SQL 函数,现在可以使用array_agg: from sqlalchemy import func stmt = select([func.array_agg...在这个领域支持的完整语法: from sqlalchemy.dialects.postgresql import insert insert_stmt = insert(my_table).values...,用于返回一个数组的 array_agg() SQL 函数,现在可以使用 array_agg: from sqlalchemy import func stmt = select([func.array_agg...,用于返回一个数组的 array_agg() SQL 函数,现在可以使用 array_agg 进行调用: from sqlalchemy import func stmt = select([func.array_agg...9.5 在这个领域支持的完整语法: from sqlalchemy.dialects.postgresql import insert insert_stmt = insert(my_table).values
default – 当给定索引处没有值时,将返回的值。 datatype – 当字段为空时使用的默认数据类型。...default – 在给定索引处没有值时返回的值。 datatype – 当字段为空时使用的默认数据类型。...否则,返回值必须是一个遵循与 sqlalchemy.ext.instrumentation.INSTRUMENTATION_MANAGER 相同指南的仪器工厂。...如果所有查找器都返回 None,则使用标准的 ClassManager 仪器。...如果所有查找器都返回 None,则使用标准的 ClassManager 仪器化。
column("y")) >>> insert_stmt = insert(my_table).values(x="foo") >>> insert_stmt = insert_stmt.on_conflict_do_nothing...下面我们使用 PostgreSQL 方言: >>> from sqlalchemy.dialects import postgresql >>> print(insert_stmt.compile(dialect...table("my_table", column("x"), column("y")) >>> insert_stmt = insert(my_table).values(x="foo") >>> insert_stmt...下面我们使用了一个 PostgreSQL 方言: >>> from sqlalchemy.dialects import postgresql >>> print(insert_stmt.compile...下面我们使用一个 PostgreSQL 方言: >>> from sqlalchemy.dialects import postgresql >>> print(insert_stmt.compile(
select() SQL 表达式构造 select() 构造以与 insert() 相同的方式构建语句,使用 生成式 方法,其中每个方法都会将更多的状态添加到对象上。...,并且在更复杂的情况下可以由 INSERT、UPDATE 或 DELETE 语句的 RETURNING 子句组成。...选择(select())SQL 表达式构造 select() 构造以与 insert() 相同的方式构建语句,使用一种生成式方法,其中每个方法都向对象添加更多状态。...,并且在更复杂的情况下可能由 INSERT、UPDATE 或 DELETE 语句的 RETURNING 子句组成。...,并且在更复杂的情况下可以从 INSERT、UPDATE 或 DELETE 语句的 RETURNING 子句组成。
检查来自启用 ORM 的 SELECT 和 DML 语句的实体和列 select() 构造,以及 insert()、update() 和 delete() 构造(对于后者的 DML 构造,在 SQLAlchemy...给定一个 AliasedClass,使用 inspect() 函数将返回 AliasedInsp 对象: from sqlalchemy import inspect from sqlalchemy.orm...使用 ORM 启用的 SELECT 语句显式使用 join() 涉及使用 Select.select_from() 方法,如下所示: from sqlalchemy.orm import join stmt...检查启用 ORM 的 SELECT 和 DML 语句中的实体和列 select() 结构以及 insert()、update() 和 delete() 结构(自 SQLAlchemy 1.4.33 起,...给定一个AliasedClass,使用inspect()函数将返回一个AliasedInsp对象: from sqlalchemy import inspect from sqlalchemy.orm
在这种情况下,通常无法仅使用两个 INSERT 语句插入“widget”和“entry”行;必须执行 UPDATE 以保持外键约束满足。...在这种情况下,通常不可能只使用两个 INSERT 语句插入“widget”和“entry”行;必须执行 UPDATE 以保持外键约束得到满足。...的上下文中使用Session.execute()方法调用(就像用于 ORM-Enabled INSERT、UPDATE 和 DELETE 语句功能的现在使用的update()和delete()构造一样)...、UPDATE 和 DELETE 语句(ORM-Enabled INSERT, UPDATE, and DELETE statements) ORM 批量 INSERT 语句(ORM Bulk INSERT...在使用 ORM 时,通常会使用 aliased() 构造来表示这些目标,但这不是严格要求的,特别是如果加入的实体不会在结果中返回的情况下。
从 SQLAlchemy 2.0 开始,默认还使用 “插入多个值”行为适用于 INSERT 语句 功能来优化多行 INSERT 语句;对于 SQL Server,该功能适用于 RETURNING 和非...截至目前,PyODBC 驱动程序无法在使用 OUTPUT INSERTED 时返回行数。...从 SQLAlchemy 2.0 开始,默认还使用 INSERT 语句的“插入多个值”行为功能来优化多行 INSERT 语句;对于 SQL Server,该功能适用于 RETURNING 和非 RETURNING...从 SQLAlchemy 2.0 开始,默认还使用“Insert Many Values” Behavior for INSERT statements 功能来优化多行 INSERT 语句;对于 SQL...截至本文撰写时,PyODBC 驱动程序无法在使用 OUTPUT INSERTED 时返回行数。
需要一行)出现故障,以及在插入多行的情况下出现任意返回数据(例如,许多行中的第一行)。...如果需要插入的数据,应该使用常规的显式Insert.returning()来返回可变数量的结果行。...这有助于修复一个 bug,即在支持的后端上,INSERT…FROM SELECT 结构会被错误地编译为“隐式返回”,这会导致在插入零行的情况下出现故障(因为隐式返回期望一行),以及在插入多行的情况下出现任意返回数据...returning 需要一行),以及在插入多行的情况下出现任意返回数据(例如,多行中的第一行)。...以前,有一个文档说明,即在某些数据库不支持返回并且因此无法执行“implicit”返回的情况下,可能更喜欢使用 inline=True 与 INSERT…FROM SELECT,但无论如何,INSERT
领取专属 10元无门槛券
手把手带您无忧上云