以下代码可以很好地将多维 numpy 数组插入表中
def adapt_numpy_array(numpy_array):
return AsIs(numpy_array.tolist())
register_adapter(np.ndarray, adapt_numpy_array)
register_adapter(np.int32, AsIs)
register_adapter(np.int64, AsIs)
register_adapter(np.float64, AsIs)
但是,如果数组包含 NaN,它就会中断:
psycopg2.errors.UndefinedColumn:FEHLER:Spalte »nan«存在 第 2 行:...6000.0、692000.0、732000.0、830000.0、928000.0]、[南、南、..
将适配器更改为
def adapt_numpy_array(numpy_array):
return numpy_array.tolist()
def nan_to_null(f,
_NULL=psycopg2.extensions.AsIs('NULL'),
_Float=psycopg2.extensions.Float):
if not np.isnan(f):
return _Float
return _NULL
register_adapter(float, nan_to_null)
产生另一个错误
AttributeError:“list”对象没有属性“getquoted”
为什么第二个代码会中断,psycopg2 应该遍历列表并用其值或 NULL 替换每个浮点数? 如果存在 NaN,如何将 numpy 数组插入到 SQL 表中?
技巧是将 numpy 数组转换为字符串,并用
NULL
正确表示 NaN 值。然后,格式化的字符串可以由 AsIs
适配器包裹。
import numpy as np
from psycopg2.extensions import register_adapter, AsIs
def adapt_numpy_array(numpy_array):
return AsIs(str(numpy_array.tolist()).replace("nan", "NULL"))
register_adapter(np.ndarray, adapt_numpy_array)
不确定这是否是最优雅的解决方案,但它确实可以处理我抛出的任何 numpy 数组。