如何让pandas dataframe.to_sql使用nan数据库ddl定义的默认值?

tzcvj98z  于 2021-08-25  发布在  Java
关注(0)|答案(0)|浏览(304)

在我的数据库ddl(sql server)中,我有具有默认值的字段:

my_database_field varchar(255)  NOT NULL 
     DEFAULT  'NVT'

但是,当我尝试使用dataframe.to_sql()将数据插入此表时,出现以下错误:

Cannot insert the value NULL into column 'my_database_field', table 'MYDB.dbo.my_table'; column does not allow nulls. INSERT fails.

代码如下:

with engine.begin() as conn:
    dataframe.to_sql(table_name, conn, index=False, if_exists='append')

“my_database_field”列具有nan值:

data['my_database_field']
0      NaN
1      NaN
2      NaN
3      NaN
4      NaN
        ..
4154   NaN
4155   NaN
4156   NaN
4157   NaN
4158   NaN

这似乎是因为to_sql方法正在用空值替换nan值(可能应该是这样的)
我希望使用插入nan值的选项,并让数据库使用架构中定义的默认值,而不是在使用to_sql方法时直接插入null。
我尝试过用空字符串替换 Dataframe 中的所有NaN,但这也遇到了同样的问题。它将这些空字符串传播到数据库,这是显示的内容,而不是ddl中指定的默认值。
我能让它工作的唯一方法是根本不使用pandas dataframe.to_sql方法,而是从csv文件加载数据,并使用基本的sqlalchemy sql表达式逐行写入数据库。
我在pandas github上发布了一个问题:https://github.com/pandas-dev/pandas/issues/42408
编辑:根据@larnu的评论,我缺少的关键信息是:
只有在插入中未指定列时,才会使用默认值。如果您(或应用程序)显式提供空值,则将插入空值。默认值不是“提供null时使用此值”属性,而是“忽略列时使用此值”
现在的问题是如何优雅地处理在某些列包含一些NAN的地方插入大型 Dataframe 。我希望避免必须逐行插入数据,并检查该行中的值是否为nan。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题