Recuperar una marca de tiempo de Oracle usando el módulo ODBC Win32 de Python
Pregunta
Dada una tabla de Oracle creada usando lo siguiente:
CREATE TABLE Log(WhenAdded TIMESTAMP(6) WITH TIME ZONE);
Usando el módulo ODBC de Python desde su extensiones win32 (del paquete win32all), probé lo siguiente:
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()
Cuando ejecuto esto, obtengo lo siguiente:
Traceback (most recent call last):
...
results = cursor.fetchall()
dbi.operation-error: [Oracle][ODBC][Ora]ORA-00932: inconsistent datatypes: expected %s got %s
in FETCH
Los otros tipos de datos que probé (VARCHAR2, BLOB) no causan este problema.¿Existe alguna forma de recuperar marcas de tiempo?
Solución
Creo que esto es un error en el controlador ODBC de Oracle.Básicamente, el controlador ODBC de Oracle no es compatible con el TIMESTAMP WITH (LOCAL) TIME ZONE
tipos de datos, sólo el TIMESTAMP
tipo de datos.Como ha descubierto, una solución alternativa es, de hecho, utilizar el TO_CHAR
método.
En su ejemplo, en realidad no está leyendo la información de la zona horaria.Si tienes el control de la mesa, puedes convertirla en una recta. TIMESTAMP
columna.Si no tiene control sobre la tabla, otra solución puede ser crear una vista que convierta de TIMESTAMP WITH TIME ZONE
a TIMESTAMP
a través de una cadena - lo siento, no sé si hay una manera de convertir directamente desde TIMESTAMP WITH TIME ZONE
a TIMESTAMP
.
Otros consejos
Mi solución a esto, que espero pueda mejorarse, es usar Oracle para convertir explícitamente TIMESTAMP en una cadena:
cursor.execute("SELECT TO_CHAR(WhenAdded, 'YYYY-MM-DD HH:MI:SSAM') FROM Log")
Esto funciona, pero no es portátil.Me gustaría usar el mismo script de Python en una base de datos de SQL Server, por lo que una solución específica de Oracle (como TO_CHAR) no funcionará.