Cómo convertir la cadena hexadecimal a binaria en python para insertar usando cx_oracle
Pregunta
Tengo un archivo de texto que contiene una lista de números hexagonales de 16 bits (por ejemplo, '61C7393AA9B3474DB081C7B7CCE1C545') y necesito insertarlos una columna RAW de Oracle usando CX_Oracle. Intenté esto:
sql = "INSERT INTO GUIDS VALUES (HEXTORAW(:1))"
ids = [l.strip() for l in guidfile.readlines()]
cursor.bindarraysize = len(ids)
cursor.setinputsizes(cx_Oracle.BINARY)
cursor.executemany(sql, ids)
Pero falla con cx_oracle.databaseError: ORA-01036: Nombre/número de variable ilegal. ¿Necesito convertir los valores en binario en Python antes de llamar a Executemany? Y si es así, ¿cómo? NB El mismo SQL funciona bien con Cursor.Execute y un solo valor, solo con la lista que tengo problemas.
Solución
Bueno, lo he resuelto, de un par de maneras. En primer lugar, el código anterior es incorrecto ya que crea una lista de valores, mientras que debería crear una lista de tuplas. es decir
ids = [(l.strip(),) for l in guidfile.readlines()]
y luego usando
cursor.setinputsizes(cx_Oracle.STRING)
funciona. Sobre la pregunta original: cómo deshacerse del Hextoraw, descubrí que esto funciona:
import base64
ids = [(base64.b16decode(l.strip()),) for l in guidfile.readlines()]
cursor.setinputsizes(cx_Oracle.BINARY)