我有一个相当大的数据集需要上传到数据库(在我的例子中是 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
搜遍全网都没有找到答案。方法应该有效并且它出现在一些代码中。无论我在代码中使用哪种方法,它们都不起作用。我需要一个快速的答案。
返回文档,然后:
**异常 ValueError:当操作或函数接收到具有正确类型但不适当值的参数时引发,并且这种情况没有通过更精确的异常(例如 IndexError)来描述。
而且
传递错误类型的参数(例如,在需要 int 时传递列表)应导致 TypeError,但传递错误值的参数(例如超出预期边界的数字)应导致 ValueError。
那么,也许您可以在帖子中验证您是否使用它期望的数据类型提供
insert_do_nothing_on_conflicts
?
哪一行出现错误?可能有更完整的错误回溯,可能会很有用。