泉州网站优化排名推广,重庆装修公司哪家好十大排名,网站前端工资,衡阳做网站一、背景#xff1a;笨办法的痛点我们要做的事给用户插入邮箱地址#xff0c;需要先知道用户的 user_id。笨办法#xff08;分两步#xff09;python运行# 第1步#xff1a;先查用户ID user_id conn.execute(select(user_table.c.id).where(user_table.c.name spo…一、背景笨办法的痛点我们要做的事给用户插入邮箱地址需要先知道用户的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_iduser_id, emailspongeexample.com))痛点两次交互先查再插慢批量更慢插 100 个地址要查 100 次 ID代码啰嗦。二、核心概念拆解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_idscalar_subq, emailspongeexample.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_idscalar_subq, email_addressbindparam(email_address) # 邮箱也留坑可省略SQLAlchemy 自动识别 )步骤 3准备批量参数列表python运行# 每个字典对应一行数据 # - username 填到子查询的坑里 # - email_address 填到邮箱坑里 params_list [ {username: spongebob, email_address: spongeexample.com}, {username: sandy, email_address: sandyexample.com}, ]步骤 4执行python运行with engine.connect() as conn: conn.execute(stmt, params_list) # 自动批量执行 conn.commit()数据库实际执行的 SQLsqlINSERT INTO address (user_id, email_address) VALUES ( (SELECT id FROM user_account WHERE name ?), -- 子查询查 user_id ? -- email_address );四、核心价值总结减少查询次数一条 SQL 完成 “查 ID 插地址”不用分两步原子性更强整个操作在一个事务里避免竞态条件更安全显式参数绑定防 SQL 注入靠名字匹配防顺序错误ORM 更简单大多数时候用 ORM如User.addressesSQLAlchemy 自动处理关联插入。五、一句话速记用bindparam留坑用scalar_subquery把查询当值传字典列表批量填坑一条 SQL 完成查 ID 插地址。本笔记由豆包生成,上传只为方便查找