【问题标题】:Upsert or update SQL records based on some columns using Pandas and SQL Alchemy?使用 Pandas 和 SQL Alchemy 根据某些列更新或更新 SQL 记录?
【发布时间】:2021-06-07 14:37:20
【问题描述】:

我想看看是否有人可以帮助解决这个问题,甚至不确定是否可以完成。

我有一个如下所示的 SQL 表:

GUID                                    Timestamp      Asset      Channel        Value      Units    
B7CADE24-409B-4A79-9D59-0000070825C1    1603100037     SK132      Oil Pressure   178        PSI
A15F0252-2F1A-493E-9B7F-00001615DB47    1607620524     SK133      Oil Pressure   161        PSI
F5DFC208-1F8A-4FC4-94C3-0000168D82B2    1610545779     SK121      Speed          1604       RPM

我想在这个 SQL 表中附加一个 Pandas 数据框,但只有那些不存在的行,如果它们确实存在,我想用新值替换。

问题是我只想根据三列进行比较:

-Timestamp
-Asset
-Channel

如果我使用:

pd.to_sql("Table", con=engine, if_exists='replace')

这永远不会是真的,因为 GUID 是在代码中创建的。

有什么建议吗?

提前致谢

【问题讨论】:

    标签: python pandas sqlalchemy upsert


    【解决方案1】:

    不确定是否可以开箱即用,因为:

    replace: 在插入新值之前删除表

    1. 您可以使用删除重复项来做到这一点:

      # df = your df...
      df2 = pd.read_sql_query("SELECT * FROM Table", con=engine)
      df = pd.concat([df, df2], sort=False)
      df = df.drop_duplicates(['Timestamp', 'Asset', 'Channel'])
      df.to_sql('Table', con=engine, if_exists='replace')
      
    2. 或者使用临时表:

       df.to_sql('tmp_table', con=engine, if_exists='replace')
       # remove duplicates from origin table. just an example(I don't know your db)
       engine.execute("""
          DELETE FROM tmp_table WHERE Timestamp || Asset || Channel IN (
             SELECT DISTINCT Timestamp || Asset || Channel FROM Table
       """)
      
       # and rename tmp_table -> Table
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      相关资源
      最近更新 更多