替换SQLAlchemy Core中的现有记录

时间:2014-08-22 00:38:45

标签: python sqlalchemy

我想用一个具有相同密钥的新表中的记录替换表中的现有记录。

例如,在SQL中,我只执行以下两个语句:

DELETE O FROM OLD_TABLE T1
    WHERE EXISTS (SELECT * FROM NEW_TABLE T2
                  WHERE T1.KeyPart1 = T2.KeyPart1
                  AND   T1.KeyPart2 = T2.KeyPart2 )

INSERT OLD_TABLE 
     SELECT * FROM NEW_TABLE T2
     WHERE NOT EXISTS (SELECT * FROM OLD_TABLE T1
                        WHERE T1.KeyPart1 = T2.KeyPart1
                        AND   T1.KeyPart2 = T2.KeyPart2)

在Python中,我如何使用SQLAlchemy Core(而非ORM)?

OldTable.delete().????   
OldTable.insert(NewTable.select()) ????

我害怕我完全失去了。

P.S。我在SQLAlchemy CORE中这样做是因为(a)有记录日志,(b)我希望SQLAlchemy处理数据库方言依赖。

1 个答案:

答案 0 :(得分:1)

使用exists()在WHERE子句中处理“exists”,并通过from_select()“INSERT .. FROM SELECT”。

conn.execute(
   old_table.delete().where(exists().where(
              old_table.c.col == new_table.c.col
             ).where(
              old_table.c.col2 == new_table.c.col2).
              correlate(old_table)
   )
)

conn.execute(
      old_table.insert().from_select(['col', 'col2'], new_table.select().where(
      ~exists().where(old_table.c.col == new_table.c.col).correlate(new_table)
      )    
)