首页
学习
活动
专区
圈层
工具
发布

sqlalchemy bulk insert比生成原始SQL慢

SQLAlchemy是一个Python的SQL工具和对象关系映射(ORM)库,它提供了一种高级的、面向对象的方式来操作数据库。在使用SQLAlchemy进行大批量插入时,使用bulk insert操作相比生成原始SQL语句的方式可能会慢一些。

SQLAlchemy的bulk insert操作是通过将多个数据行打包成一个批量插入的操作,然后一次性执行,从而减少了与数据库的交互次数,提高了插入的效率。而生成原始SQL语句的方式则是逐条生成SQL语句,每次插入一条数据都需要与数据库进行一次交互,这样会增加数据库的负载和网络开销,导致插入速度较慢。

尽管bulk insert操作可能比生成原始SQL语句慢一些,但它仍然是一种高效的插入方式,特别适用于大批量数据的插入场景。它可以减少与数据库的交互次数,提高插入的效率,同时也可以减轻数据库的负载。

对于使用SQLAlchemy进行bulk insert操作,可以使用session.bulk_insert_mappings()方法来实现。该方法接受一个映射字典的列表作为参数,每个映射字典表示一条数据记录。通过一次性插入多条数据,可以提高插入的效率。

以下是一个示例代码:

代码语言:txt
复制
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 创建数据库引擎和会话
engine = create_engine('数据库连接字符串')
Session = sessionmaker(bind=engine)
session = Session()

# 定义映射类
class MyTable(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))

# 构造数据列表
data = [{'id': 1, 'name': 'John'}, {'id': 2, 'name': 'Jane'}, {'id': 3, 'name': 'Bob'}]

# 执行bulk insert操作
session.bulk_insert_mappings(MyTable, data)

# 提交事务
session.commit()

在上述示例中,我们首先创建了数据库引擎和会话,然后定义了一个映射类MyTable,表示数据库中的一张表。接下来,我们构造了一个数据列表data,包含了要插入的多条数据记录。最后,通过调用session.bulk_insert_mappings()方法,将数据列表一次性插入到数据库中。

对于腾讯云的相关产品和产品介绍链接地址,可以参考腾讯云官方文档或者腾讯云的官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SqlAlchemy 2.0 中文文档(二十六)

此事件用于修改实例发生 INSERT 后的仅 Python 状态,并在给定连接上发出附加的 SQL 语句。 在先前步骤中一次性发出它们的 INSERT 语句后,通常会为同一类的一批对象调用此事件。...将值放入该字典中的效果是该值将在工作单元生成的 INSERT 语句中使用。...此事件用于修改实例发生 INSERT 后的仅在 Python 中的状态,以及在给定连接上发出附加的 SQL 语句。 该事件通常在一批相同类的对象的 INSERT 语句一次性发出后被调用。...此事件用于在发生 INSERT 之前修改实例上的本地、非对象相关属性,以及在给定连接上发出附加的 SQL 语句。...将值放入此字典中的效果是该值将在工作单元生成的 INSERT 语句中使用。

47310
  • SqlAlchemy 2.0 中文文档(五十七)

    ,因为在使用 RETURNING 时,单语句 INSERT 语句仍然不可接受地慢,以及在使用 SQL Server 时,似乎无论是否使用 RETURNING,INSERT 语句的 executemany...基准测试 SQLAlchemy 在examples/目录中包含一个性能套件,我们可以利用bulk_insert套件以不同的方式使用 Core 和 ORM 来对许多行进行 INSERT 的基准测试。...基准测试 SQLAlchemy 在examples/目录中包含一个性能套件,在这里我们可以利用bulk_insert套件以不同的方式使用 Core 和 ORM 来对插入多行的 INSERT 进行基准测试...bulk_insert 套件以不同方式使用 Core 和 ORM 来对插入多行的性能进行基准测试。...Session.bulk_insert_mappings() 实现的相同的过程,同时增强了附加功能。

    74910

    SqlAlchemy 2.0 中文文档(十七)

    下面是一个构造性的示例,其中嵌入了每行 SQL 表达式的 INSERT,还以这种形式演示了Insert.returning(): >>> from sqlalchemy import select >>...虽然 SQLAlchemy 还没有与后端无关的 upsert 构造,但上述的 Insert 变体仍然与 ORM 兼容,因为它们可以像在 ORM Bulk Insert with Per Row SQL...() 与 upsert 语句的使用方式与在 ORM Bulk Insert with Per Row SQL Expressions 中演示的方式相同,因此可以传递任何列表达式或相关的 ORM 实体类。...下面是一个人为的示例,展示了嵌入每行 SQL 表达式的 INSERT,并演示了此形式中的 Insert.returning(): >>> from sqlalchemy import select >>...()与在 ORM Bulk Insert with Per Row SQL Expressions 中演示的方式一样与 upsert 语句一起工作,以便传递任何列表达式或相关的 ORM 实体类。

    76210

    SqlAlchemy 2.0 中文文档(二十四)

    但是,存在使用触发器生成的服务器生成值的限制,无法使用 RETURNING: SQL Server 不允许在 INSERT 语句中使用 RETURNING 来检索触发器生成的值;该语句将失败。...SQLAlchemy 2.0 现在使用现代方言的“Insert Many Values”行为用于 INSERT 语句,解决了以前批量 INSERT 速度慢的问题。...大多数情况下,SQLAlchemy 在设置事件发生时不需要“旧”值,因此如果旧值不存在,则会跳过 SQL 调用的开销,这基于以下假设:标量值通常需要更新,在那些几种情况中不需要,平均而言比发出防御性 SELECT...然后方法返回生成的目标实例;如果原始源实例尚未关联,则保持不变且未关联Session。 此操作如果关联映射使用cascade="merge",将级联到关联的实例。 有关合并的详细讨论,请参阅合并。...大多数情况下,当发生设置事件时,SQLAlchemy 不需要“旧”值,因此,如果旧值不存在,则跳过 SQL 调用的开销,基于假设更新标量值通常是必要的,而在那些很少的情况下它不是,平均而言比发出防御性

    82310

    SqlAlchemy 2.0 中文文档(二十五)

    SQLAlchemy 2.0 现在使用现代方言的“Insert Many Values”行为用于 INSERT 语句,解决了以前批量 INSERT 速度慢的问题。...,平均比发出防御性的 SELECT 更便宜。...然后该方法返回生成的目标实例;原始源实例保持不变,并且如果尚未与Session相关联,则不与之相关联。 如果关联使用cascade="merge"进行映射,则此操作会级联到关联的实例。...SQLAlchemy 2.0 现在使用现代方言的“插入多个值”行为用于 INSERT 语句,解决了以前批量 INSERT 速度慢的问题。 参数: objects – 一系列映射对象实例。...不需要“旧”值,因此,如果旧值不存在,则跳过发出 SQL 调用的开销,这是基于这样一个假设:通常需要更新标量值,并且在那些极少数情况下,其中不需要,平均而言,这比发出防御性 SELECT 更便宜。

    56310

    SqlAlchemy 2.0 中文文档(七十二)

    1.3 引入的行为现在在所有情况下都更为正确,比两种方法都更为正确,因为仍然使用 IN 运算符,并且不具有原始系统的性能问题。...Core 表达式中,我们从不处理像上面那样的原始生成名称,因为 SQLAlchemy 对这些表达式应用自动标记,这些表达式直到现在都是所谓的 “匿名” 表达式: >>> print(select(cast...= 1” 以生成“false” 表达式的新系统。1.3 引入的行为现在在所有情况下都更加正确,因为仍然使用 IN 运算符,并且不具有原始系统的性能问题。...Core 表达式中,我们从不处理像上面那样的原始生成名称,因为 SQLAlchemy 对这些表达式应用自动标记,这些表达式直到现在始终是所谓的“匿名”表达式: >>> print(select(cast...Core 表达式中,我们从不处理像上面那样的原始生成名称,因为 SQLAlchemy 对这些表达式应用自动标记,直到现在始终是所谓的“匿名”表达式: >>> print(select(cast(foo.c.data

    1.1K10

    Python SQLAlchemy入门教程

    特点是操纵Python对象而不是SQL查询,也就是在代码层面考虑的是对象,而不是SQL,体现的是一种程序化思维,这样使得Python程序更加简洁易读。...**优点: ** 简洁易读:将数据表抽象为对象(数据模型),更直观易读 可移植:封装了多种数据库引擎,面对多个数据库,操作基本一致,代码易维护 更安全:有效避免SQL注入 为什么要用sqlalchemy...虽然性能稍稍不及原生SQL,但是操作数据库真的很方便! 二....生成数据库表 Base.metadata.create_all(engine) 创建表,如果存在则忽略,执行以上代码,就会发现在db中创建了users表。...批量插入共有以下几种方法,对它们的批量做了比较,分别是: session.add_all() bulk_save_object() bulk_insert_mappings() SQLAlchemy_core

    3.4K30

    SqlAlchemy 2.0 中文文档(七十五)

    #3708 ### 改进了具有多态实体的 Query.correlate 方法 在最近的 SQLAlchemy 版本中,许多形式的“多态”查询生成的 SQL 比以前更“扁平化”,不再无条件地将多个表的...#3708 ### 改进 Query.correlate 方法与多态实体 在最近的 SQLAlchemy 版本中,许多形式的“多态”查询生成的 SQL 比以前更“扁平化”,其中多个表的 JOIN 不再无条件地捆绑到子查询中...#3708 改进查询中的 Query.correlate 方法与多态实体 在最近的 SQLAlchemy 版本中,许多形式的“多态”查询生成的 SQL 比以前更“扁平化”,其中多个表的 JOIN 不再无条件地捆绑到子查询中...当使用Session.bulk_insert_mappings()方法时,无论何种情况下都会忽略None: # would insert SQL NULL and/or trigger defaults...当使用Session.bulk_insert_mappings()方法时,在所有情况下都会忽略None: # would insert SQL NULL and/or trigger defaults,

    80810

    SqlAlchemy 2.0 中文文档(五十四)

    缓存系统使得 SQLAlchemy 1.4 及以上版本在将 SQL 构造重复转换为字符串所花费的时间方面比 SQLAlchemy 1.3 更高效。...参见 SQL 编译缓存 - 缓存系统概述 对象将不生成缓存键,性能影响 - 关于不启用缓存的元素生成的警告的额外信息。...另请参阅 SQL 编译缓存 - 缓存系统概述 对象不会生成缓存键,性能影响 - 背景是在为特定结构和/或方言未启用缓存时发出警告的情况。## 如何分析一个使用 SQLAlchemy 的应用程序?...缓存系统使得 SQLAlchemy 1.4 及以上版本在将 SQL 构造反复转换为字符串方面比 SQLAlchemy 1.3 更高效。...另请参阅 SQL 编译缓存 - 缓存系统概述 对象不会生成缓存密钥,性能影响 - 当为特定构造和/或方言禁用缓存时发出警告的背景信息。 如何对由 SQLAlchemy 驱动的应用进行性能分析?

    70610

    SqlAlchemy 2.0 中文文档(五十二)

    获取此值的过程有几种变体: 在绝大多数情况下,RETURNING 与 SQL Server 上的 INSERT 语句一起使用,以获取新生成的主键值: INSERT INTO t (x) OUTPUT...当使用核心 insert() 构造(而不是纯字符串 SQL)创建的 INSERT 构造引用标识列时,SQLAlchemy 方言将检测到,并且在此情况下将在执行 INSERT 语句之前发出 SET IDENTITY_INSERT...获取此值的过程有几种变体: 在绝大多数情况下,在 SQL Server 上与 INSERT 语句一起使用 RETURNING 以获取新生成的主键值: INSERT INTO t (x) OUTPUT...获取此值的过程有几种变体: 在绝大多数情况下,RETURNING 与 SQL Server 上的 INSERT 语句一起使用,以获取新生成的主键值: INSERT INTO t (x) OUTPUT...从 SQLAlchemy 2.0 开始,默认还使用“Insert Many Values” Behavior for INSERT statements 功能来优化多行 INSERT 语句;对于 SQL

    1.6K10
    领券