【问题标题】:Update a SQL table with data from itself using SQLAlchemy使用 SQLAlchemy 使用来自自身的数据更新 SQL 表
【发布时间】:2019-12-19 22:41:42
【问题描述】:

我有一个简短的 SQL 脚本,它将 SQL 表中的选定列从一个 id (main_id=1) “复制”到同一张表的另外两个 id (main_id=34)。 还有一些其他的 id 是表的主键的一部分。

该脚本使用 PostgreSQL 数据库可以正常工作。 但是,我想使用 SQLAlchemy ORM 替换它,但我不知道该怎么做。

UPDATE "MyTable" AS T
SET "Varname_1" = Cell."Varname_1",
    "Varname_2" = Cell."Varname_2"
FROM "MyTable" AS Cell
WHERE T.id_A = Cell.id_A AND
      T.id_B = Cell.id_B AND
      Cell.main_id = 1 AND
      T.main_id IN (3, 4);

谁能帮我“翻译”这个?

【问题讨论】:

  • 为什么不直接执行这个查询呢?
  • 首先,如果我可以在 SQLAlchemy 中执行此操作,我将在我的程序中对所有数据库操作使用 SQLAlchemy,而不是混合使用 SQLAlchemy 和原始 SQL。其次,可移植性:(据我所知)上面的脚本不适用于所有 SQL 方言。在使用 Postgres 之前,我使用的是 MS SQL 服务器,为此我不得不使用不同的脚本。
  • 我的意思是executing the raw SQL via SQLAlchemy,我认为这个 SQL 在方言之间应该不会有太大差异(对我来说看起来像是有效的 T-SQL),但请看我的回答。

标签: python sqlalchemy


【解决方案1】:

不确定您遇到了什么问题,因为我可以按照教程的 Multiple Table UpdatesUsing Aliases and Subqueries 部分中的示例来做到这一点:

import sqlalchemy
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:', echo=True)
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy import alias
metadata = MetaData()

my_table = Table('MyTable', metadata,
    Column('id_A', Integer),
    Column('id_B', Integer),
    Column('main_id', Integer),
    Column('varname_1', String),
    Column('varname_2', String),
)
cell = my_table.alias("cell")
stmt = my_table.update(). \
    where(my_table.c.id_A == cell.c.id_A). \
    where(my_table.c.id_B == cell.c.id_B). \
    where(cell.c.main_id == 1). \
    where(my_table.c.main_id.in_([3, 4])). \
    values(varname_1=cell.c.varname_1,
           varname_2=cell.c.varname_2)
print(str(stmt))
print(stmt.compile().params)

【讨论】:

  • 非常感谢,这非常有效。 (我的主要问题是我的 SQL 技能非常有限...... ;-))
  • @boseki 很高兴听到这个消息!如果它解决了您的问题,请随意将答案标记为已接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多