当前位置: 首页 > news >正文

SQLAlchemy 高级批量插入笔记(标量子查询 + 显式参数绑定)

一、背景:笨办法的痛点

我们要做的事

给用户插入邮箱地址,需要先知道用户的user_id

笨办法(分两步)

python

运行

# 第1步:先查用户ID user_id = conn.execute(select(user_table.c.id).where(user_table.c.name == "spongebob")).scalar() # 第2步:用查到的ID插地址 conn.execute(insert(address_table).values(user_id=user_id, email="sponge@example.com"))

痛点

  1. 两次交互:先查再插,慢;
  2. 批量更慢:插 100 个地址要查 100 次 ID;
  3. 代码啰嗦

二、核心概念拆解

1.bindparam("参数名"):显式预留参数坑位

作用

在 SQL 表达式里预留一个 “坑位”,执行时通过字典传值,靠名字匹配(不是靠顺序)。

代码示例

python

运行

from sqlalchemy import bindparam # 1. 留坑:name == bindparam("username") stmt = select(user_table.c.id).where(user_table.c.name == bindparam("username")) # 2. 填坑:传字典 {"username": "spongebob"},key 匹配坑位名 result = conn.execute(stmt, {"username": "spongebob"})

2. 标量子查询 +.scalar_subquery():把查询结果当值用

核心概念
  • 标量:单个值(如数字1);
  • 标量子查询:一个只返回单个值的SELECT,可以直接当成 “值” 用在另一个 SQL 里。
代码示例

python

运行

# 1. 写一个普通查询 subq = select(user_table.c.id).where(user_table.c.name == "spongebob") # 2. 标记为“标量子查询”(保证只返回单个值) scalar_subq = subq.scalar_subquery() # 3. 直接当值用!user_id 执行这个子查询去查 stmt = insert(address_table).values(user_id=scalar_subq, email="sponge@example.com")

三、完整流程:两者结合实现高级批量插入

步骤 1:构造带参数坑位的标量子查询

python

运行

from sqlalchemy import select, bindparam # 留坑:bindparam("username") subq = select(user_table.c.id).where(user_table.c.name == bindparam("username")) # 标记为标量子查询 scalar_subq = subq.scalar_subquery()

步骤 2:写 INSERT 语句,user_id 用子查询

python

运行

# 意思:user_id 执行 scalar_subq 去查,email 从参数里拿 stmt = insert(address_table).values( user_id=scalar_subq, email_address=bindparam("email_address") # 邮箱也留坑(可省略,SQLAlchemy 自动识别) )

步骤 3:准备批量参数列表

python

运行

# 每个字典对应一行数据: # - "username" 填到子查询的坑里 # - "email_address" 填到邮箱坑里 params_list = [ {"username": "spongebob", "email_address": "sponge@example.com"}, {"username": "sandy", "email_address": "sandy@example.com"}, ]

步骤 4:执行!

python

运行

with engine.connect() as conn: conn.execute(stmt, params_list) # 自动批量执行 conn.commit()

数据库实际执行的 SQL

sql

INSERT INTO address (user_id, email_address) VALUES ( (SELECT id FROM user_account WHERE name = ?), -- 子查询查 user_id ? -- email_address );

四、核心价值总结

  1. 减少查询次数:一条 SQL 完成 “查 ID + 插地址”,不用分两步;
  2. 原子性更强:整个操作在一个事务里,避免竞态条件;
  3. 更安全:显式参数绑定防 SQL 注入,靠名字匹配防顺序错误;
  4. ORM 更简单:大多数时候用 ORM(如User.addresses),SQLAlchemy 自动处理关联插入。

五、一句话速记

bindparam留坑,用scalar_subquery把查询当值,传字典列表批量填坑,一条 SQL 完成查 ID + 插地址。

本笔记由豆包生成,上传只为方便查找

http://www.jsqmd.com/news/461420/

相关文章:

  • 类和动态内存分配(在构造函数中使用new 时应注意的事项)
  • Java常用API之String类
  • 图解最常用的 10 个机器学习算法!线性回归、逻辑回归、决策树、随机森林...
  • 喊着“全面拥抱AI”,可我连从哪下手都不知道——一位制造业软件工程师的真心话
  • 找当下口碑好的卡式风机盘管公司?2026年这些受认可,卧式暗装风机盘管/工业暖风机,卡式风机盘管批发厂家怎么选择 - 品牌推荐师
  • Druid 1.2.28发布,多项性能优化升级
  • Go语法练习小项目
  • 核心接口使用(四)Tool和MCP(2)MCP Server
  • Flutter 组件 ipaddr 适配鸿蒙 HarmonyOS 实战:高性能 IP 地址解析,构建子网掩码治理与网络边界安全架构
  • 票务预约系统代码3
  • 携程任我行礼品卡快速变现秘诀,这些回收渠道你知道吗? - 团团收购物卡回收
  • 基于Java springboot果蔬种植销售服务平台系统(源码+文档+运行视频+讲解视频)
  • Laravel 10.x重磅更新:12大核心特性解析
  • 市面上口碑好的不锈钢水槽拉伸成型液压机制造商推荐榜单,冷拉伸/深冲压/一次成型/单动薄板/双动拉伸/自动化生产线,不锈钢水槽拉伸成型液压机实力厂家怎么选 - 品牌推广师
  • 【OS】存储管理(内存管理)核心知识点详解
  • Pytorch1 PyTorch 官方 QuickStart 超详细笔记|
  • 智能科学与技术毕业设计易上手项目选题怎么做
  • dynamic-datasource-spring-boot-starter -动态数据源详解
  • S2b电商系统哪家好?深度测评:千匠才是行业优选
  • AI短视频培训哪家更好
  • 畅回收平台:好利来卡回收首选,75折折扣,服务贴心 - 畅回收小程序
  • React 状态管理:从 Redux Toolkit 到 Jotai、Zustand等主流库中,应该如何在项目中进行选择。
  • Python 装饰器详解:从入门到精通的完整指南
  • 江苏万融系统集成有限公司:打造安全、智能、可持续的实验室全生命周期服务 - 品牌推荐用户报道者
  • 为什么选择携程任我行礼品卡回收变现?五大优势告诉你! - 团团收购物卡回收
  • ONNX 和 TensorRT是什么
  • 【MySQL进阶 | explain执行计划】
  • The_Maya_Society
  • Postman+CLA+Jenkins接口测试
  • Java继承-多态