Cómo os he contado en las últimas semanas, estoy progresando a pasos agigantados con Python, pero aún me quedan cosas … muchas … por aprender. Ahora estoy empezando a realizar pequeños scripts que trabajan con bases de datos, y …. me he encontrado con mi primer problema serio: trabajar con ficheros Microsoft Access en Python.
En este blog hemos tratado la instalación de nuevos paquetes en Python de varias formas, y con varios ejemplos, uno de ellos era mysql-db para trabajar con bases de datos MySQL. De igual forma, hay otro paquete llamado sqlite3 para trabajar con bases de datos SQLite, y así sucesivamente. Incluso hemos visto cómo instalar nuevos paquetes con el código fuente. Estos paquetes facilitan trabajar con esas bases de datos, pero para hacerlo con MS Access, no existe un paquete que facilite la vida.
¿Qué sucede con Microsoft Access?
Pues … no existe un paquete facilite trabajar con bases de datos Microsoft Access, y la resolución es distinta si trabajamos con Windows XP a si lo hacemos con Windows 7. A esto lo considero yo un serio problema!
Bueno, en realidad, teóricamente, sólo habría que cambiar la cadena de conexión, pero … comprobamos con un mismo código lo que ocurre en Windows XP y en Windows 7.
El origen del problema: las cadenas de conexión
Una cadena de conexión contiene información de inicialización que se transfiere como un parámetro desde un proveedor de datos a un origen de datos. La sintaxis depende del proveedor de datos y la cadena de conexión se analiza mientras se intenta abrir una conexión.
Cuando empecé a programar en Visual Basic 6, una de las cosas que más me costaba era precísamente la creación de las cadenas de conexión, para lo que solía usar la siguiente web: www.connectionstrings.com. Para facilitar el trabajo, terminé programando mi propia librería que durante años he ido ampliando conforme iba necesitando cosas, y que me ahorra mucho trabajo (tengo pendiente hablar también de ella!).
En Python también hay cadenas de conexión
Y ahora que empiezo a sentirme cómodo con Python, me encuentro con que también son necesarias las cadenas para trabajar con ciertos archivos (MS Access, MS Excel, …). Y encima, dependiendo de los motores de bases de datos de Microsoft, ya sea OLE Db, como ACE.
Encima, para complicar aun más las cosas, hay serios problemas según tengas Windows XP, o un sistema operativo de 64 bits, todo cortesía de Microsoft.
Windows 7 y los problemas con el motor Jet OleDb 4.0
El motor Jet OleDb 4.0 es el principal motor para trabajar con bases de datos Microsof Access, y de hecho es el que suelo utilizar, pero … con los sistemas operativos de 64 bits, la cosa se complica pues …
No existe el motor Jet Ole Db en máquinas de 64 bits.
Aqui podeis encontrar un blog que también trata este problema: http://govindkanshi.wordpress.com/2008/11/29/accessing-jet-db-on-64-bit-windows/. Incluso desde uno de los blogs de la propia Microsoft, lo ponen bien clarito:
Native 64-bit applications cannot communicate with the 32-bit Jet drivers running in WOW64.
El comentario en esa página del usuario “zolten” expone el problema:
Office 2007 x86 already installed on a Windows 7 x64 and an application needs data from an Access db file. The Office driver can’t be installed because of the Office architecture/version conflict.
La solución que te “ofrece” la propia Microsoft es cambiar Access por otro motor: Microsoft SQL Server Express Edition o Microsoft SQL Server Compact Edition. Ninguna de esas opciones me convence!
El problema de Microsoft con SQLite
Y … ¿porqué no cambiar MS Access por SQLite? Lo haría encantado, pero …. no hay drivers para Visual Basic 6 (o al menos, los que yo he intentado me han resultado tremendamente complicados!), y el problema que quiero resolver implica a ambos lenguajes: VB6 y Python.
En definitiva, confiar en Microsoft empieza a darme verdaderos problemas de cabeza, y esto tiene sus consecuencias: cada día programo menos en C#, y estoy probando máquinas Linux. Si a esto le sumo el que Microsoft decició cargarse a Visual Basic 6, …. el camino como usuario Windows podría tener fecha de caducidad!
Buen día!