python osx macos ms-access odbc pyodbc

Trabajar con una base de datos de Access en Python en una plataforma que no sea Windows(Linux o Mac)



osx macos (4)

En Mac OSx y Ubuntu 18.04 puedes usar pandas_access

De la documentación:

import pandas_access as mdb db_filename = ''my_db.mdb'' # Listing the tables. for tbl in mdb.list_tables(db_filename): print(tbl) # Read a small table. df = mdb.read_table(db_filename, "MyTable")

En Ubuntu puede que necesite ejecutar:

sudo apt install mdbtools

Quiero acceder a los datos en una base de datos de Microsoft Access. Tengo algunos archivos .accdb y .mdb y quiero leerlos en Python.

Según mi investigación, pyodbc solo se puede usar en la plataforma Windows, pero estoy trabajando en Mac OS X. Soy nuevo en Python.

La otra opción es si pudiera exportar los datos de la base de datos a un csv y luego usarlos en python.

Cualquier ayuda o inicio sería muy apreciada.


Esta pregunta es antigua pero la documentación dice:

La forma más fácil de instalar es usando pip. Los binarios de Windows se descargarán, pero otros sistemas operativos deberán compilarse desde la fuente.

Entonces debería ser posible. También hay un ejemplo para máquinas Linux.

http://mkleehammer.github.io/pyodbc/#connecting

Pero mira esta parte en la fuente.

https://github.com/mkleehammer/pyodbc/blob/master/tests2/accesstests.py#L630,L636

Le muestra cómo se ve la cadena de conexión para los archivos de MS Access.


Para una conversión única de un archivo .mdb antiguo a .sqlite, este sitio me pareció útil: https://www.rebasedata.com/convert-mdb-to-sqlite-online . No estoy afiliado de ninguna manera, es justo con lo que terminé cuando no hay respuestas que funcionen para mí. Ofrecen un comando curl:

curl -F files[][email protected] ''https://www.rebasedata.com/api/v1/convert?outputFormat=sqlite&errorResponse=zip'' -o output.zip


"Según mi investigación, pyodbc solo se puede usar en la plataforma Windows"

No es verdad. La página principal de pyodbc dice

Se proporcionan ruedas binarias precompiladas para la mayoría de las versiones de Python en Windows y macOS. En otros sistemas operativos [pip install pyodbc] se generará desde la fuente.

Sin embargo, es cierto que el uso de ODBC para manipular una base de datos de Access se realiza principalmente en Windows. "MDB Tools", junto con "unixODBC", a menudo se menciona como una forma de trabajar con bases de datos de Access en plataformas que no son Windows, pero en mi experiencia limitada he descubierto que realmente no funciona muy bien (cuando funciona en absoluto).

Por supuesto, siempre puede comprar un controlador ODBC MS Access de terceros para su plataforma que no sea Windows, pero si desea una solución gratuita de código abierto, puede usar el UCanAccess JDBC UCanAccess . Hay dos formas de lograrlo: JayDeBeApi y Jython .

En ambos casos, deberá descargar la última versión de UCanAccess (disponible para descargar here ) y desempaquetar el archivo "bin.zip" en una ubicación conveniente, asegurándose de preservar la estructura de la carpeta:

(En los siguientes ejemplos lo descomprimí en ~/Downloads/JDBC/UCanAccess ).

Opción 1: JayDeBeApi

Esta es la opción preferida, ya que debería funcionar con su configuración actual de Python. Puede instalar JayDeBeApi con pip . Actualmente (julio de 2019) hay problemas con las versiones posteriores de JPype1, por lo que debe instalar las versiones específicas

pip install JPype1==0.6.3 JayDeBeApi==1.1.1

Si aún no tiene un JRE (Java Runtime Environment) instalado, también lo necesitará. ( sudo apt install default-jre en Ubuntu).

Una vez que los componentes necesarios estén en su lugar, debería poder usar un código como este:

import jaydebeapi db_path = "/home/gord/test.accdb" ucanaccess_jars = [ "/home/gord/Downloads/JDBC/UCanAccess/ucanaccess-4.0.4.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-lang-2.6.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-logging-1.1.3.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/hsqldb.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/jackcess-2.1.11.jar", ] classpath = ":".join(ucanaccess_jars) cnxn = jaydebeapi.connect( "net.ucanaccess.jdbc.UcanaccessDriver", f"jdbc:ucanaccess://{db_path};newDatabaseVersion=V2010", ["", ""], classpath ) crsr = cnxn.cursor() try: crsr.execute("DROP TABLE table1") cnxn.commit() except jaydebeapi.DatabaseError as de: if "user lacks privilege or object not found: TABLE1" in str(de): pass else: raise crsr.execute("CREATE TABLE table1 (id COUNTER PRIMARY KEY, fname TEXT(50))") cnxn.commit() crsr.execute("INSERT INTO table1 (fname) VALUES (''Gord'')") cnxn.commit() crsr.execute("SELECT * FROM table1") for row in crsr.fetchall(): print(row) crsr.close() cnxn.close()

Opción 2: Jython

(Tenga en cuenta que Jython es una implementación separada de Python, solo es compatible con Python 2.7, y aparentemente ya no está en desarrollo activo).

Importante: Las siguientes instrucciones son para UCanAccess versión 3.0.5 o posterior.

Después ...

  • instalar Jython (a través de sudo apt-get install jython en Ubuntu) y
  • descargando UCanAccess y descomprimiéndolo como se describe arriba

Creé el siguiente script Jython llamado "dbTest.py"

from com.ziclix.python.sql import zxJDBC jdbc_url = "jdbc:ucanaccess:///home/gord/Documents/test.accdb" username = "" password = "" driver_class = "net.ucanaccess.jdbc.UcanloadDriver" cnxn = zxJDBC.connect(jdbc_url, username, password, driver_class) crsr = cnxn.cursor() crsr.execute("SELECT AgentName FROM Agents") for row in crsr.fetchall(): print row[0] crsr.close() cnxn.close()

y lo ejecuté con el siguiente script de shell

#!/bin/bash export CLASSPATH=.:/home/gord/Downloads/JDBC/UCanAccess/loader/ucanload.jar jython dbTest.py