pyodbc – Bases de datos Access



Versión: 2.6+, 3.x

Introducción

Microsoft Access

Se trata de un entorno y motor de base de datos SQL (también conocidas como bases de datos relacionales) que forma parte de la suite ofimática Microsoft Office desde la década de 1990. Comparte características con SQLite, ya que las bases de datos están representadas por un archivo en el sistema, generalmente con las extensiones .mdb, .accdb, entre otras. El producto consta tanto del motor de la base de datos como el entorno, el IDE, desde el cual se crean las tablas, filas, columnas, valores, etc. Si bien todas estas características son accesibles únicamente en Microsoft Windows, a través del estándar ODBC podemos realizar conexiones en otros sistemas operativos, como aquellos basados en Unix.

ODBC

Open DataBase Connectivity es un estándar desarrollado por SQL Access Group en el año 1992 con el objetivo de proveer un sistema independiente de acceso a las bases de datos, sin importar qué motor se utilice, a través de controladores específicos. Esto quiere decir que una aplicación puede soportar múltiples motores de base de datos con tan solo indicar el nombre de un controlador.

pyodbc

pyodbc es un módulo compatible con Python 2 y 3 que permite utilizar ODBC para conectar a la gran mayoría de bases de datos desde Windows, Linux, OS/X y más. Licenciado bajo la MIT License, es gratuito tanto para uso personal como comercial.

Instalación

Controlador

Para poder trabajar con ODBC es necesario instalar el controlador correspondiente.

En Windows, si tienes una instalación de Microsoft Access es muy probable que ya esté instalado. Puedes encontrar las descargas en esta página del sitio oficial de Microsoft. Nótese que si tienes una instalación de 32-bit de Access, deberás utilizar el controlador de 32-bit con un intérprete de Python de 32-bit, sin importar si tu sistema es de 64-bit.

En sistemas basados en Linux, lógicamente Microsoft no distribuye controladores para dichas plataformas. Sin embargo, otros fabricantes proveen lo necesario para realizar la conexión utilizando ODBC. Puedes utilizar MDB Tools, una serie de herramientas y aplicaciones para facilitar el uso del formato MDB en otras plataformas; o el controlador ODBC de Access desarrollado por EasySoft.

pyodbc

Una vez instalado el controlador correspondiente, utilizaremos el módulo pyodbc para crear las conexiones, ejecutar consultas, etc. Visita la página de descargas del proyecto (que incluye instaladores para Windows) para utilizar el paquete que concuerde con tu versión de Python y arquitectura del sistema. También puedes consultar el paquete en PyPI.

En Windows, ejecuta el instalador y sigue las instrucciones. En las demás plataformas, abre la terminal y escribe:

python setup.py install

Con una previa ubicación en la carpeta correspondiente (por ejemplo, cd Descargas/pyodbc-3.0.7).

Por último, prueba importando el módulo:

import pyodbc

Si todo va bien, has instalado pyodbc con éxito.

Aplicación

El siguiente código de ejemplo muestra la simplicidad de uso del módulo. Aquellos que estén familiarizados con el uso de sqlite3 o MySQL podrán observar la similitud entre los paquetes.

Puedes descargar el código de ejemplo que incorpora el código de abajo y la base de datos correspondiente.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from os import getcwd

import pyodbc


# Nombre del controlador.
DRIVER_NAME = "Microsoft Access Driver (*.mdb, *.accdb)"

# Ruta completa del archivo.
DB_PATH = getcwd() + "/database.accdb"

# Establecer la conexión.
conn = pyodbc.connect("Driver={%s};DBQ=%s;" % (DRIVER_NAME, DB_PATH))

# Crear cursor para ejecutar consultas.
cursor = conn.cursor()

# Agregar algunos datos.
name = "Guido"  # Nombre
surname = "van Rossum"  # Apellido
telephone = "No disponible"  # Número de teléfono
date = "03/10/2014"  # Fecha
wage = "$ 1.300" # (nota puntos y comas) # Remuneración
pending_payment = False  # Paga pendiente

# Ejecutar la consulta.
cursor.execute(u"INSERT INTO empleados (nombre, apellido, teléfono, "
               u"fecha, remuneración, paga_pendiente) VALUES (?, ?, "
               "?, ?, ?, ?)",
               name, surname, telephone, date, wage, pending_payment)

# Guardar los cambios.
cursor.commit()

# Ejecutar consulta: retornar todas las filas de la tabla empleados.
q = cursor.execute("SELECT * FROM empleados")
rows = q.fetchall()

# Recorrer cada una de las filas e imprimirlas en pantalla.
if rows is not None:
    for row in rows:
        print(row)
else:
    print("No hay datos en la tabla.")

# Cerrar la conexión y, opcionalmente, el cursor antes de finalizar.
cursor.close()
conn.close()

Vista previa

Básicamente se trata de especificar el nombre del archivo de base de datos (la ruta completa, nótese el uso de la función os.getcwd) junto con el controlador correspondiente. De esta manera, se crea una conexión y luego un cursor para ejecutar consultas. Puedes ver una lista de los nombres de los controladores en este enlace.

El método cursor.execute() (línea 30) permite ingresar signos de interrogación (?) para luego pasar sus valores correspondientes, evitando así el formateo de cadenas y, por lo tanto, vulnerabilidades en el código (especialmente en programación web).



6 comentarios.

  1. Hola hola, me aparece este error.. no se como puedo solucionarlo.. :c

    conn = pyodbc.connect(«Driver={%s};DBQ=%s;» % (DRIVER_NAME, DB_PATH))
    pyodbc.Error: (‘HY000’, «[HY000] [Microsoft][Controlador ODBC Microsoft Access]Error general No se puede abrir la clave ‘Temporary (volatile) Ace DSN for process 0x3690 Thread 0x2f98 DBC 0x2bc71cc Jet’ del Registro. (63) (SQLDriverConnect); [HY000] [Microsoft][Controlador ODBC Microsoft Access]Error general No se puede abrir la clave ‘Temporary (volatile) Ace DSN for process 0x3690 Thread 0x2f98 DBC 0x2bc71cc
    Jet’ del Registro. (63); [HY000] [Microsoft][Controlador ODBC Microsoft Access] No es un nombre de archivo v\xe1lido. (-1044); [HY000] [Microsoft][Controlador ODBC Microsoft Access]Error general No se puede abrir la clave ‘Temporary (volatile) Ace DSN for process 0x3690 Thread 0x2f98 DBC 0x2bc71cc Jet’ del Registro. (63); [HY000] [Microsoft][Controlador ODBC Microsoft Access]Error general No se puede abrir la clave ‘Temporary (volatile) Ace DSN for process 0x3690 Thread 0x2f98 DBC 0x2bc71cc Jet’ del Registro. (63); [HY000] [Microsoft][Controlador ODBC Microsoft Access] No es un nombre de archivo v\xe1lido. (-1044)»)

  2. Excelente, pero cunado lo pruebo en Linux no me funciona, me arroja el siguiente error
    Error: (‘IM002’, ‘[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnectW)’), me pueden dar una ayuda , gracias

    • Recursos Python says:

      Hola. Por favor, ¿podrías indicar qué cadena estás pasando en la función pyodbc.connect? Probablemente no tengas un controlador instalado con el nombre que has especificado, o bien no está configurado correctamente.

      Un saludo.

      • Hola. Estoy en Ubuntu 14.04 y me da el siguiente error: (‘IM002’, ‘[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)’).

        En la función pyobdc.connect tengo

        # Nombre del controlador.
        DRIVER_NAME = «Microsoft Access Driver (*.mdb, *.accdb)»

        # Ruta completa del archivo.
        # DB_PATH = getcwd() + «/database.accdb»

        DB_PATH = «/home/marce/Escritorio/database.accdb»

        # Establecer la conexión.
        conn = pyodbc.connect(«Driver={%s};DBQ=%s;» % (DRIVER_NAME, DB_PATH))

        Alguna sugerencia?

        Muchas gracias.

        • Recursos Python says:

          Hola. Por defecto Ubuntu no incluye ningún driver ODBC para bases de datos Access, así que tienes que instalar uno por tu cuenta. Probablemente haya algunos gratuitos, pero por el momento puedo sugerirte éste que tiene una versión de prueba. Una vez instalado recuerda establecer el nombre del controlador DRIVER_NAME = "Easysoft ODBC-ACCESS".

Deja un comentario