我想用一个具有相同密钥的新表中的记录替换表中的现有记录。
例如,在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处理数据库方言依赖。
答案 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)
)
)