使用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
相关产品推荐
相关产品推荐

