原文:docs.sqlalchemy.org/en/20/contents.html 插入,更新,删除 原文:docs.sqlalchemy.org/en/20/core/dml.html...在执行时,要返回的列的值通过结果集可用,并可使用CursorResult.fetchone()等进行迭代。...但是,与直接使用UpdateBase.returning()时不同,列的顺序是未定义的,因此只能使用名称或Row._mapping键来定位它们;它们不能可靠地以位置为目标。...但是,与直接使用 UpdateBase.returning() 不同,列的顺序是未定义的,因此只能使用名称或 Row._mapping 键进行定位;它们不能可靠地按位置进行定位。...请参阅 使用 SQL 函数 教程,了解如何使用 func 对象在语句中渲染 SQL 函数的背景知识。
文件列表 文件列表: bulk_updates.py - 这一系列的测试将说明不同的方法来批量更新大量行(正在建设中!...在这些示例中,使用不同类型的分片对相同的基本示例进行操作,该示例根据每个大陆的天气数据进行处理。...文件列表 文件列表: bulk_updates.py - 这一系列的测试将演示不同的方式来批量更新大量行(正在建设中!...给定的扩展生成一个匿名的“历史”类,该类表示目标对象的历史版本。 与在相同表中将更新写为新行的使用时间行进行版本控制示例进行比较,而不使用单独的历史表。...与使用时间行进行版本控制示例进行比较,该示例将更新写入为同一表中的新行,而不使用单独的历史表。
本文将以Mysql举例,介绍sqlalchemy的基本用法。其中,Python版本为2.7,sqlalchemy版本为1.1.6。 一....通过sessionmaker调用创建一个工厂,并关联Engine以确保每个session都可以使用该Engine连接资源: from sqlalchemy.orm import sessionmaker...Q1:add之后如何直接返回对象的属性? 可以在add之后执行db.session.flush(),这样便可在session中get到对象的属性。 Q2:如何进行批量插入,性能比较?...批量插入共有以下几种方法,对它们的批量做了比较,分别是: session.add_all() SQLAlchemy_core...,而要对查询获取对象属性之后再更新的场景就需要使用后者。
这是与 1.x 系列相比的行为变更,在那里 Insert 将以 Core 为中心的方式解释,使用列名作为值键;现在接受 ORM 属性键。...### 联合表继承的按主键批量更新 当使用具有联合表继承的映射时,ORM 批量更新的行为与使用映射进行批量插入时类似;如 联合表继承的批量插入 中所述,批量更新操作将为映射中表示的每个表发出一条 UPDATE...使用 RETURNING 获取新对象 批量 ORM 插入功能支持为选定的后端进行 INSERT…RETURNING,该功能可以返回一个 Result 对象,该对象可以返回单个列以及对应于新生成记录的完全构造的...传递包含完整主键值的参数字典列表以及 Update 构造将调用根据主键进行批量更新模式的语句,生成适当的 WHERE 条件以匹配每个主键的行,并使用 executemany 对 UPDATE 语句运行每个参数集...这种使用方式与之前描述的 ORM 按主键批量更新中的功能不同,ORM 使用给定的 WHERE 子句如所示,而不是将 WHERE 子句修复为按主键。
类似的调整已经针对“批量更新和删除”进行了,以便 Core 的 update() 和 delete() 可用于批量操作。...对“批量更新和删除”进行了类似的调整,以便核心update()和delete()可用于批量操作。...对“批量更新和删除”进行了类似的调整,以便 Core update()和delete()可以用于批量操作。...#5263 ORM 批量更新和删除在可用时使用 RETURNING 进行“fetch”策略 使用“fetch”策略的 ORM 批量更新或删除: sess.query(User).filter(User.age...,其中单个批量更新或删除可能在一些支持 RETURNING 的后端中进行多路复用,而一些不支持。
当正确使用时,这个面向专家的系统可以允许使用 ORM 映射生成批量插入和更新语句批量执行,使语句以与直接使用 Core 相媲美的速度进行。...另请参阅 批量操作 - 介绍和完整文档 #3100 新性能示例套件 受到批量操作功能以及 FAQ 中的如何对 SQLAlchemy 驱动的应用程序进行性能分析?...新功能和改进 - ORM 新会话批量插入/更新 API 创建了一系列新的Session方法,直接提供钩子到工作单元的功能,用于生成批量插入和更新语句分组,使语句可以以与直接使用 Core 相媲美的速度进行批量处理...另请参阅 批量操作 - 介绍和完整文档 #3100 新性能示例套件 受到为批量操作功能以及如何对 SQLAlchemy 驱动的应用程序进行性能分析?...当正确使用时,这个面向专家的系统可以允许 ORM 映射用于生成批量插入和更新语句,分批执行到 executemany 组,使语句以与直接使用 Core 相媲美的速度进行。
使用 ORM 进行数据操作 - 涵盖了 ORM 的持久化框架;基本上是 ORM 为中心的插入、更新和删除的方式,以及如何处理事务。...处理数据 - 这里我们学习如何在数据库中创建、选择、更新和删除数据。这里所谓的 CRUD 操作以 SQLAlchemy Core 的术语给出,并链接到其 ORM 对应项。...使用 ORM 进行数据操作涵盖了 ORM 的持久性框架;基本上是 ORM-centric 的插入、更新和删除方式,以及如何处理事务。...使用插入语句 原文:docs.sqlalchemy.org/en/20/tutorial/data_insert.html 在使用 Core 以及在使用 ORM 进行批量操作时,可以直接使用insert...但是,即使 ORM 为我们运行它,了解核心如何处理数据创建和操作也非常有用。此外,ORM 还支持使用称为批量/多行插入、更新和删除的功能直接使用 INSERT。
ORM 的批量/多行功能Session直接使用insert()、update()和delete()构造,并且它们的使用方式类似于与 SQLAlchemy Core 一起使用它们的方式(首次在本教程中介绍于使用...与我们 Core 示例中的Insert类似,我们没有包含主键(即id列的条目),因为我们希望利用数据库的自动递增主键特性,此处为 SQLite,ORM 也与之集成。...与我们在核心示例中的Insert类似,我们没有包含主键(即id列的条目),因为我们希望利用数据库的自动递增主键功能,本例中为 SQLite,ORM 也与之集成。...ORM Session的批量/多行功能直接使用了 insert()、update() 和 delete() 构造,并且它们的使用方式类似于它们在 SQLAlchemy Core 中的使用方式(首次在本教程中介绍了使用...这类似于在 使用 ORM 工作单元模式插入行 中注意到的行为,即我们没有明确为其分配值的基于列的属性也会自动显示为 None,而不是像 Python 的通常行为那样引发 AttributeError。
网站上 在使用 ORM 通过主键进行批量更新功能时,如果在给定的记录中没有提供主键值,则会出现此错误,例如: >>> session.execute( ......启用的 UPDATE 语句将自动使用 ORM 通过主键进行批量更新,该批量更新期望参数字典包括主键值,例如: >>> session.execute( ......{"u_name": "patrick", "fullname": "Patrick Star"}, ... ], ... ) 另请参阅 ORM 通过主键进行批量更新 禁用通过主键进行批量 ORM...语句结合使用将自动使用按主键进行 ORM 批量更新,该功能期望参数字典包含主键值,例如: >>> session.execute( ......{"u_name": "patrick", "fullname": "Patrick Star"}, ... ], ... ) 另请参阅 按主键进行 ORM 批量更新 禁用批量 ORM 按主键更新
在不删除的情况下删除集合涉及将外键列设置为 NULL 以进行一对多关系,或者删除相应的关联行以进行多对多关系。...当 Query 对象被要求返回完整实体时,将根据主键对条目进行去重,这意味着如果相同的主键值在结果中出现多次,则仅存在一个该主键的对象。这不适用于针对个别列的查询。...但是,集合可能不能再重新分配为完整的替换集合,因为这样的操作需要将先前的集合完全加载到内存中,以便将旧条目与新条目进行协调: >>> new_account.account_transactions =...但是,集合可能不再被重新分配为完整替换集合,因为这样的操作要求以前的集合完全加载到内存中,以便将旧条目与新条目进行对比: >>> new_account.account_transactions = [...要对特定列进行精细化控制以进行计数,跳过子查询的使用或以其他方式控制 FROM 子句,或者使用 Session.query() 与 expression.func 表达式结合使用,例如: from sqlalchemy
,允许基本的 select() -> Result -> Row 类型功能,包括用于 ORM 类的功能,在要将 Row 对象展开为单独的列条目时,会添加一个小的面向类型的访问器,允许各个 Python...基准测试 SQLAlchemy 在examples/目录中包含一个性能套件,我们可以利用bulk_insert套件以不同的方式使用 Core 和 ORM 来对许多行进行 INSERT 的基准测试。...,允许基本的 select() -> Result -> Row 类型功能运行,包括对 ORM 类的支持,在将 Row 对象拆包为单独的列条目时,添加了一个小的面向类型的访问器,以便使得每个 Python...基准测试 SQLAlchemy 在examples/目录中包含一个性能套件,在这里我们可以利用bulk_insert套件以不同的方式使用 Core 和 ORM 来对插入多行的 INSERT 进行基准测试...bulk_insert 套件以不同方式使用 Core 和 ORM 来对插入多行的性能进行基准测试。
## 批量操作 传统特性 SQLAlchemy 2.0 已将“批量插入”和“批量更新”功能集成到 2.0 风格的 Session.execute() 方法中,直接使用了 Insert 和 Update...批量操作 遗留特性 SQLAlchemy 2.0 将 Session 的“批量插入”和“批量更新”功能集成到了 2.0 风格的 Session.execute() 方法中,直接使用了 Insert 和...通常,包含与上一行不同的 NULL 值组合的每个列集必须省略 INSERT 语句中的一系列不同列,这意味着必须将其作为单独的语句发出。...通常,每个包含与上一行不同组合的 NULL 值的列集必须从呈现的 INSERT 语句中省略一个不同的系列列,这意味着它必须作为一个单独的语句发出。...遗留特性 该方法是 SQLAlchemy 2.0 系列的传统功能。对于现代批量插入和更新,请参阅 ORM 批量插入语句和 ORM 按主键批量更新部分。
ORM 以及 Core 通常通过事件钩子进行扩展。...与MapperEvents.mapper_configured()事件相比,该事件在配置操作进行时基于每个映射器调用;与该事件不同,当调用此事件时,所有交叉配置(例如反向引用)也将为任何待定的映射器提供...类的仪器化系统可以使用sqlalchemy.ext.instrumentation模块进行每个类或全局基础上的定制化,该模块提供了构建和指定替代仪器化形式的方法。...将此事件与MapperEvents.mapper_configured()事件进行对比,该事件在配置操作进行时基于每个映射器调用;与该事件不同,当调用此事件时,所有交叉配置(例如反向引用)也将对任何待定映射器可用...类仪器化系统可以使用 sqlalchemy.ext.instrumentation 模块在每个类或全局基础上进行自定义,该模块提供了构建和指定替代仪器化形式的方法。
当前迁移指南 对于 SQLAlchemy 2.0,有两个单独的文档;"主要迁移指南"详细介绍了如何将 SQLAlchemy 1.4 应用程序更新为兼容 SQLAlchemy 2.0。"有什么新内容?"...当前迁移指南 对于 SQLAlchemy 2.0,有两个单独的文档;"主要迁移指南"详细介绍了如何将 SQLAlchemy 1.4 应用程序更新为兼容 SQLAlchemy 2.0。"有什么新内容?"...SQLAlchemy 1.4 还具有改进的标签样式,不再需要使用包含表名以消除来自不同表的相同名称列的歧义的长标签。...新方法利用了aliased()构造,因此 ORM 内部无需猜测应该如何调整哪些实体和列,以及以何种方式进行调整;在上面的示例中,ua和aa对象都是AliasedClass实例,为内部提供了一个明确的标记...SQLAlchemy 1.4 还提供了一种改进的标签样式,不再需要使用包含表名以消除不同表中具有相同名称的列的歧义的长标签。
另请参见 使用声明性进行表配置 - 描述了如何指定要生成的映射Table的组件,包括有关使用mapped_column()构造的注释和选项以及它与Mapped注解类型的交互方式。...在使用 Core 构造Table对象以及在使用 imperative table 配置时,仍然需要Column结构以指示数据库列的存在。...在使用 Core 构造 Table 对象以及使用命令式表配置时,仍然需要 Column 构造来指示数据库列的存在。...例如,在使用对象进行首次创建和填充的 Python 代码中,ORM 映射的属性可能被注释为允许None,但最终该值将被写入到一个NOT NULL的数据库列中。...- 适用于声明式表 为命令式表列应用加载、持久性和映射选项 在设置声明性映射列的加载和持久化选项一节中,我们讨论了在使用声明性表配置时如何设置加载和持久化选项。
DELETE #959 ### 支持混合属性、复合属性的批量更新 现在混合属性(例如sqlalchemy.ext.hybrid)以及复合属性(复合列类型)在使用Query.update()时支持在 UPDATE...#959 ### 支持混合、复合的批量更新 现在,混合属性(例如sqlalchemy.ext.hybrid)以及复合属性(复合列类型)在使用Query.update()更新语句的 SET 子句中均得到支持...No"}) 类似的功能也适用于复合属性,其中复合值将被拆分为其各个列以进行批量更新: session.query(Vertex).update({Edge.start: Point(3, 4)}) 另请参阅...支持混合属性,复合属性的批量更新 混合属性(例如sqlalchemy.ext.hybrid)以及复合属性(复合列类型)现在都支持在使用Query.update()时用于 UPDATE 语句的 SET 子句中...No"}) 类似的功能也适用于复合类型,其中复合值将被拆分为其各个列以进行批量更新: session.query(Vertex).update({Edge.start: Point(3, 4)}) 另请参阅
该行为包括已经 DB 转换的绑定参数值与返回的行值之间的比较,并不总是对于 SQL 列类型(如 UUID)是“对称”的,具体取决于不同的 DBAPI 如何接收这些值以及它们如何返回它们,因此需要在这些列类型上添加额外的...这允许使用参数字典中的 None 值进行批量 ORM 插入,并使用给定的字典键的单个行批处理,而不是将其拆分为每个 INSERT 中省略 NULL 列的批次。..."primary_key"条目;声明式还将这些列转换为特定映射类的正确列。...这允许参数字典中含有混合的 None 值的批量 ORM 插入使用给定的字典键的单个行批次,而不是将每个 INSERT 中的 NULL 列分开成批次。...这允许在参数字典中使用None值的批量 ORM 插入使用给定的一组字典键的单个行批次,而不是将其拆分为省略每个 INSERT 中的 NULL 列的批次。
可变主键 / 更新级联 当实体的主键发生变化时,引用该主键的相关项也必须进行更新。...另请参阅 关系 X 将列 Q 复制到列 P,与关系‘Y’冲突 - 用法示例 cascade – 一个逗号分隔的级联规则列表,确定 Session 操作应该如何从父级到子级进行“级联”。...对于 SQLAlchemy 1.x 的用户 在 SQLAlchemy 2.x 系列中,ORM 的 SQL SELECT 语句是使用与 Core 中相同的select()构造而构建的,然后在Session...批量插入语句中发送 NULL 值 连接表继承的批量插入 使用 SQL 表达式的 ORM 批量插入 遗留会话批量插入方法 ORM“upsert”语句 按主键进行 ORM 批量更新...为具有多个参数集的 UPDATE 语句禁用按主键进行 ORM 批量更新 用于连接表继承的按主键进行批量更新 遗留会话批量更新方法 使用自定义 WHERE 条件的 ORM UPDATE
,这些功能可以根据每个查询的情况改变如何加载属性。...请参阅脚本 separate_schema_translates.py,了解如何使用完整的分片 API 进行上述用例的演示。...当使用 yield_per 时,ORM 将会将 ORM 结果批量成子集合,并在迭代 Result 对象时单独从每个子集合中产生行,这样 Python 解释器就不需要声明非常大的内存区域,这既耗时又导致内存使用过多...,可以根据每个查询的情况更改如何加载属性。...adapt_on_names – 如果为 True,则在将 ORM 实体的映射列与给定可选择的列进行映射时将使用更宽松的“匹配” - 如果给定的可选择没有与实体上的列对应的列,则将执行基于名称的匹配。
当内存中重新排序条目时,position属性的值应更新以反映新的排序顺序: Base = declarative_base() class Slide(Base): __tablename__...必须删除一个条目以为新条目腾出位置。SQLAlchemy 的工作单元在单次刷新中执行所有 INSERT 操作,然后再执行 DELETE 操作。...API 文档 对象名称 描述 set_shard_id 一个加载器选项,用于为语句应用特定的分片 ID 到主查询,以及为其他关系和列加载器。 分片查询 与分片会话一起使用的查询类。...解析顺序为: 如果提供了映射器并且Session.binds存在,则首先基于正在使用的映射器,然后基于正在使用的映射类,然后基于映射类的__mro__中存在的任何基类,从更具体的超类到更一般的超类进行绑定定位...ORM 更新 当使用 ORM 启用的更新时,混合类型可以为自定义的“UPDATE”处理程序定义处理程序,允许将混合类型用于更新的 SET 子句中。
领取专属 10元无门槛券
手把手带您无忧上云