Подтвердить что ты не робот

Работа с базой данных Access в Python на платформе не Windows (Linux или Mac)

Я хочу получить доступ к данным в базе данных Microsoft Access. У меня есть файлы .accdb и .mdb и вы хотите их прочитать в Python.

Из моих исследований pyodbc можно использовать только на платформе Windows, но я работаю над Mac OS X. Я новичок в Python.

Другой вариант: если я могу экспортировать данные из базы данных в csv, а затем использовать в python.

Любая помощь или запуск будут высоко оценены.

4b9b3361

Ответ 1

"Из моих исследований pyodbc можно использовать только на платформе Windows"

Не правда. На главной странице pyodbc написано

Предварительно скомпилированные двоичные диски предоставляются для большинства версий Python для Windows и macOS. В других операционных системах [pip install pyodbc] будет собираться из исходного кода.

Тем не менее, это правда, что использование ODBC для управления базой данных Access в основном делается в Windows. "Инструменты MDB" наряду с "unixODBC" часто упоминаются как способ работы с базами данных Access на платформах, отличных от Windows, но из своего ограниченного опыта я обнаружил, что на самом деле он просто не очень хорошо работает (когда он работает совсем).

Конечно, вы всегда можете приобрести сторонний драйвер MS Access ODBC для вашей платформы, отличной от Windows, но если вам нужно бесплатное решение с открытым исходным кодом, вы можете использовать драйвер JDBC UCanAccess. Есть два способа сделать это: JayDeBeApi и Jython.

В обоих случаях вам потребуется загрузить последнюю версию UCanAccess (доступную для загрузки здесь) и распаковать файл "bin.zip" в удобное место, убедившись, что структура папок сохранена:

ucaFolder.png

(В следующих примерах я распаковал его в ~/Downloads/JDBC/UCanAccess.)

Вариант 1: JayDeBeApi

Это предпочтительный вариант, так как он должен работать с вашей существующей установкой Python. Вы можете установить JayDeBeApi с помощью pip. В настоящее время (июль 2019 г.) существуют проблемы с более поздними версиями JPype1, поэтому вам следует установить определенные версии

pip install JPype1==0.6.3 JayDeBeApi==1.1.1

Если у вас еще не установлена JRE (среда выполнения Java), то вам это тоже нужно. (Я использовал sudo apt install default-jre в Ubuntu.)

Как только необходимые компоненты будут готовы, вы сможете использовать такой код:

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()

Вариант 2: Jython

(Обратите внимание, что Jython является отдельной реализацией Python, он поддерживает только Python 2.7 и, по-видимому, больше не находится в активной разработке.)

Важное замечание : Следующие инструкции предназначены для UCanAccess версии 3.0.5 или более поздней.

После...

  • установка Jython (через sudo apt-get install jython в Ubuntu) и
  • загрузите UCanAccess и распакуйте его, как описано выше

Я создал следующий скрипт Jython с именем "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()

и запустил его с помощью следующего сценария оболочки

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

Ответ 2

В Mac OSx и Ubuntu 18.04 вы можете использовать pandas_access

Из документации:

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")

В Ubuntu вам может понадобиться запустить:

sudo apt install mdbtools

Ответ 3

Этот вопрос старый, но в документации говорится:

Самый простой способ установки - использовать pip. Бинарные файлы Windows будут загружены, но другие операционные системы должны будут скомпилироваться из источника.

Так что это должно быть возможно. Также есть пример для Linux-машин.

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

Но проверьте эту часть в источнике.

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

Он показывает вам, как выглядит строка подключения для файлов MS Access.

Ответ 4

Для одноразового преобразования старого файла.mdb в.sqlite я нашел этот сайт полезным: https://www.rebasedata.com/convert-mdb-to-sqlite-online. Я никоим образом не связан с этим, это то, с чем я столкнулся, когда у меня не сработало ни одного ответа. Они предлагают команду curl:

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