【问题标题】:Ignore duplicate rows while adding to database with Blaze's Odo使用 Blaze 的 Odo 添加到数据库时忽略重复行
【发布时间】:2015-11-02 15:06:24
【问题描述】:

如何在使用 Blaze 的 Odo 将数据帧存储在 postgres 数据库中时忽略重复行?

例如,我这样存储前 3 行:

>>> odo(df[:3], 'postgresql:///my_db::my_table')

my_table 有一个列 ID 作为主键。如果我添加更多但这次包括前最后一行,我想跳过该行并添加其他行而不是获取IntegrityError

>>> odo(df[2:5], 'postgresql:///my_db::my_table')

    IntegrityError: (psycopg2.IntegrityError) duplicate key value violates unique constraint  ...

我该怎么做?如果数据库有数百万行,从数据库加载ID 值并检查重复项对我来说似乎很昂贵。有没有更好的选择? 像这样的:

INSERT...ON DUPLICATE KEY IGNORE

Blaze:0.8.3,Postgres:9.4.4,Psycopg2:2.6.1

【问题讨论】:

  • 在写入 db 之前你不能放弃 dups 吗? df.drop_duplicates() 您可以选择传递您的 ID 列 df.drop_duplicates('ID'),不清楚您具体要问什么,您是要插入所有行并确保 ID 是唯一的,还是您真的想删除重复的行?
  • 是的,但即使在那之后,我也不知道其中一些唯一 ID 是否已经存在于数据库中。
  • 您可以从数据库中读取 ID 并将其过滤掉
  • @EdChum 我更新了我的帖子...

标签: postgresql pandas psycopg2 blaze


【解决方案1】:

odo 的数据模型只支持追加,不支持合并。您需要在通过odo 之前删除重复项,或者使用数据库删除重复项。尝试添加一个自增字段,并将其设置为主键。这将解决您在插入时遇到的IntegrityError 问题,之后您可以删除重复项。

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 2017-10-25
    • 2012-04-23
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多