我目前正在研究一些ETL代码,以Python作为粘合剂,将数据从源Oracle系统递增加载到Postgresql分析环境。
我正在利用cx_Oracle作为拉取Oracle数据的驱动程序,但我遇到了Oracle Date和Python datetime和0年的一些奇怪问题。
据我了解,Oracle和Python都不支持第0年。我已经用违规日期隔离了特定的行和字段:
SELECT
CAR_RENTAL_DATE,
EXTRACT(YEAR FROM CAR_RENTAL_DATE)
FROM
TRXNS_ALL
WHERE
TRX_ID = 50079327
以下是sqlplus CLI的结果:
CAR_RENTA EXTRACT(YEARFROMCAR_RENTAL_DATE)
--------- --------------------------------
30-JUN-00 0
根据这篇文章,实际上可以创建一个带有0年级的Oracle日期,但文档中没有正式支持它:in a comment
我遇到的问题是cx_Oracle返回给我的Python表示:
cur.execute('select CAR_RENTAL_DATE, extract(year from CAR_RENTAL_DATE) FROM TRXNS_ALL where TRX_ID = 50079327')
res = cur.fetchone()
print repr(res[0]), type(res[0])
结果如下:
datetime.datetime(0, 6, 30, 0, 0) <type 'datetime.datetime'>
奇怪(但预计),创建相同的Python日期时间会给我一个错误:
dt = datetime.datetime(0, 6, 30, 0, 0)
ValueError: year is out of range
当我尝试使用psycopg2将此日期时间插入Postgresql时间戳字段时,插入失败,正如预期的那样。
这里到底发生了什么?尽管有文档,Oracle和Python如何支持第0年?
除了迭代cx_Oracle返回的每个元组值以检测和处理year = 0之外,处理此问题的好方法是什么?