【问题标题】:Pandas to_sql() to update unique values in DB?Pandas to_sql() 更新数据库中的唯一值?
【发布时间】:2019-02-10 19:04:42
【问题描述】:

如何使用df.to_sql(if_exists = 'append') 仅附加数据框和数据库之间的唯一值。换句话说,我想评估 DF 和 DB 之间的重复项,并在写入数据库之前删除这些重复项。

这个有参数吗?

我了解参数 if_exists = 'append'if_exists = 'replace' 是针对整个表格的 - 而不是唯一的条目。

I am using: 
sqlalchemy

pandas dataframe with the following datatypes: 
    index: datetime.datetime <-- Primary Key
    float
    float
    float
    float
    integer
    string <---  Primary Key
    string<----  Primary Key

我坚持这一点,因此非常感谢您的帮助。 -谢谢

【问题讨论】:

标签: python sql pandas pandas-to-sql


【解决方案1】:

在 pandas 中,to_sql 中没有方便的参数来仅将非重复项附加到最终表中。考虑使用 pandas always 替换的暂存临时表,然后运行最终追加查询以将临时表记录迁移到最终表,仅使用 NOT EXISTS 子句考虑唯一 PK。

engine = sqlalchemy.create_engine(...)

df.to_sql(name='myTempTable', con=engine, if_exists='replace')

with engine.begin() as cn:
   sql = """INSERT INTO myFinalTable (Col1, Col2, Col3, ...)
            SELECT t.Col1, t.Col2, t.Col3, ...
            FROM myTempTable t
            WHERE NOT EXISTS 
                (SELECT 1 FROM myFinalTable f
                 WHERE t.MatchColumn1 = f.MatchColumn1
                 AND t.MatchColumn2 = f.MatchColumn2)"""

   cn.execute(sql)

这将是一个 ANSI SQL 解决方案,并且不限于特定于供应商的方法,例如 UPSERT,因此几乎兼容所有 SQL 集成的关系数据库。

【讨论】:

  • 这是解决问题的好方法。谢谢。
  • 太棒了!乐意效劳。编码愉快!
  • 实际上很想得到您的后续想法:看来我仍然遇到一些重复的错误。如果我的主键是“日期”、“仪器”、“时间范围”。那么这些是“WHERE NOT EXISTS”参数中唯一的列吗?我的脚本似乎在重复时崩溃了:-/
  • 这三列需要添加到WHERE NOT EXISTS子句的子查询中来替换MatchColumn#
  • 我们是否必须手动创建myTempTable
猜你喜欢
  • 2019-04-17
  • 1970-01-01
  • 2018-07-28
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
相关资源
最近更新 更多