讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 3.12中如何用SQLAlchemy批量更新爬虫入库数据?

胖宇同学_1169

胖宇同学_1169

发布时间:2026-09-27 07:58:29

|

667人浏览过

|

来源于php中文网

原创

SQLAlchemy 2.0+ 的 update() 不支持 executemany 批量更新,传入多行参数会降级为单条循环执行;应优先使用 bulk_update_mappings()(需主键已知)或方言特定的 upsert(如 insert().on_conflict_do_update())。

python 3.12中如何用sqlalchemy批量更新爬虫入库数据?

SQLAlchemy 2.0+ 的 update() 不再支持 executemany 风格批量更新

Python 3.12 下用 SQLAlchemy 2.0+(如 2.0.30+)做批量更新,不能直接对一堆字典调用 session.execute(update(...), [...])——这会触发单条 SQL 执行 N 次,性能极差。根本原因是 Update 构造对象默认不启用底层的 executemany 优化,即使传入多行参数,它也会降级为循环执行。

真正有效的批量更新必须绕过 ORM 层的 session.bulk_update_mappings() 或直接走 Core 的 execute() + 原生批量语句。但要注意:bulk_update_mappings() 要求主键已知且不能触发事件或验证,而原生语句则需手动处理字段映射和类型转换。

  • bulk_update_mappings() 仅适用于模型已有主键值、且你信任数据完整性的情况
  • 若依赖数据库自增 ID 或需要 upsert 逻辑(如不存在则插入),得改用 insert(...).on_conflict_do_update()(PostgreSQL)或 REPLACE INTO/INSERT ... ON DUPLICATE KEY UPDATE(MySQL)
  • SQLite 不支持 ON CONFLICT 的完整语法,得用 INSERT OR REPLACE + 全字段覆盖,或拆成 SELECT + UPDATE 两步

用 bulk_update_mappings() 更新已有主键的爬虫记录

这是最常用也最稳妥的方案,适合爬虫入库后二次修正字段(比如补全 status、updated_at),前提是每条记录的主键(如 id 或 url_hash)已在 DB 中存在且你手上有对应值。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
<h1>假设 Model 定义为 class Article(Base):</h1><h1><strong>tablename</strong> = "articles"</h1><h1>id = Column(Integer, primary_key=True)</h1><h1>title = Column(String)</h1><h1>status = Column(String)</h1><p>engine = create_engine("sqlite:///crawler.db")
Session = sessionmaker(bind=engine)
session = Session()</p><h1>爬虫采集后整理出待更新的数据列表(必须含主键字段)</h1><p>updates = [
{"id": 101, "title": "新标题A", "status": "parsed"},
{"id": 102, "title": "新标题B", "status": "parsed"},
{"id": 103, "title": "新标题C", "status": "failed"},
]</p><h1>注意:字段名必须与模型属性名一致,不能是数据库列名(如不能写 "article_title")</h1><p>session.bulk_update_mappings(Article, updates)
session.commit()
  • 必须确保 updates 中每个 dict 都包含完整的主键字段,否则会抛 KeyError 或静默跳过
  • 不会调用 __init__、@validates、before_update 等钩子,也不校验类型,纯数据灌入
  • MySQL/PostgreSQL 下实际执行的是单条 UPDATE ... WHERE id = ? 的批量绑定,不是一条 SQL 更新多行——但比循环 session.query().filter().update() 快 5–10 倍

用 Core 的 update() + executemany=True 实现真批量(需数据库驱动支持)

如果你用的是较新版本的 psycopg(v3.1+)或 pymysql(v1.1+),可以强制开启底层批量执行。但注意:SQLAlchemy 默认禁用该行为,必须显式配置引擎并构造语句。

提示词大师-python版
提示词大师-python版

图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍

下载

立即学习“Python免费学习笔记(深入)”;

from sqlalchemy import update, text
from sqlalchemy.dialects.postgresql import insert
<h1>PostgreSQL 示例(推荐用 insert().on_conflict_do_update 更安全)</h1><p>stmt = (
update(Article)
.where(Article.id == text("data.id"))
.values(
title=text("data.title"),
status=text("data.status"),
updated_at=text("NOW()")
)
)</p><h1>注意:这不是标准写法,而是配合 VALUES (...) FROM (VALUES ...) 的变体</h1><h1>真正高效的写法依赖数据库方言,通常不如 bulk_update_mappings 直观</h1><p>
  • SQLite 和旧版 MySQL 驱动不支持 executemany 对 UPDATE 的优化,强行传多行参数仍会循环执行
  • PostgreSQL 可用 insert().on_conflict_do_update() 替代,一条语句完成 upsert,且自动批量绑定
  • 别在 update().values(...) 里直接写 Python 变量,否则 SQL 注入;要用 text() 或参数化占位符

爬虫场景下更推荐的替代路径:先 bulk_insert_mappings() 再去重更新

多数爬虫入库本质是“有则更新、无则插入”,与其纠结批量 update,不如用带冲突处理的插入——既避免主键缺失问题,又天然支持批量。SQLAlchemy 2.0+ 对各数据库的 upsert 支持已较成熟。

# PostgreSQL
stmt = insert(Article).values(updates)
stmt = stmt.on_conflict_do_update(
    index_elements=["url_hash"],  # 唯一键或索引列
    set_=dict(
        title=stmt.excluded.title,
        status=stmt.excluded.status,
        updated_at=func.now()
    )
)
session.execute(stmt)
session.commit()
  • MySQL 用 insert(...).on_duplicate_key_update(...)
  • SQLite 用 insert(...).on_conflict_replace()(需 3.24+)或退化为 INSERT OR REPLACE
  • 关键点:必须提前在数据库中为用于判断“是否存在”的字段(如 url_hash)建唯一索引,否则 upsert 无效

实际批量更新时最容易被忽略的,是数据库连接是否启用了 fast_executemany=True(SQL Server)、use_batch_mode=True(PyMySQL)或 prepare_statement=True(psycopg)。这些开关不在 SQLAlchemy 层控制,而在底层驱动初始化时设置,不配就永远达不到理论吞吐量。

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1591

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

3804

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1589

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

21957

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2707

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2747

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1103

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn