LinuxでMS Accessを使用する方法

多くの人がAccessを使用しています ...本番環境でも...今日でも。 したがって、誰かが予期しない場所からこのデータベースに接続したい場合があります。 たとえば、Unixサーバーから。 もちろん、そのように接続するだけでなく、WebアプリケーションでAccessのデータを使用する必要があります。 そして、間違いなく、このデータを他の最新のデータベースからの情報と一緒に使用したいという要望があります。

したがって、MS Accessと呼ばれるクリーチャーと通信するためのいくつかのアプローチを説明したいと思います。 したがって、最初のタスクは次のとおりです。Rubyon RailsアプリケーションまたはPostgreSQL( FDWを使用)からMS Accessへの接続を確立し、できればリアルタイムでデータにアクセスします。

以下では、上記の問題に関連するすべての情報を収集し、自明でないケースと水中の便を説明しようとします。 この説明が誰かの時間を節約することを願っています...または単に、ある程度、尊敬されている大衆を楽しませます。

この問題に関する著者の事実と意見だけに関心がある人のためにすぐにtldr

CSVに変換


まず、簡単な作業ソリューションについて説明します。 Ubuntu 14.04での動作が保証されています。 他のLinuxディストリビューションで動作するはずです。 そして、それはより高い/神聖な知識、スキル、その他の魔法を必要としません。

そのようなものmdbtoolsがあります。 それは非常に簡単に言えば:

sudo apt-get install mdbtools 

依存関係、手動アセンブリ、パッケージ機能などの詳細は、 GitHubのページにあります

このパッケージは、Accessを操作するためのさまざまなツールを提供します。 束全体を検討するのではなく、1つに絞って検討します。 mdbファイルをcsvに変換できるもの:

 mdb-export 'mdb-file' 'table-name' > result.csv 

その結果、指定されたテーブルの内容を含むcsvファイルを取得します。 さらに、csvは非常に単純で広く普及している形式であるため、このファイルは考えられることも考えられないことすべての処理と拷問を受ける可能性があります。

MS Accessでクエリを実行する


より難しいタスク:SQLクエリを実行し、mdbファイルとunixを備えたマシンを手に入れます。 いくつかのパッケージを追加して、いくつかの構成を作成する必要があると推測するのは簡単です。

まず、 ODBCが必要です。 これは、データベースと通信するための標準APIです。 Unixでは、これらの目的のためにunixODBCが存在します。 そのインストールは非常に簡単です。

 sudo apt-get install unixodbc libmdbodbc1 

2番目のパッケージにはlibmdbodbc.soが含まれており 、これはすぐ下で必要になります。

次のステップは、MS Accessに適切なODBCドライバーを見つけることです。 最も近いものはmdbtoolsのドライバーです。 次に、構成を掘り下げる必要があります。ドライバーを記述し、データベースを宣言します。

ドライバは/etc/odbcinst.iniに記述されています

 [MDBTools] Description = MDBTools Driver Driver = libmdbodbc.so Setup = libmdbodbc.so FileUsage = 1 UsageCount = 1 

/etc/odbc.iniでデータベースを宣言します。

 [testdb] Description = test Driver = MDBTools Database = /opt/db/MS_Access.mdb 

「Driver」では、odbcinst.iniに記述されているドライバーの名前を指定する必要があることに注意してください。

odbcinst.iniおよびodbc.iniの詳細については、 こちらをご覧ください

これで設定は完了です。 これで、クエリの実行を開始できます。 これらの目的のために、unixODBCパッケージのisqlユーティリティを使用します。

 isql testdb 

すべてが正しく行われた場合、リクエストを実行するコンソールが表示されます。

 SQL> SELECT * from "" +------------+-----------------------------------------------------+ |  |  | +------------+-----------------------------------------------------+ | 1 |  | | 2 |   | | 3 |  | | 4 |  | +------------+-----------------------------------------------------+ SQLRowCount returns 4 4 rows fetched 

最後に、Unicodeをサポートするisqlの類似物があることに注意してください。 iusqlと呼ばれます。

奇数isql


正直なところ、isqlユーティリティはかなりやり過ぎです。 構文には多くの制限があり、使いやすさや理解はありません。 たとえば、式の最後にセミコロンを挿入します-エラーを取得し、その原因を推測します。 ここには、モダンなデザインのヒント、ヒント、その他の楽しみはありません。 これはPotgreSQLではありません。PotgreSQLは、式を間違えたと言って、正しいオプションを提供します。 ここでは、単に送信され、理由さえ通知されません。 そのため、少なくともisqlを使いやすくするために、 pyodbc-cliシェルが作成されました。 その助けを借りて、少なくとも何らかの形でisqlとの闘いを弱め、クエリの作成に集中できます。

エキゾチックなテーブル/列のエンコード


「Charset」パラメーターについては多くのうわさがあり、これは使用されているステークページに影響します。 このパラメーターの使用例を次に示します。

 [testdb] Description = test Driver = MDBTools Database = /opt/db/MS_Access.mdb Charset = CP1251 

isqlの操作に対するこのパラメーターの影響は気づかれていませんisqlでは、キリル文字を含むmdbファイルと通常のUnicode mdbファイルの両方で作業できます。 同時に、キリル文字のMDBファイルを使用する場合、「Charset」パラメーターに関係なく、iusqlユーティリティは多くの疑問符(これらのような: )を生成しました。

isqlの代替


isqlの代替は、mdbtoolsパッケージのmdb-sqlです。 このユーティリティには、iniファイルは必要ありません。 特定のmdbファイルに設定するだけです:

 mdb-sql /opt/db/MS_Access.mdb 

ユーティリティの使用に関するすべての質問は、 manページで適切に回答されます 。 唯一の機能:ユーティリティは上記のキリル文字のmdbファイルを飲み込めませんでした。 Unicodeファイルには問題はありませんでした。

Ruby / Railsパス


現在は2016年の半ばで、MS Accessの最後のリリースは2015年9月22日でした。 しかし、それは不運です。ActiveRecordのアダプターに関する最新の作業は2008年です。 したがって、私は、慣習どおり、良い点と悪い点の2つのニュースを持っています。

良いものから始めましょう: odbc-railsとその生まれ変わりactiverecord-odbc-adapterがあります。

そして今、悪いもの:上記のように、アダプターリポジトリへの最後のコミットは2008年で、RailsおよびActiveRecordバージョン1と2のサポートが宣言されています。 したがって、Rails 3+で実行する方法(および実行できるかどうか)はわかりません。 私の無知の理由はおよそ次のとおりです。 まず、アダプターのドキュメントが正しくありません(ただし、アダプターがありません)。 第二に、情報源に行き、理解し、生き返らせたいという欲求はありません。 したがって、十分な知識、経験、時間がある場合は、それを終了して使用方法を説明できます。 この場合は頑張ってください!

Ruby-ODBC


アダプターではすべてが悲しいので、別の方法で見ることができます。 一方はruby-odbcと呼ばれます。

このgemの最後の更新は2011年にさかのぼりますが、現時点では多かれ少なかれ機能しています。 gemをインストールするには、簡単な手順を実行する必要があります。

 sudo apt-get install unixodbc unixodbc-dev gem install ruby-odbc 

unixodbc-devパッケージがない場合、ネイティブ拡張のコンパイルは次のエラーで失敗します: ERROR:sql.h not found

さらに、システムでODBCが構成されていることを前提としています(つまり、 odbcinst.iniファイルとodb.iniファイルが存在する)。 この場合、irbを開いて以下を実行できます。

 001 > require 'odbc' => true 002 > client = ODBC.connect("testdb") => #<odbc::database:0x00000000e38d98> 003 > statement = client.prepare 'SELECT * FROM ""' => #<odbc::statement:0x00000000e11608 @_a="[]," @_h="{}," @_c0="{}," @_c1="{}," @_c2="{}," @_c3="{}"> 004 > statement.execute => #<odbc::statement:0x00000000e11608 @_a="[]," @_h="{}," @_c0="{}," @_c1="{}," @_c2="{}," @_c3="{}"> 005 > first_row = statement.fetch => [1, "\xD0\x94\xD0\xBE\xD0\xBA\xD1\x83\xD0\xBC\xD0\xB5\xD0\xBD\xD1\x82\xD0\xB0\xD1\x86\xD0\xB8\xD1\x8F\x00"] 006 > first_row[1].force_encoding("utf-8") => "\u0000" 

構文および使用可能なruby-odbc gemコマンドの詳細については、GitHubのruby-odbc / testディレクトリにあります。

MDB gem


このgemは、mdbファイルを操作するためのDSLを提供します。 そして彼女はとてもかわいいです。 ただし、ニュアンスがあります。gemは、上記のmdbtoolsの単なるRubyラッパーです。 つまり、gemはmdbをcsvに変換し、このcsvをメモリで処理します。 魔法やデータベースへの直接アクセスはありません。

ODBCドライバーの代替


MS Access用のODBCドライバーの商用バージョンがあります 。 しかし、彼に関する事実情報はありません。 楽観的なバージョンでは、このアダプターはAccessの高度なクエリに役立ちます(mdbtoolsのドライバーには、LIMIT、GROUP、ASなどの処理がたくさんあります)。 しかし、これは推測に過ぎません。 実際にそれを購入するか、サイトでの登録後に利用できる14日間の試用版を取得することによってのみ学習することができます。 この情報に加えて、ユーザーレビュー、バグレポート、または誰かがドライバーを使用し、彼が何かを手伝ったという言及はありませんでした。

PotgreSQLパス


Postgresには、 OGR拡張があります。 GDALの一部です。 これは、ラスターおよびベクターの地理空間データ形式を変換するための巨大なライブラリです。 現在の目的では、ライブラリの目的にはまったく意味がありません。 主なことは、mdb形式で動作することができると述べられていることです。

設置


最初に、いくつかの依存関係を配置する必要があります。

 sudo apt-get install gdal-bin libgdal-dev sudo apt-get install postgis postgresql-9.3-postgis-2.1 

このチームは大量の中毒を引き寄せます...しかし、それは結構です。 ogr_fdwの最初のパッケージセット、postgisの2番目のパッケージ。

ステップ2:ソースからpgsql-ogr-fdwを収集します。 これは小さなbashスタイルのマニュアルです。

 git clone git@github.com:pramsey/pgsql-ogr-fdw.git cd pgsql-ogr-fdw sudo apt-get install postgresql-server-dev-9.3 sudo apt-get install checkinstall make sudo checkinstall 

はい、make installを実行できますが、 猫が苦しむことは望みません。 checkinstallから表示されるダイアログで、「バージョン」パラメーターを修正する必要があります。 「ドットで区切られた数字」の形式で作成する必要があります(例: '0.1.0')。 それ以外の場合、デフォルト値では、パッケージアセンブリは失敗します。

ステップ3:Postgresに拡張機能をインストールします:

 CREATE EXTENSION ogr_fdw; CREATE EXTENSION postgis; 

ここではpostgisが不要であるという疑いがありますが、GitHubのReadmeには両方が必要であると言われているため、この質問は好奇心reader盛な読者に任せます。

ステップ4:FDWを作成する時間。 ogr_fdwでAccessを操作するには、2つの方法があります。 1つ目はシステムODBCを使用します。 このオプションの詳細については、 こちらをご覧ください 。 2番目の方法は、OGRのMDB形式を使用しており、 Jackcessを使用してファイルに直接アクセスできます。 このオプションの詳細はこちらです。 以下に両方の方法を説明します。

最後に、1つのコメント:OGRは非常に強力なものです。 MS Accessで動作する機能は、利用可能なさまざまな形式の一部であり、親愛なる読者は、これはスズメによる銃からのショットであると合理的に言うことができます...しかし、選択肢は大きくなく、この銃以外に他のツールは見つかりませんでした はい、ここにOGRでサポートされているすべての形式のリストがあります

ORG ODBC形式


このアプローチはODBCシステム設定を使用し、上記のosqlおよびruby-odbcと同様に機能しますが、データベース内で動作します。 FDWの初期化に使用できるすべてのオプションは、 GDAL ODBCドライバーページに表示されます。 以下では、簡単な使用例を示します。

実際にはここにあります:

 postgres=# CREATE SERVER testdb_access postgres-# FOREIGN DATA WRAPPER ogr_fdw postgres-# OPTIONS( postgres(# datasource 'ODBC:testdb', postgres(# format 'ODBC'); CREATE SERVER postgres=# CREATE FOREIGN TABLE access_sections ( postgres(# "" decimal, postgres(# "" varchar) postgres-# SERVER testdb_access postgres-# OPTIONS (layer ''); CREATE FOREIGN TABLE postgres=# SELECT * FROM access_sections; ERROR: unable to connect to layer to "" HINT: Does the layer exist? 

私がOGRのドキュメントから理解している限り、レイヤーは、この場合、データベーステーブルと同等です。

すべてのレイヤーのリストは、 ogrinfoユーティリティを使用して取得できます。

 $ ogrinfo -al 'ODBC:testdb' geometry_columns is not a table in this database Got no result for 'SELECT f_table_name, f_geometry_column, geometry_type FROM geometry_columns' command INFO: Open of `ODBC:testdb' using driver `ODBC' successful. 

このメッセージに基づいて、すべてが機能すると想定できますが、ターゲットデータベース(つまり、mdbファイル)には必要なGeoデータ形式が含まれておらず、OGRはこの迷惑な誤解につまずきます。 提供されたデータベースのフォーマットを強制的にチェックすることから彼を引き離す方法がわかりません。 しかし、このアプローチはWindowsでうまく機能すると言う人もいます。 一般に、OGR ODBCを推論し、任意のmdbファイルで動作させる方法を知っている場合は、それについて教えてください。この知識を自分で保持しないでください。

別の質問:PGは、キリル文字(およびその他の非ラテン語)のテーブルおよび列の名前でどのように機能しますか。 一方で-Postgresはテーブル/カラムが何であるかを気にしません。それらを二重引用符で囲み、少なくとも特殊文字を使用できます。 一方、これがFDWに適用できるかどうかは知っているが、具体的な例で検証することはまだ可能ではない。

MDG MDBのフォーマット


このアプローチは、 Jackcess Javaライブラリに基づいています。 Javaであり、独自の豊富な内部世界があるため、このアプローチにはシステムODBCとの接続がないため、MS Accessのドライバーの問題は外部の問題です。 ただし、以下で説明する他の機能もあります。

説明したプロセス全体に関する「豊富な」ドキュメント、Javaの豊富な経験の欠如、ターゲットパッケージの一部の怪しさのために、作業バージョンは3日で組み立てられ、パッケージの〜20の完全な再構築が可能であったことをすぐに警告します。 したがって、私はすぐにいくつかのことについて言います:


したがって、以下はすべて、 GDAL ACCESS MDBデータベースドライバーの元の公式説明のより詳細なバージョンです。

最初:openjdk-6-jdkをインストールする必要があります。

 sudo apt-get install openjdk-6-jdk 

GDALのソース素早く思慮深く読んだ後、openjdk-7-jdkもサポートしていると感じました。 しかし、バージョン7では動作しませんでした。

次に、libgdal-devが必要になります。

 sudo apt-get install libgdal-dev 

ここでは、パッケージのバージョンを覚えておく必要があります。 GDALパッケージのバージョンに直接関連しています。 私の場合、これはバージョン1.10.1です。

注: mdb形式のサポートは、バージョン1.9.0から始まります。

そして最後に、gdal-binパッケージを破壊する必要があります。これは、拡張バージョンをソースからビルドするためです。

 sudo apt-get remove 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)の次のメジャーバージョンを使用する場合にのみ発生しました。

3番目:GDALをダウンロードして構成する必要があります。

 git clone git@github.com:OSGeo/gdal.git cd gdal/gdal/ git checkout 1.10 

ここで、段落回数でインストールされたlibgdal-devパッケージのバージョンに対応するブランチに移動する必要があります。 そうしないと、アセンブルされたバイナリはライブラリと互換性がなくなります。

次に、configureを呼び出す必要があります。 呼び出す方法は2つあります。 シンプル:

 ./configure --with-java=yes --with-jvm-lib-add-rpath=yes --with-mdb=yes 
そして明示的なパスで:

 ./configure --with-java=/usr/lib/jvm/java-6-openjdk-amd64 \ --with-jvm-lib=/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/server \ --with-jvm-lib-add-rpath=yes \ --with-mdb=yes 

2番目のオプションは、システムに複数のバージョンのJava(たとえば、openjdk-6-jdkおよびopenjdk-7-jdk)がある場合、または最初のオプションで目的の結果が得られない場合に役立ちます。

構成が完了したら、MDB形式の反対側にある大切な単語「yes」を見つける必要があります。

4番目:お茶やコーヒーなどを見つけて、パッケージの組み立てを開始する必要があります。

 sudo checkinstall 

ここでは、いくつかの簡単な質問に答えて待つ必要があります。 私の場合、待つのに約10分かかりました。

ここでは、パッケージが約300 MBの重量になることに注意する必要があります。 もちろん、そこから余分なものをすべて捨てて、手で組み立てて、リポジトリからgdal-binパッケージのサイズ(〜900Kb)に近づけることができますが、これはストーリーの範囲を超えているため、説明しません。

5番目:何かがうまくいかなかった場合、パッケージアセンブリが落ちて、Googleと明るい心があなたを助けます。

6番目:すべてがうまくいった場合、checkinstallの後、パッケージが自動的にインストールされ、受信したバイナリがmdb形式を本当にサポートしているかどうかを確認する必要があります。

 $ ogrinfo --formats | grep MDB -> "MDB" (readonly) 

ogrinfoの出力にmdbに関する情報がなかった場合は、このセクションの最初に進み、マニュアルを読み直して、依存関係、システムパラメーター、 ムーンフェーズ 、およびコンパイルと最終バイナリに影響する可能性のあるその他の属性を確認し、このエコノミーをすべて再構築してみてください。

コマンドと結論が一致した場合、すべてがうまくいき、最も濁った部分が背後にあります。 ogrinfoはmdbファイルを操作して、そのコンテンツに関する情報を提供できるようになりました。

 $ ogrinfo /opt/db/test-database.mdb INFO: Open of `/opt/db/test-database.mdb' using driver `MDB' successful. 1: closeouts 2: economics 

7番目:PostgresでFDWを構成できるようになりました。 このアクションの例を含む小さなスクリプトを次に示します。

 postgres=# CREATE SERVER acc FOREIGN DATA WRAPPER ogr_fdw OPTIONS ( datasource '/opt/db/test-database.mdb', format 'MDB' ); CREATE SERVER postgres=# CREATE FOREIGN TABLE economics( ID integer) SERVER acc OPTIONS(layer 'economics'); CREATE FOREIGN TABLE postgres=# SELECT * FROM economics; id ---- 1 2 3 4 5 (5 rows) 

そして、一般に、それですべてです。 このセクションの終わりに、「暗号化された」mdbファイルについていくつか説明します。

FDWがAccessからデータをプルできず、ogrinfoが次のように誓う場合:

 Exception in thread "main" com.healthmarketscience.jackcess.UnsupportedCodecException: Decoding not supported. Please choose a CodecProvider which supports reading the current database encoding. at com.healthmarketscience.jackcess.DefaultCodecProvider$UnsupportedHandler.decodePage(DefaultCodecProvider.java:115) 

次に、パスワードで保護されたmdbファイルがある可能性があります。 この場合、 JaccessFAQを見て、OGR Accessドライバーのdopilについて考えてください。 私の知る限り、 Jackcess Encryptプロジェクトがあります。 このプロジェクトはCryptCodecProviderを提供します。CryptCodecProviderは、JackessのCodecProviderインターフェイスの実装を提供し、mdbファイルの暗号化形式をサポートします。 しかし、残念ながら、現在のGDALのドライバーはJackcess Encryptの操作方法を認識していないため、暗号化されたファイルをサポートしていません。 ですから、オープンソースキャンプで働く良い方向があります。

その他のFDW


Postgresの既存のすべてのFDWのリストは、 公式WikiページにありますZhengYang / odbc_fdwがあり、最後のコミットの日付は2011です。 CartoDB / odbc_fdwは 、Postgres 9.5+を積極的に開発およびサポートしています。 そのため、選択肢はわずかです。

おわりに


LinuxでMS Accessを使用する必要がある場合、MS Accessで作業するのは大変です。 だからすぐに良いアドバイス:任意の最新のデータベースへのアクセスからデータを引き出し、問題の車を取り除く。 引き出せない場合は、Windowsアクセスを操作します。 MicrosoftがWindowsにAccessとPostgresをドッキングすることについて「すぐに」提供する通常のドライバーがあります。少なくともいくつかの記事と構成例があり、一般に同じ会社の製品は通常互いにうまく機能します。 これが不可能な場合は、2つのオプションがあります。すべてをCSVに変換して操作するか、mdbファイルに直接アクセスしてみてください。 最初のオプションは簡単で、すぐに使用でき、特別なスキルは必要ありません。 2番目のオプションははるかに複雑で、時間がかかり、神経、まっすぐな腕、一連の制限、落とし穴、その他の不快なものがあります。 したがって、賢明に選択してください。

参照資料


Source: https://habr.com/ru/post/J309126/


All Articles