Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python将唯一记录批量插入PostgreSQL(每天数百万条记录)_Python_Pandas_Postgresql_Sqlalchemy - Fatal编程技术网

使用Python将唯一记录批量插入PostgreSQL(每天数百万条记录)

使用Python将唯一记录批量插入PostgreSQL(每天数百万条记录),python,pandas,postgresql,sqlalchemy,Python,Pandas,Postgresql,Sqlalchemy,我每天有1000多万条记录要插入Postgres数据库 90%是重复的,只应插入唯一的记录(可在特定列值上进行检查) 由于容量大,批量插入似乎是唯一明智的选择 我正在想办法让它工作 我试过了: SQLAlchemy,但它抛出了一个错误。所以我认为这是不可能的 抛出: IntegrityError: (psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "..._key"

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

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

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

我正在想办法让它工作

我试过了:

  • SQLAlchemy,但它抛出了一个错误。所以我认为这是不可能的
  • 抛出:

    IntegrityError: (psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "..._key"
    
  • Panda的
    to_sql
    没有这种独特的记录功能
  • 因此,我考虑将新记录放在“中间表”中,然后并行运行后台作业,以便在主表中添加那些不存在的记录。我不知道这是否是最有效的程序

    有更好的方法吗?
    有没有办法让SQLAlchemy或Pandas做到这一点?

    解决这个问题有两种常用方法。要在这两者之间做出选择,您需要检查您愿意在哪里花费计算能力,以及额外的网络传输是否会成为一个问题。我们没有足够的信息为你做出判断

    选项1:加载到临时表

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

    将批处理的全部内容加载到此表中,完成后,从该表插入目标表。您可以非常轻松地使用标准SQL语句执行所需的任何类型的操作,例如
    distinct
    ,或者它是否是第一条记录,或者其他任何操作

    选项2:仅加载唯一值,使用熊猫过滤

    Pandas有一个函数,可以将数据帧限制为唯一的条目,并且可以指定要检查的列和要保留的行

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