如何在 SMALLINT 上使用 teradatasql 在数据库中插入空值,计算期间发生数字溢出

How to insert Null Value in database using teradatasql on a SMALLINT, Numeric overflow occurred during computation

所以我使用 None 对象在 pandas 数据帧中定义空值。 这是数据框中带有 NaNNone

的行的示例
27     XXX         None        41.0          NaN           1.0        50.0          NaN           1.0        71.0          3.0  0.9826382611          162.0             3.0  0.9952958893        MTD

当我在数据帧中插入 None 时,它变成 NaN,然后当插入到 Teradata 中的一个小整数字段时,我得到一个插入错误。我如何告诉 Teradata 使用 python 将那些 NaN 插入到 Teradata 中的空值?

Numeric overflow occurred during computation.

在下面的例子中,参数8是NaN

Insert Exception in function insertDtframe, activated rollback: [Version 16.20.0.54] [Session 2258656] [Teradata SQL Driver] [Error 502] Batch row 3 bound parameter 8 type VARCHAR (448) differs from batch row 1 type FLOAT (480)
 at gosqldriver/teradatasql.(*teradataConnection).makeDriverErrorCode TeradataConnection.go:1074
 at gosqldriver/teradatasql.(*TeradataRows).validateBatchValues TeradataRows.go:947
 at gosqldriver/teradatasql.newTeradataRows TeradataRows.go:361
 at gosqldriver/teradatasql.(*teradataStatement).QueryContext TeradataStatement.go:122
 at gosqldriver/teradatasql.(*teradataConnection).QueryContext TeradataConnection.go:2036
 at database/sql.ctxDriverQuery ctxutil.go:48
 at database/sql.(*DB).queryDC.func1 sql.go:1464
 at database/sql.withLock sql.go:3032
 at database/sql.(*DB).queryDC sql.go:1459
 at database/sql.(*Conn).QueryContext sql.go:1701
 at main.goCreateRows goside.go:599
 at main._cgoexpwrap_e6e101e164fa_goCreateRows _cgo_gotypes.go:331
 at runtime.call64 asm_amd64.s:574
 at runtime.cgocallbackg1 cgocall.go:316
 at runtime.cgocallbackg cgocall.go:194
 at runtime.cgocallback_gofunc asm_amd64.s:826
 at runtime.goexit asm_amd64.s:2361
Completed Time: 2019-12-04 15:41:06.967610

按照 Fred 的建议,使用函数 pandas.notnullNaN 替换为 None

最初,当您将 None 对象插入 pandas 时,它会将其替换为 NaN。如果你想插入到数据库中,你需要将那些 NaN 转换为 None。这是因为数据库会认为您插入的是字符串,尤其是在整数数据类型字段上。下面是将 NaN 转换为任何特定值的代码。在我的场景中应该是 None.

cNoneDtframe = parsedDtframe.where((pandas.notnull(parsedDtframe)), None)