使用Python的Win32 ODBC模块获取Oracle时间戳

3 投票
2 回答
2114 浏览
提问于 2025-04-11 09:15

假设你有一个用下面的方式创建的Oracle表:

CREATE TABLE Log(WhenAdded TIMESTAMP(6) WITH TIME ZONE);

我使用Python的ODBC模块,来自它的Win32扩展(来自win32all包),尝试了以下代码:

import dbi, odbc

connection = odbc.odbc("Driver=Oracle in OraHome92;Dbq=SERVER;Uid=USER;Pwd=PASSWD")

cursor = connection.cursor()
cursor.execute("SELECT WhenAdded FROM Log")

results = cursor.fetchall()

当我运行这段代码时,出现了以下问题:

Traceback (most recent call last):
...
    results = cursor.fetchall()
dbi.operation-error: [Oracle][ODBC][Ora]ORA-00932: inconsistent datatypes: expected %s got %s 
in FETCH

我尝试过的其他数据类型(比如VARCHAR2和BLOB)没有出现这个问题。有没有办法能获取时间戳的数据呢?

2 个回答

1

我对这个问题的解决办法是使用Oracle数据库,把时间戳明确地转换成字符串:

cursor.execute("SELECT TO_CHAR(WhenAdded, 'YYYY-MM-DD HH:MI:SSAM') FROM Log")

这个方法是有效的,但不够通用。我希望能用同一个Python脚本去操作SQL Server数据库,所以像TO_CHAR这样的Oracle特有的解决方案就不适用了。

2

我觉得这是Oracle ODBC驱动程序的一个bug。简单来说,Oracle ODBC驱动程序不支持这种数据类型,只支持这种数据类型。正如你发现的那样,一个解决办法就是使用方法。

在你的例子中,其实你并没有读取时区信息。如果你能控制这个表的话,可以把它转换成普通的列。如果你不能控制这个表,另一个解决方案可能是创建一个视图,把转换成,通过字符串的方式来实现——抱歉,我不知道有没有办法直接从转换到

撰写回答