conectar - python connect to as400
DB2 utilizando pyodbc en Mac OSX (2)
Intento conectarme a una base de datos DB2 utilizando pyodbc en Mac OS X y parece que no puedo hacerlo funcionar. He tenido éxito usando FreeTDS para conectarme a MS SQL Server en condiciones similares.
Primero, instalé db2exc_client_952_MAC_x86_64 de IBM. Después de instalarlo con éxito, fui a agregar el controlador a través del administrador de ODBC.
Luego intenté ejecutar este pitón:
import pyodbc
cnxn = pyodbc.connect(''Driver={IBM DB2 ODBC Driver}; Hostname=myhost.com; Port=50300; Protocol=TCPIP; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD;'');
Y recibo este error:
Rastreo (llamada más reciente): Archivo "", línea 1, en pyodbc.Error: (''HY000'', ''[] / xf8 / x92 / x90 / x81 / x9b / xf8 / x93 / x90 / x81 / x82 / xf8 / x96 / xb0 / x81 / x9d / xf8 / x93 / x80 / x81 / x83 / xf8 / x88 / x80 / x81 / x89 / xf8 / x9c / xa0 / x81 / x84 / xf8 / x9d / xa0 / x81 / xa9 / xf8 / x9c / xa0 / x81 / xa5 / xf8 / x88 / x80 / x81 / x9d / xf8 / x94 / x90 / x81 / x93 / xf8 / x8c / x90 / x81 / x8c / xf8 / x8c / xa0 / x80 / xb0 / xf8 / x93 / xa0 / x80 / xb4 / xf8 / x88 / x80 / x80 / xa0 / xf8 / x88 / x80 / x81 / x81 / xf8 / x98 / x90 / x81 / xa4 / xf8 / x98 / x90 / x81 / xb4 / xf8 / x98 / x90 / x81 / xa2 / xf8 / x99 / x90 / x81 / xb3 / xf8 / x98 / xb0 / x80 / xa0 / xf8 / x9b / xa0 / x81 / xaf / xf8 / x99 / x90 / x81 / xae / xf8 / x9d / x80 / x81 / xa3 / xf8 / x9b / xb0 / x81 / xa9 / xf8 / x88 / x80 / x81 / xae / xf8 / x9b / xb0 / x81 / xa4 / xf8 / x9c / xb0 / x81 / xa5 / xf8 / x9b / xa0 / x80 / xa0 / xf8 / x9d / x80 / x81 / xaf / xf8 / x99 / x90 / x80 / xa0 / xf8 / x9a / x90 / x81 / xb8 / xf8 / x9d / x80 / x81 / xb3 / xf8 / x88 / x80 / x80 / xae / xf8 / x94 / xb0 / x80 / xa0 / xf8 / x93 / x80 / x81 / x91 / xf8 / x95 / x80 / x81 / x93 / xf8 / x95 / x80 / x81 / x81 / xf8 / x8f / x90 / x81 / x85 / xf8 / x8e / x80 / x80 / xb0 / xf8 / x8c / x80 / x80 / xb0 / xf2 / xa0 / x80 / xb3 / xfc / xa0 / x9c / xb0 / x80 / x80 / xfd / xa1 / x99 / x82 / x81 / xa1 / xfd / xa1 / x98 / xa6 / x85 / xb4 / xfd / xa9 / x88 / x86 / x95 / xb3 / xfd / x82 / x91 / x82 / x81 / xae / xfd / xaf / x99 / xa2 / x80 / xb2 / xfd / x96 / x93 / x92 / x81 / xb2 / xfd / x93 / x82 / xa2 / xb9 / x93 / xff / x7f ( -1024) (SQLDriverConnect) '')
De la búsqueda descubrí que HY000 puede ser un problema de connectionString, pero no estoy seguro de cómo descifrar el resto del error.
¿Algunas ideas?
Parece que las cadenas de conexión varían según la base de datos y que la cadena de conexión que está utilizando no es compatible con DB2.
Aquí hay algunas cadenas de conexión de ejemplo de DB2:
http://www.connectionstrings.com/ibm-db2
Esta es la mejor referencia que pude encontrar sobre lo que es válido en una cadena de conexión de DB2:
Basado en eso, convertiría su cadena de conexión de:
Driver={IBM DB2 ODBC Driver}; Hostname=myhost.com; Port=50300; Protocol=TCPIP; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD;
A:
Driver={IBM DB2 ODBC Driver}; Server=myhost.com:50300; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD;
Así es como se ve mi cadena de conexión en PHP (sé que estás usando Python, pero creo que son muy similares):
$this->db_connection = new PDO("odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM=10.xxx.xxx.xxx;PROTOCOL=TCPIP", $temp_username, $temp_password);
Tenga en cuenta que digo "SYSTEM = ..." y dice "Hostname = ..." - Creo que eso podría ser importante.
¿Tu DSN está configurado por completo? En mis máquinas Linux tengo dos archivos que contienen toda nuestra información de configuración para DSN.
odbc.ini
[primary]
Description = primary
Driver = iSeries Access ODBC Driver
System = xxx.xxx.xxx.xxx
UserID = xxxxxxxxxx
Password = xxxxxxxxxx
Naming = 0
DefaultLibraries = QGPL
Database = xxxxxxxxxx
ConnectionType = 0
CommitMode = 2
ExtendedDynamic = 0
DefaultPkgLibrary = QGPL
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 1
LibraryView = 0
AllowUnsupportedChar = 0
ForceTranslation = 0
Trace = 0
y odbcinst.ini
[iSeries Access ODBC Driver]
Description = iSeries Access for Linux ODBC Driver
Driver = /usr/lib/libcwbodbc.so
Setup = /usr/lib/libcwbodbcs.so
NOTE1 = If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN''s,
NOTE2 = the following Driver64/Setup64 keywords will provide that support.
Driver64 = /usr/lib/lib64/libcwbodbc.so
Setup64 = /usr/lib/lib64/libcwbodbcs.so
Threading = 2
DontDLClose = 1
UsageCount = 1
Creo que ingresas información similar en el diálogo que muestras, probablemente debajo de la pestaña DSN.
¿Ha habilitado el trazado de ODBC? Para hacer esto en Linux, tengo que agregar esto al archivo odbcinst.ini:
[ODBC]
Trace = Yes
TraceFile = /tmp/odbc.log
Esto arrojó MUCHA información para mí y me ayudó a diagnosticar algunos problemas que tuve en el pasado.
Según esta página (http://code.google.com/p/pyodbc/wiki/ConnectionStrings), "lo más importante que se debe saber es que pyodbc ni siquiera mira la cadena de conexión: se pasa directamente a SQLDriverConnect sin modificaciones ". Si eso es cierto, cambiar tu "Nombre de host" por "SISTEMA" debería ser el truco.
EDITAR
¿Hay alguna posibilidad de que esto sea un problema con la codificación? Unicode tratando de hablar con un servidor UTF-8 (o algo similar)? ¿Has intentado configurar el CCSID? Cuando configura el controlador, ¿tiene opciones como "BinAsChar", "CCSID" o "Host CCSID"?
Por defecto, creo que el CCSID es 37 (EE. UU./Canadá) y creo que Unicode es 1208.