使用 Python Pandas to_sql() 将错误行批量插入 crateDB 时如何引发异常

How to raise an exception when bulk inserting faulty rows into crateDB using Python Pandas to_sql()

我正在使用

将数据批量插入 crateDB
pandas.to_sql(tableId, 'crate://xxxxxxx:4200', if_exists='append', index=False, chunksize=20000)

数据包含一些错误行,其中 'numeric' 类型的一列包含 'object' / 'string'.

类型的值

这会导致插入时出现类型转换错误。

当我将 to_sql() 的 chunksize 参数设置为 1 时,引发异常,我可以捕获问题。

当 chunksize > 0 时,to_sql() 只是继续,我无法确保数据已正确插入。

我错过了什么,解决这个问题的好方法是什么?

对于批量插入,您需要检查查询结果以进行错误处理。它包括一个 rowcounts 的数组。 -2 表示发生错误。

对于特定错误,可能包括类型转换错误,所有行都将被拒绝(即所有行数 return -2),在这种情况下,您将需要回退到单个插入。

有关更多详细信息,请参阅 https://crate.io/docs/crate/reference/en/4.6/interfaces/http.html#bulk-errors

最有可能的问题是 pandas 没有 return to_sql() 上的任何内容也请参阅 https://github.com/pandas-dev/pandas/issues/23998 and https://github.com/pandas-dev/pandas/issues/42645 。由于 CrateDB 中的 bulk_insert 并没有完全失败,只是跳过了错误的行,因此没有引发异常,但只有一个每行有一个值的数组被 returned。然而 return 从未在 pandas 中处理过:/

可以更改 CrateDB 的 SQL alchemy 实现,但这会 return 破坏任何实际使用结果数组的实现。