我正在try 使用以下所需格式的CTE运行查询:

SELECT * FROM (
  VALUES
      (1, 'A'),
      (2, 'B')
) temp_table(column_a, column_b)

使用SQLalChemy,我希望动态填充该表中的数据(1、‘A’等).我try 了以下几种方法:

import sqlalchemy as sa

q =  """
SELECT * FROM (
  VALUES
      (:column_a, :column_b)
) temp_table(column_a, column_b)
"""

params = [
    {'column_a': 1, 'column_b': 'A'},
    {'column_a': 2, 'column_b': 'B'}
]
conn.execute(sa.text(q), parameters=params)

但是,因为我提供了一个参数列表,所以在幕后使用execute_many(据我所知),并最终运行两次查询,第一个查询是例如:

SELECT * FROM (
  VALUES
      (1, 'A')
) temp_table(column_a, column_b)

如何正确地将其参数化,以便一次性将所有元组插入到查询中?

推荐答案

您可以使用.values()函数为您构造VALUES子句:

import sqlalchemy as sa

engine = sa.create_engine(
    "mssql+pyodbc://scott:tiger^5HHH@mssql_199"
)

values_data = [(1, "A"), (2, "B")]
values_clause = sa.values(
    sa.column("column_a", sa.Integer),
    sa.column("column_b", sa.String),
    name="temp_table",
).data(values_data)

statement = sa.select(sa.text("*")).select_from(values_clause)
engine.echo = True
with engine.begin() as conn:
    results = conn.execute(statement).all()
    """SQL emitted
    SELECT *
    FROM (VALUES (?, ?), (?, ?)) AS temp_table (column_a, column_b)
    [no key 0.00031s] (1, 'A', 2, 'B')
    """
    print(results)
    # [(1, 'A'), (2, 'B')]

发帖主题:Re:Kolibrios

您还可以编译VALUES子句,并将其嵌入到SQL文本中:

cte_body = (
    sa.select(sa.text("*"))
    .select_from(values_clause)
    .compile(engine, compile_kwargs={"literal_binds": True})
)
statement = f"""\
WITH cte1 AS (
{cte_body}
)
SELECT * FROM cte1 
"""

engine.echo = True
with engine.begin() as conn:
    results = conn.execute(sa.text(statement)).all()
    """SQL emitted
    WITH cte1 AS (
    SELECT * 
    FROM (VALUES (1, 'A'), (2, 'B')) AS temp_table (column_a, column_b)
    )
    SELECT * FROM cte1 
    """
    print(results)
    # [(1, 'A'), (2, 'B')]

Python相关问答推荐

在应用循环中间保存pandas DataFrame

将HTML输出转换为表格中的问题

Python Hashicorp Vault库hvac创建新的秘密版本,但从先前版本中删除了密钥

分组数据并删除重复数据

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

如何从具有不同len的列表字典中创建摘要表?

在线条上绘制表面

大小为M的第N位_计数(或人口计数)的公式

在ubuntu上安装dlib时出错

创建可序列化数据模型的最佳方法

基于形状而非距离的两个numpy数组相似性

python sklearn ValueError:使用序列设置数组元素

并行编程:同步进程

以异步方式填充Pandas 数据帧

Beautifulsoup:遍历一个列表,从a到z,并解析数据,以便将其存储在pdf中.

如何在GEKKO中使用复共轭物

如何在信号的FFT中获得正确的频率幅值

使用np.fft.fft2和cv2.dft重现相位谱.为什么结果并不相似呢?

修改.pdb文件中的值并另存为新的