You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SQLAlchemy批量插入多行数据时,无需临时表直接获取返回结果的方法咨询

SQLAlchemy批量插入多行数据时,无需临时表直接获取返回结果的方法咨询

嗨,你完全可以不用临时表来实现这个需求!其实PostgreSQL的RETURNING子句本身就支持直接返回插入的行数据,根本不需要先把返回值存到临时表再查询。结合SQLAlchemy的text对象,我们可以直接捕获这些返回结果,省去冗余的临时表操作。

下面是修改后的代码,我移除了所有和临时表相关的逻辑,同时保留了你原本使用的text对象和批量参数方式:

from sqlalchemy.engine import create_engine
from sqlalchemy import text
from sqlalchemy import bindparam
import psycopg

def makePgEngine():
    global pgEngine
    pgEngine = create_engine("postgresql+psycopg://postgres:postgres@localhost:5412/postgres")

def insert_into_returning():
    makePgEngine()
    # 直接通过RETURNING子句返回插入的字段,无需CTE和临时表
    sql_text = """
        INSERT INTO public.numeric_data_source (x_field,y_field,z_field)
        VALUES (:x_field,:y_field,:z_field)
        RETURNING x_field, y_field, z_field
    """
    qry = text(sql_text).bindparams(
        bindparam('x_field'),
        bindparam('y_field'),
        bindparam('z_field')
    )
    params=(
        {'x_field':-99,'y_field':-98,'z_field':-97},
        {'x_field':-98,'y_field':-97,'z_field':-96},
        {'x_field':-97,'y_field':-96,'z_field':-95}
    )
    with pgEngine.connect() as con:
        con.execute(text("truncate table public.numeric_data_source"))
        # 执行插入操作后,直接从返回结果中获取数据
        result = con.execute(qry, params)
        inserted_data = result.fetchall()
        print(inserted_data)
        con.commit()

核心改动说明:

  • 删掉了原来的CTE临时表插入逻辑,直接在INSERT语句末尾添加RETURNING x_field, y_field, z_field,PostgreSQL会在插入完成后立刻返回这些字段的值。
  • con.execute()执行后返回的Result对象已经包含了所有插入行的返回数据,直接调用fetchall()就能拿到全部结果,不需要再额外查询临时表。
  • 完全保留了你原本的text对象和批量参数传递方式,完美契合你的需求。

这种方式不仅代码更简洁,还减少了数据库的额外IO操作,效率也会更高哦!

备注:内容来源于stack exchange,提问作者Z T Minhas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:50:27