【发布时间】:2022-04-28 08:14:22
【问题描述】:
我有一个要插入 SQL 数据库的 Pandas 数据框。我直接使用 Psycopg2 与数据库对话,而不是 SQLAlchemy,所以我不能使用 Pandas 内置的 to_sql 函数。几乎所有东西都按预期工作,除了 numpy np.NaN 值被转换为文本作为 NaN 并插入数据库的事实。它们确实应该被视为 SQL 空值。
因此,我正在尝试制作一个自定义适配器来将 np.NaN 转换为 SQL null,但我尝试的所有操作都会导致在数据库中插入相同的 NaN 字符串。
我目前正在尝试的代码是:
def adapt_nans(null):
a = adapt(None).getquoted()
return AsIs(a)
register_adapter(np.NaN, adapt_nans)
我在这个主题上尝试了许多变体,但都没有成功。
【问题讨论】:
-
就我个人而言,我会说
NaN应该不被转换为NULL,因为它们根本不是一回事,但我可以想象我的上下文猜猜这可能是有道理的。我会使用BEFORE INSERT OR UPDATE ... FOR EACH ROW ...触发器来转换它们。 -
我确实理解 NaN 和 NULL 之间的一般差异,但是,在这种特殊情况下,它们确实是同一回事。数据从平面文件读入数据帧,Pandas 在缺少数据的地方插入一个 NaN。
标签: python postgresql psycopg2