使用 pandas to_sql 忽略写入数据库时的错误行

问题描述 投票:0回答:1

我有一个相当大的数据集需要上传到数据库(在我的例子中是 Postgres)。如果我使用块大小为 5000 的标准 to_sql,则会出现一些坏行,因为某些数据已损坏。但是,如果我尝试捕获异常并迭代每一行来捕获它们,则需要相当多的时间,迭代每一行需要相当多的时间。

我尝试做的事情:

def insert_do_nothing_on_conflicts(sqltable, conn, keys, data_iter):
    from sqlalchemy.dialects.postgresql import insert
    from sqlalchemy import table, column
    columns = []
    for c in keys:
        columns.append(column(c))
    if sqltable.schema:
        table_name = '{}.{}'.format(sqltable.schema, sqltable.name)
    else:
        table_name = sqltable.name
    mytable = table(table_name, *columns)
    insert_stmt = insert(mytable).values(list(data_iter))
    do_nothing_stmt = insert_stmt.on_conflict_do_nothing(index_elements=['timestamp'])
    conn.execute(do_nothing_stmt)

def write_to_db(filename):
    chunksize = 10 ** 6
    chunk_count=0
    for chunk in pd.read_csv(filename, chunksize=chunksize,on_bad_lines='skip',header = None,encoding='windows-1251'):

        while chunk_count<=5:
            chunk_count+=1
            continue
        i=0
        while i < len(chunk) + 1:
            #try:
            chunk[i:i+5000].to_sql(name='test_table_2',schema='kkt', con=engine_postgres, index=False, if_exists='append',method='insert_do_nothing_on_conflicts')
            i+=5000
            if i % 100000 ==0:
                print (i//5000, (len(chunk)//5000)+2)
        chunk_count+=1

但是我收到错误

ValueError:参数方法无效:insert_do_nothing_on_conflicts

搜遍全网都没有找到答案。方法应该有效并且它出现在一些代码中。无论我在代码中使用哪种方法,它们都不起作用。我需要一个快速的答案。

python-3.x pandas bigdata pandas-to-sql
1个回答
0
投票

返回文档,然后:

**异常 ValueError当操作或函数接收到具有正确类型但不适当值的参数时引发,并且这种情况没有通过更精确的异常(例如 IndexError)来描述。

而且

传递错误类型的参数(例如,在需要 int 时传递列表)应导致 TypeError,但传递错误值的参数(例如超出预期边界的数字)应导致 ValueError

那么,也许您可以在帖子中验证您是否使用它期望的数据类型提供

insert_do_nothing_on_conflicts

哪一行出现错误?可能有更完整的错误回溯,可能会很有用。

© www.soinside.com 2019 - 2024. All rights reserved.