我已经看过很多关于这个问题的stackoverflow帖子,但是没有一个提供解决方案。我将给出问题的细节:
关于数据:我有一个有52列的数据框。52列中有6列以日期作为数据。日期列中有3列是空的,定义为df.insert(5,"ACTIVE_DATE","")
,因为它们稍后手动填充,3列填充日期。填写的3列格式为DD/MM/YYYY。
关于问题:我已经尝试将数据上传到使用sqlalchemy和teradataml的teradata。DB表有自己的索引,因此设置为false。我正在使用sqlalchemy中的以下连接方法:
eng = sqlalchemy.create_engine('teradatasql://user:pass@host')
df.to_sql(name='Sales_DB',con=eng,if_exists='append',index=False,schema='sales')
但是每次我都得到相同的错误:
由[Version 17.0.0.3] [Session 19245476] [Teradata数据库][Error 2666]为Sales_DB.CREATE_DATE提供的日期无效引起。在gosqldriver/teradatasql。(* teradataConnection)。formatDatabaseError TeradataConnection.go: 1138在gosqldriver/teradatasql<</p>
为了解决这个问题,我更改了日期格式,并将潜在的问题理解为YYYY-MM-DD的元数据格式。这似乎适用于3个填充的日期列,但不适用于null日期列。似乎空日期值不能被teradata识别。我尝试使用df.insert(5,"ACTIVE_DATE",None)
,但这在teradata中也不起作用,导致错误-不可追踪的字符。
问题1:当3列为空时,我如何成功上传df到teradata ?它们不能由占位符填充,因为它们需要空发送出去。
问题2:另一个DB的日期格式为DD/MM/YYYY,这似乎没有问题,虽然它不使用python脚本。有人能解释一下为什么这不起作用吗?
谢谢
希望我回答这个问题不会太晚,但我认为问题可能是Teradata没有Python None的概念。如果您尝试使用Python的None在Teradata中插入/更新值,您可能会遇到类似的问题。它看起来也像您的列是Datetime,所以您不能向它插入一个空白字符串("):
INSERT INTO DB.TBL (DATE_FIELD, KEY_FIELD) VALUES (None, 3); -- Will produce a Syntax error
INSERT INTO DB.TBL (DATE_FIELD, KEY_FIELD) VALUES ("",3); -- Will produce a coltype error
尝试让您的日期的默认值为NULL或1900-01-01 00:00:01 - Teradata理解这个。
df.insert(5,"ACTIVE_DATE","1900-01-01 00:00:01")
df.insert(5,"ACTIVE_DATE","NULL")