Что такое odbc linux

Обновлено: 07.07.2024

How to setup ODBC application connectivity on Linux using the IBM Data Server Driver and unixODBC?

Cause

There are no step by step instructions regarding how to install and configure the ODBC connectivity for an application.

Answer


This example assumes the application requiring ODBC connectivity will be run with the userid "db2inst1" and will connect to:

Root id will be required to configure the ODBC driver manager configuration files and the IBM Data Server (DS) Driver if it is installed in /opt/ibm/db2/dsdriver as per our example. The DS Driver can be installed in the user's home directory as well such as /home/db2inst1/dsdriver.


1) Install & Configure ODBC Driver Manager

(a) Install the ODBC Driver Manager as per link below:

Get location of odbcinst executable:

/home/db2inst1: which odbcinst
/usr/local/bin/odbcinst


Get ODBC configuration file locations and make note of the System and User Data Sources file locations.

/home/db2inst1: odbcinst -j
unixODBC 2.3.0
DRIVERS. /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES. /usr/local/etc/ODBCDataSources
USER DATA SOURCES. /home/db2inst1/.odbc.ini
SQLULEN Size. 8
SQLLEN Size. 8
SQLSETPOSIROW Size.: 8


2) Setup the ODBC environment.

Edit .bashrc and add the lines below:

Ensure /opt/ibm/db2/dsdriver/db2profile has permission to execute db2profile.

The ODBC libraries are usually located in the path below:

/usr/lib64/libodbc.so (64-bit)
/usr/lib/libodbc.so (32-bit)

After editing .bashrc, source the profile again or exit and login again for the new environment variables to take effect.

Reference: Please refer to link "Setting Up ODBC Environment"


3) Install IBM Data Server (DS) Driver .

(b) Select the platform and download "IBM Data Server Driver Package".

(c) Install the DS driver, in this example we install it in /opt/ibm/db2/dsdriver.

(d) Create and configure db2dsdriver.cfg

cd /opt/ibm/db2/dsdriver
touch db2dsdriver.cfg


Note: There is a sample file called <DS Driver install path>/cfg/db2dsdriver.cfg.sample for reference.


(4) Configure ODBC, System and User Data Sources files.

(a) Edit the ODBC driver manager configuration file (/usr/local/etc/odbcinst.ini) to point to the location of the DS Driver

[DB2]
Description = DB2 Driver
Driver = /opt/ibm/db2/dsdriver/lib/libdb2o.so
fileusage=1
dontdlclose=1

(b) Create the System Data Sources file. Root is required if the DS driver was installed in /opt/ibm/db2/dsdriver.

[SAMPLE]
Driver=/opt/ibm/db2/dsdriver/lib/libdb2o.so
Description=Sample DB2 ODBC Database

Our DSN is called "SAMPLE" which is the name of the database.


(c) OPTIONAL: If the SAMPLE database is not found in the System DSN, it will search for the User Data Source file. Thus this step is optional if the System DSN already contains the database name. For our purposes the User DSN's contents are identical to the System DSN.

Create the User Data Sources file.

/home/db2inst1: touch .odbc.ini

Edit the file /home/db2inst1/.odbc.ini

[SAMPLE]
Driver=/opt/ibm/db2/dsdriver/lib64/libdb2.so
Description=Sample 64-bit DB2 ODBC Database


Optional: Add 32-bit DSN for 32-bit application
[SAMPLE32]
Driver=/opt/ibm/db2/dsdriver/lib32/libdb2.so
Description=Sample 32-bit DB2 ODBC Database


5) Test the connectivity via "isql" to confirm the ODBC has been setup correctly and can connect to the remote database SAMPLE.

$isql -v SAMPLE <userid> <password>

Testing 32-bit DSN
By default isql is a 64-bit binary which cannot access 32-bit libdb2.so. Attempting to run it against a 32-bit ODBC DSN will return the error below:

[01000][unixODBC][Driver Manager]Can't open lib '/home/db2inst1/sqllib/lib32/libdb2.so' : file not found
[ISQL]ERROR: Could not SQLConnect

Attached is the 32-bit binary isql32 for testing.

Alternative: Get source code and re-compile as 32-bit

b) tar -xzvf unixODBC*.tar.gz

c) Set gcc flags for 32-bit
export CFLAGS=-m32
export LDFLAGS=-m32
export CPPFLAGS=-m32

d) Configure Make files so compiled binaries are placed in /tmp/unixODBC32 so they do not overwrite current 64-bit files.

cd unixODBC*
mkdir /tmp/unixODBC32
./configure --prefix=/tmp/unixODBC32

f) /tmp/unixODBC32/exe contains 32-bit version of isql

file isql
isql: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

6) Test connectivity via IBM DS Driver.

/opt/ibm/db2/dsdriver/bin: ./db2cli validate -dsn SAMPLE -connect -user db2inst1 -passwd 123456

Client Package Type : IBM Data Server Driver Package
Client Version (level/bit): DB2 v10.5.0.4 (s140804/64-bit)
Client Platform : Linux/X8664
Install/Instance Path : /opt/ibm/db2/dsdriver/.
DB2DSDRIVER_CFG_PATH value: <not-set>
db2dsdriver.cfg Path : /opt/ibm/db2/dsdriver/./cfg/db2dsdriver.cfg
DB2CLIINIPATH value : <not-set>
db2cli.ini Path : /opt/ibm/db2/dsdriver/./cfg/db2cli.ini
db2diag.log Path : /opt/ibm/db2/dsdriver/./db2dump/db2diag.log

Success: The schema validation completed successfully without any errors.

Note: The validation utility could not find the configuration file db2cli.ini.
The file is searched at "/opt/ibm/db2/dsdriver/./cfg/db2cli.ini".

[ Parameters used for the connection ]

7) Try establishing a connection via your ODBC application.


Troubleshooting

(a) isql fails to connect and there are no SQLCODES returned.

/home/db2inst1: isql -v SAMPLE db2inst1 123456
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified

Ensure the System and User DSNs point to the same ODBC driver.

libdb2o.so: 64-bit applications
libdb2.so: 32-bit applications.

System DSN: /usr/local/etc/odbc.ini

User DSN (if applicable): /home/<user id>/.odbc.ini

(b) If an SQLCODE is returned please refer to the link "SQL codes" for more information regarding the message.

(c) The SQLCODE -30082 or SQL30082 was returned by isql (incorrect userid or password)

If "isql" can connect successfully using the same userid and password, then
check the following files to ensure "uid" and "pwd" have not been hard coded into the configuration files below.

/opt/ibm/db2/dsdriver/cfg/db2cli.ini (if applicable)

Please restart your application after making any changes to the files above.

Ensure the user id running the command has sourced the db2profile, also ensure the .bashrc points to the correct location of the installation path for the IBM DS Driver.

В этой статье объясняется, как установить Microsoft ODBC Driver for SQL Server в Linux. В ней также содержатся инструкции для необязательных средств командной строки для SQL Server ( bcp и sqlcmd ) и заголовков разработки unixODBC.

В этой статье приведены команды для установки драйвера ODBC из оболочки bash. Сведения о том, как загрузить пакеты напрямую, см. в разделе Скачивание драйвера ODBC Driver for SQL Server.

Microsoft ODBC 17

В следующих разделах объясняется, как установить драйвер Microsoft ODBC 17 из оболочки bash в различных дистрибутивах Linux.

Если вы установили пакет msodbcsql версии 17, который был доступен непродолжительное время, его следует удалить перед установкой пакета msodbcsql17 . Это позволит избежать конфликтов. Пакет msodbcsql17 можно установить параллельно с пакетом msodbcsql версии 13.

Alpine Linux

Для поддержки Alpine требуется драйвер версии 17.5 или более поздней.

Debian

Вместо настройки переменной среды ACCEPT_EULA вы можете создать переменную debconf с именем "msodbcsql/ACCEPT_EULA": echo msodbcsql17 msodbcsql/ACCEPT_EULA boolean true | sudo debconf-set-selections

Red Hat Enterprise Server и Oracle Linux

SUSE Linux Enterprise Server

Ubuntu

Вместо настройки переменной среды ACCEPT_EULA вы можете создать переменную debconf с именем "msodbcsql/ACCEPT_EULA": echo msodbcsql17 msodbcsql/ACCEPT_EULA boolean true | sudo debconf-set-selections

Предыдущие версии

В следующих разделах приведены инструкции по установке предыдущих версий драйвера Microsoft ODBC в Linux. Рассматриваются следующие версии драйверов.

ODBC 13.1

В следующих разделах объясняется, как установить драйвер Microsoft ODBC 13.1 из оболочки bash в различных дистрибутивах Linux.

Debian 8

Red Hat Enterprise Server 6

Red Hat Enterprise Server 7

SUSE Linux Enterprise Server 11

SUSE Linux Enterprise Server 12

Ubuntu 15.10

Ubuntu 16.04

Ubuntu 16.10

ODBC 13

В следующих разделах объясняется, как установить драйвер Microsoft ODBC 13 из оболочки bash в различных дистрибутивах Linux.

Red Hat Enterprise Server 6 (ODBC 13)

Red Hat Enterprise Server 7 (ODBC 13)

Ubuntu 15.10 (ODBC 13)

Ubuntu 16.04 (ODBC 13)

SUSE Linux Enterprise Server 12 (ODBC 13)

Автономная установка

Если необходимо установить драйвер Microsoft ODBC версии 13 на компьютере без подключения к Интернету, потребуется разрешить зависимости пакетов вручную. Драйвер Microsoft ODBC версии 13 имеет следующие прямые зависимости:

  • Ubuntu: libc6 (>= 2.21), libstdc++6 (>= 4.9), libkrb5-3, libcurl3, openssl, debconf (>= 0.5), unixodbc (>= 2.3.1-1)
  • Red Hat: glibc, e2fsprogs, krb5-libs, openssl, unixODBC
  • SUSE: glibc, libuuid1, krb5, openssl, unixODBC

Каждый из этих пакетов, в свою очередь, имеет собственные зависимости, которые могут отсутствовать в системе. Для решения этой проблемы в общем случае следует обратиться к документации по диспетчеру пакетов используемого дистрибутива: Red Hat, Ubuntu и SUSE

Другое распространенное решение — вручную скачать все зависимые пакеты в одну папку на компьютере установки, а затем вручную установить каждый пакет по очереди, завершив пакетом драйвера Microsoft ODBC версии 13.

Red Hat Linux Enterprise Server 7

Ubuntu 16.04 (ODBC 13 в автономном режиме)

SUSE Linux Enterprise Server 12 (ODBC 13 в автономном режиме)

После установки пакета можно проверить, находит ли драйвер Microsoft ODBC версии 13 все нужные зависимости. Для этого выполните команду ldd и проверьте наличие отсутствующих библиотек в выходных данных:

ODBC 11

В следующих разделах объясняется, как установить Microsoft ODBC Driver 11 в Linux. Для использования драйвера сначала установите диспетчер драйверов unixODBC. Дополнительные сведения: Установка диспетчера драйверов.

Процесс установки

Эти инструкции ссылаются на msodbcsql-11.0.2270.0.tar.gz (файл установки для Red Hat Linux). В случае установке предварительной версии для SUSE Linux файл называется msodbcsql-11.0.2260.0.tar.gz .

Порядок установки драйвера

Убедитесь, что у вас есть корневое разрешение.

Перейдите в каталог, куда был скачан файл с именем msodbcsql-11.0.2270.0.tar.gz . Убедитесь в наличии файла *.TAR.GZ, который соответствует вашей версии Linux. Чтобы извлечь файлы, выполните следующую команду: tar xvzf msodbcsql-11.0.2270.0.tar.gz .

Перейдите в каталог msodbcsql-11.0.2270.0 , где должен находиться файл install.sh.

Чтобы просмотреть список доступных параметров установки, выполните следующую команду: ./install.sh.

Перед установкой драйвера выполните следующую команду: ./install.sh verify . Выходные данные команды ./install.sh verify показывают, есть ли на компьютере ПО, необходимое для поддержки драйвера ODBC на Linux.

Когда вы будете готовы установить драйвер ODBC на Linux, выполните команду: ./install.sh install . Если вам нужно будет дополнительно указать команду установки ( bin-dir или lib-dir ), сделайте это после параметра install.

После просмотра лицензионного соглашения введите YES для продолжения установки.

При установке драйвер помещается в папку /opt/microsoft/msodbcsql/11.0.2270.0 . Драйвер и его вспомогательные файлы должны находиться в папке /opt/microsoft/msodbcsql/11.0.2270.0 .

Удаление

Вы можете удалить драйвер ODBC 11 на Linux, выполнив следующие команды:

rm -f /usr/bin/sqlcmd

rm -rf /opt/microsoft/msodbcsql

odbcinst -u -d -n "ODBC Driver 11 for SQL Server"

Файлы драйвера

Драйвер ODBC в Linux состоит из следующих компонентов.

Примечание. В одной программе нельзя ссылаться на msodbcsql.h и odbcss.h одновременно.

Загрузка файла ресурсов

Для работы драйверу необходимо загрузить файл ресурсов. Этот файл имеет имя msodbcsqlr17.rll или msodbcsqlr13.rll в зависимости от версии драйвера. Файл .rll располагается по пути относительно расположения самого драйвера ( so или dylib ), указанного в таблице выше. Кроме того, начиная с версии 17.1 драйвер пытается загрузить файл .rll из каталога по умолчанию, если его не удалось загрузить по относительному пути. Путь к файлу ресурсов по умолчанию в Linux: /opt/microsoft/msodbcsql17/share/resources/en_US/ .

Устранение неполадок

Если не удается установить подключение к SQL Server с помощью драйвера ODBC, см. статью, посвященную известным проблемам при устранении неполадок подключения.

Дальнейшие действия

После установки драйвера можно попробовать пример приложения C++ ODBC. Подробнее о разработке приложений ODBC см. в разделе Разработка приложений.

Дополнительные сведения см. в статьях с заметками о выпуске и требованиями к системе для драйвера ODBC.

Go -> Go driver for ODBC databases -> unixODBC -> ODBC driver -> ODBC database

There are a number of Go drivers that will connect Go on Linux to an ODBC database. This article covers:

All three Go drivers are compatible with unixODBC and this is the Driver Manager that is described in the examples in this article. By default, the Go drivers will attempt to use the unixODBC package that is included with the operating system (i.e. the one that will be installed in one of the standard system directories for program libraries). To minimise disruption to your system, you may prefer to use the unixODBC Driver Manager included with the operating system. However, this version may be considerably older than the current version of unixODBC, and one that is not recommended for use with the Go driver. For example, the author of the odbc Go driver recommends unixODBC 2.3.1+. The instructions in this article therefore cover building a Go driver against a version of unixODBC that is installed in a non standard location. For example, a unixODBC Driver Manager that is included with your ODBC driver or one you have built yourself.

The ODBC driver used throughout the article is Easysoft's SQL Server ODBC driver. To use a different ODBC driver with odbc / mgodbc, replace the SQL Server ODBC driver specific connection string with one that is appropriate for your driver.

odbc and mgodbc (unlike go-odbc) implement Go's database/sql and database/sql/driver packages. The database/sql package provides a generic interface around SQL (or SQL-like) databases and must be used in conjunction with a database driver.

Before You Install the Go Driver

To connect your Go application to your target database, you need to obtain an ODBC driver for your database and Linux platform. Easysoft produce a range of Linux ODBC drivers, all of which are compatible with the unixODBC Driver Manager. We used our SQL Server ODBC driver to connect Go to a SQL Server database. Although the following instructions are based around the Easysoft ODBC driver, the process is the same for any unixODBC compatible ODBC driver.

    Install the ODBC driver under unixODBC.

The SQL Server ODBC driver installation script automatically installs the driver under unixODBC (i.e. it places entries for the driver in the unixODBC configuration file odbcinst.ini, the location of which can be found by typing odbcinst -j ).

SYSTEM ODBC data sources (accessible to all users on the Linux machine) are stored in odbc.ini. USER data sources are stored in .odbc.ini. (Again, use odbcinst -j to find out the location of these files.)

The SQL Server ODBC driver creates a sample data source in odbc.ini, and we edited this data source to connect to our SQL Server instance:

If you are unable to connect, refer to this article for assistance.

To download and install odbc use the go get command. Remember to set and export the environment variables required by Go before running this command. For example:

odbc includes a test suite for the SQL Server database, and if connecting to this database you should run the tests to ensure that you can connect, read / write data, call stored procedures etc. from go. We used this command line to test Easysoft's SQL Server ODBC driver:

Note that you need to connect a SQL Server database where the user specified on the command line has permission to create and drop tables and stored procedures.

Initially, the SQL Server ODBC driver failed some tests, where string data was inserted into SQL Server. Using the SQL Server ODBC driver's iconv conversion mechanism to convert the data from UTF-8 solved this. To do this we set the driver's Client_Cset in the SQL Server test script, mssql_test.go:

After doing this the SQL Server ODBC driver passed all tests.

To create a compiled Go package for odbc under $GOPATH, run the following command:

We used this Go code to access SQL Server:

mgodbc

To download and install mgodbc it may be possible to use the go get command. Remember to set and export the environment variables required by Go before running this command. For example:

Using this method failed with an SSL certificate error, so we had to try an alternative approach:

To create a compiled Go package for odbc under $GOPATH, run the following command:

As both mgodbc and odbc implement Go's generic SQL database interface, we could use the same Go script to test them. We just had to change the driver from odbc to mgodbc:

go-odbc

go-odbc enables a Go program on Linux to access a database whose ODBC driver is installed under the unixODBC Driver Manager. For example, we connected a Go program on Linux to a SQL Server database by using go-odbc/unixODBC with our SQL Server ODBC driver.

To install go-odbc, use a Git or Subversion client to copy the go-odbc repository to the Linux machine on which you have installed Go or download the go-odbc .zip file under your $GOPATH/src directory. For example:

Before you can compile go-odbc, you need to have the unixODBC Driver Manager installed on your Linux machine. Most Linux distributions include the unixODBC Driver Manager (you need both the Driver Manager and its header files). unixODBC is also available as source code. All Easysoft ODBC drivers for Linux and Unix platforms include unixODBC.

To create a compiled Go package for go-odbc under $GOPATH, run the following commands:

Use the following sample Go program to connect to your database from Go. Edit the connection string with the relevant values for your data source.

Set and export the environment variables required by Go and then run the sample program. For example:

Applies To
  • Products
    • Easysoft ODBC-Oracle Driver
    • Easysoft ODBC-InterBase Driver
    • Easysoft ODBC-JDBC Gateway
    • Easysoft ODBC-Sybase Driver
    • Easysoft ODBC-ODBC Bridge
    • Easysoft ODBC-Firebird Driver
    • Easysoft ODBC-ISAM Driver
    • Easysoft ODBC-SQL Server Driver
    • Easysoft ODBC-Oracle WP Driver
    • Easysoft ODBC-Access Driver
    • Easysoft ODBC-DB2 Driver
    • Easysoft ODBC-Derby Driver
    • Easysoft ODBC-Salesforce Driver
    • Easysoft ODBC-MongoDB Driver
    • Easysoft ODBC-Google Analytics Driver
    • Easysoft ODBC-MySQL Driver
    • Easysoft ODBC-PostgreSQL Driver
    • Go

    Knowledge Base Feedback

    Oracle is a registered trademark of Oracle Corporation and/or its affiliates.


    Многие пользуются Аксесом… даже в продакшене… даже по сей день. Посему, случаются моменты, когда кому-то захочется подключиться к этой БД из какого-нибудь неожиданного места. Например с юниксового сервера. Конечно же, подключиться захочется не просто так, а для использования данных из Аксеса в веб-приложении. И, без всякого сомнения, появится желание использовать эти данные совместно с информацией из других, более современных БД.

    Итак, я хочу описать несколько подходов к общению с существом, называемым MS Access. Посему, исходная задача такова: установить соединение с MS Access из Ruby on Rails приложения или из PostgreSQL (используя FDW) и получить доступ к данным, желательно, в реальном времени.

    Ниже я постараюсь собрать всю информацию, относящуюся к вышеописанно задаче и попытаюсь описать нетривиальные случа и подводные табуретки. Надеюсь, это описание сэкономит время кому-нибудь… либо просто, в некоторой степени, позабавит уважаемую публику.

    Сразу же tldr для тех кому важны только факты и мнение автора по этому вопросу.

    Конвертация в CSV

    Для начала, опишу простое рабочее решение. Оно гарантированно работает на Ubuntu 14.04. Должно работать на других дистрибутивах Linux. И не требует каких-либо высших/сакральных знаний, навыков и прочей магии.

    Есть такая штука mdbtools. Ставится она очень просто:


    Подробности о её зависимостях, ручной сборке, возможностях пакета и о многом другом можно найти на страничке GitHub'а.

    Сей пакет предоставляет кучу разных инструментов для работы с Аксесом. Всю кучу рассматривать не будем, а остановимся на одном. Том самом, который умеет превращать mdb-файлы в csv:


    В результате получим csv-файл с содержимым указанной таблицы. Далее, сей файл можно подвергнуть всем мыслимым и немыслимым обработкам и истязаниям, потому что csv — это безумно простой и широко распространёный формат.

    Выполнение запросов в MS Access

    Теперь более сложная задача: выполнить SQL-запрос, имея в руках mdb-файл и машину с чем-нибудь юниксовым. Нетрудно догадаться, что нужно поставить ещё пару пакетов и создать несколько конфигов.

    Во-первых, понадобится ODBC. Это стандартное API для общения с БД. В Юниксе для этих целей существует unixODBC. Его установка очень проста:


    Во втором пакете содержится libmdbodbc.so, который понадобится чуть ниже.

    Следующим шагом нужно найти подходящий ODBC-драйвер для MS Access. Ближайшим доступным является драйвер из mdbtools. Далее, нужно поковыряться в конфигах: описать драйвер и объявить БД.

    Драйвер описываем в /etc/odbcinst.ini:


    А БД объявляем в /etc/odbc.ini:


    Стоит отметить, что в «Driver» нужно указывать имя драйвера, который описан в odbcinst.ini.

    Больше про odbcinst.ini и odbc.ini можно найти здесь.

    Итак, конфигурирование закончили. Теперь можно приступить к выполнению запросов. Для этих целей воспользуемся утилитой isql из пакета unixODBC:


    Если всё сделано правильно, то должна появиться консоль для выполнения запросов:


    На последок, стоит отметить, что существует аналог isql с поддержкой юникода. Он называется iusql.

    Странности isql

    Честно говоря, утилита isql довольно упорота. В ней куча ограничений на синтаксис и никакого дружелюбия и понимания пользователя. Например: поставил точку с запятой в конце выражения — получи ошибку и попробуй угадай из-за чего она. Никаких подсказок, советов и прочих прелестей современной разработки здесь нет. Это не PotgreSQL, который любезно скажет что вы ошиблись в выражении и предложит правильный вариант. Здесь вас просто пошлют и даже не сообщат причину. Посему, для хоть какого-то облегчения работы с isql была создана оболочка pyodbc-cli. С её помощью можно хоть как-то ослабить борьбу с isql и сосредоточиться на написании запросов.

    Экзотические кодировки таблиц/колонок

    Ходит много слухов о параметре 'Charset', который влияет на используемую коловую страницу. Вот пример использользования этого параметра:


    Влияние этого параметра на работу isql замечено не было.В isql я могу работать как с mdb-файлами, содержащими кириллицу, так и со обычными юникодовыми mdb-файлами. В это же время, утилита iusql вне зависимости от параметра 'Charset' выдавала много вопросительных знаков (вот примерно таких: ��������) при работы с кириллическим mdb-файлом.

    Альтернативы для isql

    Альтернативой для isql является mdb-sql из пакета mdbtools. Для этой утилиты не нужны ini-файлы. Нужно просто натравить её на конкретный mdb-файл:


    На все вопросы по использованию утилиты хорошо ответит man-страница. Единственная особенность: вышеупомянутый кириллический mdb-файл утилита проглотить не смогла. С юникодовыми файлами проблем не было.

    Путь Ruby/Rails

    Начну с хорошей: существует odbc-rails и его реинкарнация activerecord-odbc-adapter.

    А теперь плохая: как уже отмечалось выше, последние коммиты в репозиторий адаптера датированы 2008 годом и заявлена поддержка Rails и ActiveRecord версии один и два; посему, я не знаю как запустить его на Rails 3+ (и можно ли вообще это сделать). Причины моего незнания примерно следующие. Во-первых: у адаптера скверная документация (а скорее её отсутствие). А во-вторых: нет никакого желания лезть в исходники, разбираться и возвращать их к жизни. Так что если у вас достаточно знаний, опыта и времени — можете допилить и описать как этим пользоваться. Удачи вам в этом случае!

    Ruby-ODBC

    Раз с адаптером всё грустно, то можно посмотреть в другие стороны. Одна из сторон называется ruby-odbc.

    Последнее обновление сего гема датировано 2011 годом, но, на текущий момент, он более-менее работает. Для установки гема нужно выполнить нехитрые действия:


    Без пакета unixodbc-dev компиляция native extension отвалится с ошибкой: ERROR: sql.h not found.

    Далее, мы предположим, что ODBC в системе сконфигурировано (то есть присутствуют файлы odbcinst.ini и odb.ini). В этом случае можно открыть irb и сделать следующее:


    Больше информации о синтаксисе и о доступных командах гема ruby-odbc можно найти в директории ruby-odbc/test на GitHub'е.

    Mdb gem

    Сей гем предоставляет DSL'ку для работы с mdb-файлами. И она выглядит довольно мило. Но есть нюанс: гем — это просто Ruby-обёртка над вышеописанным mdbtools'ом. То есть, гем конвертирует mdb в csv и обрабатывает этот csv в памяти. Никакой магии и прямого обращения к БД.

    Альтернатива для ODBC-драйвера

    Cуществует коммерческая версия ODBC-драйвера для MS Access. Но не существует никакой фактической информации о нём. В оптимистичном варианте этот адаптер поможет с продвинутыми запросами в Access (драйвер из mdbtools много чего не умеет: нет LIMIT, GROUP, AS и тд). Но это только догадки. Что будет на самом деле можно узнать только купив его, либо взяв 14 дневный триал, который доступен после регистрации на сайте. Кроме этой информации не нашлось ни отзывов пользователей, ни каких-либо багрепортов, ни каких-либо упоминаний о том, что кто-то пользовался драйвером и он ему чем-то помог.

    Путь PotgreSQL

    Для Постгреса существует расширение OGR. Оно является частью GDAL. Который, в свою очередь, является огромной библиотекой по преобразованию растровых и векторных форматов геопространственных данных. Для наших текущих целей назначение библиотеки не имеет решительно никакого значения. Главное, что заявлено, что она умеет работать с mdb-форматом.

    Установка

    Для начала нужно поставить несколько зависимостей:


    Сия команда потянет за собой тонну зависимостей… но это нормально. Первый набор пакетов для ogr_fdw, второй — для postgis.

    Шаг второй: сбор pgsql-ogr-fdw из исходников. Вот небольшой мануал в стиле bash:

    Шаг три: пойти и поставить расширения в Postgres:


    Есть подозрение, что postgis тут лишний, но в Readme на GitHub сказано что нужны оба, посему оставлю этот вопрос пытливым читателям.

    Шаг четыре: время создавать FDW. В ogr_fdw есть два возможных пути для работы с Access. Первый использует системный ODBC. Подробности об этом варианте можно найти здесь. Второй — более интересный, использует формат MDB из OGR, который предоставляет прямой доступ к файлу используя Jackcess. Подбробности об этом варианте лежат тут. Ниже я опишу оба способа.

    Напоследок, одно замечание: OGR — это чрезвычайно мощная штука; возможность работы с MS Access — это маленькая часть всего многообразия доступных форматов и, уважаемый читатель, может вполне резонно заявить, что это пальба из пушки по воробьям… но выбор не велик и кроме этой пушки никаких других орудий изыскать не удалось. И да, вот перечень всех поддерживаемых OGR'ом форматов.

    Формат ORG ODBC

    Этот подход использует системные настройки ODBC и работает по аналогии с вышеописанным osql и ruby-odbc, но внутри БД. Все доступные опции для инициализации FDW представлены на странице GDAL ODBC драйвера. Ниже я приведу лишь простой пример использования.

    Собственно вот он:


    На сколько я понял из документации OGR, layer — в нашем случае, эквивалентен таблице БД.

    Список всех layer'ов можно получить используя утилиту ogrinfo:

    Отдельный вопрос: как PG будет работать с кирилическими (да и с любыми другими нелатинскими) названиями таблиц и колонок. С одной стороны — Postgres'у без разницы как называется таблица/столбец, обернуть их в двойные кавычки и хоть спец.символы можно использовать. С другой стороны: кто его знает, применимо ли это к FDW, а проверить на конкретном примере пока не получается.

    Формат ORG MDB

    Сей подход основывается на Java-библиотеке Jackcess. Так как это Java и у неё свой богатый внутренний мир, то у этого подхода нет никаких связей с системным ODBC и, следовательно, проблемы с драйверами для MS Access для него чужды. Но есть другие особенности, которые опишу ниже.

    Сразу предупрежу, что в силу «богатой» документации по всему описываемому процессу, отсутствию большого опыта с Java и некоторой монструозностью целевого пакета, рабочий вариант удалось собрать за 3 дня и

    20 полных пересборок пакета. Поэтому сразу скажу о некоторых вещах:

    • этот подход годится только для работы с незашифрованными mdb-файлами (то бишь с файлами без пароля);
    • так как это сборка пакета, то все нижеописанные зависимости, пути, версии и прочие атрибуты справедливы для моего конкретного случая и окружения, у вас всё может быть совсем не так и бездумно копипастить команды не рекомендуется.

    Во-первых: нужно поставить openjdk-6-jdk.


    После бегло вдумчивого чтения исходников GDAL'а, создалось ощущение, что он поддерживает и openjdk-7-jdk. Но у меня не получилось заставить его работать с 7-й версией.

    Далее, понадобится libgdal-dev.


    Здесь нужно запомнить версию пакета. Она напрямую связана с версией пакета GDAL. В моём случае это версия 1.10.1.

    Примечание: поддержка формата mdb начинается с версии 1.9.0.

    Ну и на последок, нужно снести пакет gdal-bin, так как его расширенную версию мы и собираемся собрать из исходников.


    Во-вторых: нужно скачать несколько JAR-ов (древних и не очень), а именно: jackcess-1.2.2.jar, commons-lang-2.4.jar и commons-logging-1.1.1.jar; затем, положить их в lib/ext. В моём случае, полный путь до этой директории следующий: /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/ext. Вышеозначенные версии JAR-ов можно найти внутри вот этой утилиты. Для меня, всё работает с любой более поздней версией commons-logging (1.*), с любой другой минорной версией commons-lang (2.*) и jackcess (1.*). Ошибки появлялись только при использовании следующей мажорной версии jaccess (2.1.4).

    В-третьих: нужно скачать и сконфинурировать GDAL.


    Здесь нужно перейти в ветку, соответствующую версии пакета libgdal-dev, коий устанавливали в пункте номер раз. В противном случае собранный бинарник будет несовместим с библиотеками.

    Далее нужно звать configure. Существует целых два способа вызова. Простой:

    и с явным указанием путей:


    Второй вариант может быть полезен если в системе присутствует несколько версий Java (например, openjdk-6-jdk и openjdk-7-jdk) или если первый вариант не дал желаемого результата.

    После окончания работы configure нужно найти заветное слово 'yes' напротив формата MDB.

    В-четвёртых: нужно изыскать чашечку чая/кофе или чего покрепче и запустить сборку пакета.


    Здесь нужно ответить на пару несложных вопросов и ждать. В моём случае ждать нужно было примерно 10 минут.

    Здесь же нужно отметить, что пакет получится увесистым, около 300мб. Конечно же, можно выкинуть из него всё лишнее, собрать его руками и приблизиться к размеру пакета gdal-bin из репозитория (

    900Kb), но это выходит за рамки повествования и, поэтому, описано не будет.

    В-пятых: если что-то пошло не так, сборка пакета отвалилась, то гугл и светлый ум вам в помощь.

    В-шестых: если всё прошло хорошо, то после checkinstall пакет должен был автоматически установиться и теперь нужно проверить, действительно ли полученные бинарники поддерживают формат mdb:


    Если в выводе ogrinfo информации про mdb не нашлось, то перейдите к началу этой секции, перечитайте мануалы, посмотрите на зависимости, параметры системы, фазу луны и прочие атрибуты которые могут повлиять на компиляцию и итоговый бинарник, и попробуйте пересобрать всё это хозяйство ещё раз.

    Если же команда и вывод совпали, то всё хорошо и самая мутная часть позади. Теперь ogrinfo может работать с mdb-файлами и предоставлять информацию об их содержимом:


    В-седьмых: теперь можно настраивать FDW в Postgres. Вот небольшой скрипт с примером этого действа:


    И, в общем-то, всё. В заключении этой секции скажу пару слов про «шифрованные» mdb-файлы.

    Если FDW не может вытащить данные из Access, а ogrinfo ругается следующим образом:


    то, скорее всего, у вас запароленный mdb-файл. В этом случае стоит посмотреть на FAQ из Jaccess и задуматься о допиле драйвера OGR Access. На сколько я понял, существует проект Jackcess Encrypt. Сей проект предоставляет CryptCodecProvider, который, в свою очередь, предоставляет реализацию интерфейса CodecProvider для Jackess и поддерживает некоторые форматы шифрования mdb-файлов. Но, к несчастью, текущий драйвер от GDAL никак не умеет работать с Jackcess Encrypt и, следовательно, никак не поддерживает шифрованные файлы. Так что, есть хорошее направление для работы в стане опенсорса.

    Прочие FDW

    Список всех существующих FDW для Postgres можно найти на официальной вики-странице. Там есть ZhengYang/odbc_fdw, в котором последний коммит датирован 2011 годом. И CartoDB/odbc_fdw, который активно развивается и поддерживает Postgres 9.5+. Так что выбор невелик.

    Заключение

    Работать с MS Access больно… вдвойне больно если нужно это делать под Linux. Так что сразу добрый совет: вытащите из аксеса данные в любую современную БД и избавитесь от вагона проблем. Если вытащить не получается, то работайте с аксесом в Windows. Там есть нормальный драйвер, предоставляемый Microsoft «из коробки», о стыковке Access и Postgres в Windows есть хоть какие-то статьи и примеры настройки и вообще продукты одной и той же фирмы, обычно, хорошо работают друг с другом. Если же и этой возможности нет, то у вас снова два выхода: превращать всё в CSV и работать с ним или пытаться напрямую обратиться к mdb-файлу. Первый вариант простой, работает «из коробки» и особых навыков не требует. Второй вариант гораздо сложнее, требует времени, нервов, прямых рук, имеет набор ограничений, подводных камней и прочих неприятных вещей. Посему, выбирайте с умом.

    Читайте также: