如何将这个PostgreSQL SQL查询转换为SQLAlchemy Core?

huangapple go评论134阅读模式
英文:

How can I convert this postgres SQL query to sqlalchamy core

问题

我正在使用PostgreSQL与SQLAlchemy并已经阅读了所有与SQLAlchemy中的UPDATE相关的文档但没有找到将其转换的方法

update test as t set
    column_a = c.column_a
from (values
    ('123', 1),
    ('345', 2)  
) as c(column_b, column_a) 
where c.column_b = t.column_b;
英文:

I am using postgres with sqlalchamy and have gone through all documentation of update from in sqlalchamy but not found way to convert it.

update test as t set
    column_a = c.column_a
from (values
    ('123', 1),
    ('345', 2)  
) as c(column_b, column_a) 
where c.column_b = t.column_b;

答案1

得分: 1

这不完全正确,因为我没有为表test设置别名,但很接近。也许我以后可以弄清楚。您需要生成确切的SQL吗?

我认为您需要使用values()

with Session(engine) as session:
    # 使用来自ORM类的表对象。您也可以定义一个普通的表。
    test_t = Test.__table__
    value_expr = values(
        column('column_b', String),
        column('column_a', Integer),
        name='c').data(
            [('123', 1), ('345', 2)])
    stmt = update(test_t).where(test_t.c.column_b == value_expr.c.column_b).values(column_a=value_expr.c.column_a)
    session.execute(stmt)
    session.commit()

这将生成以下PostgreSQL SQL语句:

UPDATE test SET column_a=c.column_a FROM (VALUES (%(param_1)s, %(param_2)s), (%(param_3)s, %(param_4)s)) AS c (column_b, column_a) WHERE test.column_b = c.column_b
英文:

This isn't exactly correct because I didn't alias the table test but it is pretty close. Maybe I can figure that out later. Do you need that EXACT sql to be generated?

I think you need to use values()

with Session(engine) as session:
    # Use a table object from an ORM class.  You could define a regular table too.
    test_t = Test.__table__
    value_expr = values(
        column('column_b', String),
        column('column_a', Integer),
        name="c").data(
            [('123', 1), ('345', 2)])
    stmt = update(test_t).where(test_t.c.column_b == value_expr.c.column_b).values(column_a=value_expr.c.column_a)
    session.execute(stmt)
    session.commit()


This makes this SQL using postgresql:

UPDATE test SET column_a=c.column_a FROM (VALUES (%(param_1)s, %(param_2)s), (%(param_3)s, %(param_4)s)) AS c (column_b, column_a) WHERE test.column_b = c.column_b

huangapple
  • 本文由 发表于 2023年6月26日 20:41:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/76556788.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定