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

如何为SQL的VALUES子句传入元组列表?

解决方案

要实现一次性将所有元组传入VALUES子句,避免分多次执行,有两种可行的方式:

方法1:动态生成原生SQL占位符

根据参数列表长度动态生成对应数量的VALUES占位符组,再将所有参数合并为单个字典传入:

import sqlalchemy as sa

params = [
    {'column_a': 1, 'column_b': 'A'},
    {'column_a': 2, 'column_b': 'B'}
]

# 生成对应数量的占位符组
placeholders = ", ".join([f"(:col_a_{i}, :col_b_{i})" for i in range(len(params))])

# 构造完整SQL语句
q = f"""
SELECT * FROM (
  VALUES
      {placeholders}
) temp_table(column_a, column_b)
"""

# 将参数扁平化为单个字典
flat_params = {}
for idx, param in enumerate(params):
    flat_params[f"col_a_{idx}"] = param['column_a']
    flat_params[f"col_b_{idx}"] = param['column_b']

# 执行查询
conn.execute(sa.text(q), flat_params)

这种方式确保所有元组都包含在同一个VALUES子句中,只会执行一次查询。

方法2:使用SQLAlchemy Core API构建查询

推荐用SQLAlchemy原生API构造查询,无需手动拼接SQL,更安全且适配不同数据库:

import sqlalchemy as sa

# 定义临时表结构
temp_table = sa.table(
    'temp_table',
    sa.column('column_a', sa.Integer),
    sa.column('column_b', sa.String)
)

# 准备待传入的数据
data = [
    (1, 'A'),
    (2, 'B')
]

# 构建查询语句
query = sa.select(temp_table).select_from(
    sa.values(
        sa.column('column_a', sa.Integer),
        sa.column('column_b', sa.String)
    ).data(data)
)

# 执行并获取结果
result = conn.execute(query)
for row in result:
    print(row)

该方式利用SQLAlchemy Core的values()方法直接传入数据列表,底层会自动生成包含所有元组的VALUES子句,一次性执行查询,同时避免SQL注入风险。

内容的提问来源于stack exchange,提问作者bsauce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:42:09