【问题标题】:Batch insert only unique records into PostgreSQL with Python (millions of records per day)使用 Python 仅将唯一记录批量插入 PostgreSQL(每天数百万条记录)
【发布时间】:2020-10-31 15:15:18
【问题描述】:

我每天有超过 1000 万条记录要插入 Postgres 数据库。

90% 是重复的,只应插入唯一记录(这可以在特定列值上检查)。

由于体积大,批量插入似乎是唯一明智的选择。

我正在尝试弄清楚如何完成这项工作。

我试过了:

  1. SQLAlchemy,但它会引发错误。所以我认为这是不可能的。
s = Session(bind=engine)
s.bulk_insert_mappings(Model, rows)
s.commit()

投掷:

IntegrityError: (psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "..._key"
  1. Panda 的to_sql 没有这种独特的记录功能。

所以我正在考虑将新记录放入“中间表”中,然后并行运行后台作业以将这些记录添加到主表中(如果它们尚不存在)。我不知道这是否是最有效的程序。

有没有更好的方法? 有什么方法可以让 SQLAlchemy 或 Pandas 做到这一点?

【问题讨论】:

    标签: python pandas postgresql sqlalchemy


    【解决方案1】:

    有两种常见的方法可以解决这个问题。要在这些之间进行选择,您需要检查您愿意将计算能力用于何处,以及额外的网络传输是否会成为问题。我们没有足够的信息来为您做出判断。

    选项 1:加载到临时表

    这个选项基本上就是你所描述的。有一个临时表或专用于加载的表,它与目标表的架构相匹配。显然,这应该排除唯一约束。

    将您的整个批次加载到此表中,然后将所有这些都从该表中插入到您的目标表中。您可以非常轻松地使用标准 SQL 语句来执行您需要的任何类型的操作,例如 distinct 或者它是否是第一条记录或其他任何内容。

    选项2:只加载唯一值,用pandas过滤

    Pandas 有一个 drop_duplicates() 函数,可将您的数据框限制为唯一条目,并且您可以指定要检查的列和保留的行等内容。

    df = df.drop_duplicates(subset = ["Age"])
    

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 2023-01-31
      • 2015-09-04
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      相关资源
      最近更新 更多