Microsoft Access のデータベースを Rust で読むライブラリとCLIツール jetdb を作りました

tl;dr

  • Microsoft Access の .mdb / .accdb ファイルを読み取れる Rust 製のライブラリと CLI ツールを作りました
  • pure Rust なので ODBC ドライバも C コンパイラも不要、macOS / Linux / Windows で動きます
  • Access 97 (Jet3) から Access 2019 (ACE17) まで対応
  • crates.io に公開済み、MIT / Apache-2.0 ライセンス

github.com

背景

諸事情で Access データベースの中身を扱う機会がありまして。

macOS や Linux で .mdb / .accdb ファイルを読む手段としては、C で書かれた mdbtools があります。なんと2000年3月が初版らしい、すごい歴史。

大抵のことはこれでどうにはなるんですが、今回やりたかったのは Tauri アプリからライブラリとして呼び出したい状況があって、せっかくのマルチプラットフォームなのだから、C の FFI を介さずに Rust からネイティブに使いたいよね的な感じが少しありました。

で、ついでなんでCLIつけるよね、既存のソフトウェアをRustで書く例もよく見かけるし、みたいな。

「手元に .mdb ファイルがあるけど中身を確認したい」というとき(滅多にないシチュエーション)、Access がなくても、Windows でなくてもこれだけでいけるはず的なやつです。

ちょっと困ったこと

mdbtoolsをそのまま移植すればいいかーと思ったんですけど、ライセンスがGPLv2なのでそれを継承するとTauriアプリに組み込むときに困るので、スクラッチで作ることになりました。

Java 製の Jackcess がApache Licenseなので、それを中心に扱い、mdbtools の HACKING.md も参照しつつ進める的な感じですかね。

できること

  • データベースエンジンのバージョン判定
  • テーブル一覧の表示
  • テーブルスキーマ(カラム、インデックス、リレーションシップ)の表示
  • テーブルデータの CSV エクスポート
  • DDL 生成(SQLite / PostgreSQL / MySQL / Access SQL)
  • 保存済みクエリの SQL 復元
  • オブジェクトプロパティの表示
  • VBA ソースコードの抽出
  • パスワード保護されたファイルの読み取り(RC4 / Agile Encryption)

これらの機能はAccess 97 から Access 2019 まで対応しているはずです、たぶん。

とくちょう

  • pure Rustなんで、ほとんどどこでも動くはずです。ビルドも簡単のはず!
    • MacOS / Linux / Windows のビルド済みバイナリも提供しています
  • DDLを生成するので他のDBに移植しやすい
    • SQLite / PostgreSQL / MySQL / Access 用に対応しています
  • VBA ソースコードの抽出ができます!
  • パスワード保護された .mdb / .accdb ファイルも読めます

VBA ソースコードの抽出について

すでにmdbtoolsとかJackcessという既存アプリケーションとの差別化要素として、両ツールができないVBAの抽出(標準モジュール、クラスモジュール、フォームモジュール)に対応しています。

とは言っても、OLE2なオブジェクトまでは取得できてるので、すでに十分な実績がある cfbovbaというクレートを普通に使ってCFB(Compound File Binary)コンテナをパースしただけなんですけどね。

それでも一応独自機能!

こういう感じ。

$ jetdb vba list vbaTest.mdb
Class1 Form_Form1 Module1

$ jetdb vba show vbaTest.mdb Module1
Attribute VB_Name = "Module1"
Option Compare Database
Option Explicit

Public Function Hello() As String
    Hello = "Hello, World!"
End Function

パスワード保護されたファイルの読み取りについて

こちらも既存ツールとの差別化ポイント。.accdb で使われている Agile Encryption(AES-CBC + SHA-512 鍵導出)によるパスワード保護に対応しています。mdbtools も Jackcess 本体もこの暗号化には対応しておらず、Jackcess は別プラグイン(Jackcess Encrypt)が必要です。

--password オプションを渡すだけ。

  $ jetdb tables --password secret encrypted.accdb
  Table1 Table2 Table3

パスワードなしでアクセスしようとするとちゃんと怒られます。

  $ jetdb tables encrypted.accdb
  jetdb: password required

ちなみに古い .mdb のパスワード保護は実質飾りで、データ自体は暗号化されていないので誰でも読めます。

CLI ツールとしての使い方

インストール

cargo install jetdb-cli

基本的な使い方

# エンジンバージョンを確認
$ jetdb ver database.mdb
JET4

みたいな感じのサブコマンド方式。 jetdbだけでhelpが表示されるし、README.ja.mdにも書いてあります!

ライブラリとしての使い方

CLI はライブラリの機能をそのまま公開しているので、CLI でできることは全部できます。

Rust のプロジェクトに組み込む場合:

[dependencies]
jetdb = "0.2"

詳しくはREADME.ja.mdlib.ja.mdをみていただけると!

英語ならdocs.rsにライブラリドキュメントみたいなやつが公開されています。

Tauri アプリに組み込む場合も Cargo.toml に依存を追加するだけなので、FFI 関係なく動きます。

対応バージョン

エンジン Access バージョン ファイル形式
Jet3 Access 97 .mdb
Jet4 Access 2000/2003 .mdb
ACE12 Access 2007 .accdb
ACE14 Access 2010 .accdb
ACE15 Access 2013 .accdb
ACE16 Access 2016 .accdb
ACE17 Access 2019 .accdb

たぶん、現状で流通してるものは大抵いけると思う。Jet3のVBA抽出はテストされてないかもしれないので、ファイル持ってるひといたらください。 あと、Microsoft Moneyで使われていたMSISAM形式というのがほぼJetぽいんですけど、ファイルもないし対応はしていません。 Jackcessかmdb-readerなら多分読めるはずですので、そちらに頼ってください。ほぼないシチュエーションだと思うけど。

制限事項

  • 読み取り専用(書き込みには対応していない)
  • テーブルの全行をメモリに読み込むため、行数が非常に多いテーブルではメモリ使用量に注意

かんそう

コードは約 18,000 行、テストは 720 超。テストデータとして Jackcess から引用した 95 個の実際の .mdb / .accdb ファイルを使っています。

今回も全部Claude Code CLIが書いてくれました。ありがとうClaude Code。ありがとうOpus 4.6。

全体的に素直に解釈できるような構成にしたつもりで、特別な工夫はあんまりないはず。 バイナリファイルを読んでパースするだけなんだし、先達の資料(HACKING.md)と、Jackcessの既存実装を参考にいろいろ頑張ってくれたはず、Claude Codeが。

なので、やろうと思うってからおそらく実稼働時間16-20時間くらい、期間としても5日くらいのはずです。すごいぞ、Claude Code。 全体のレビューとか詳細な分析とかはちょっとCodexを使いました。(その後暗号化ファイル対応とかしてのでもう少しかかりました。)

いちおうむちゃくちゃニッチなツールだけど、わりと大きめな名前取れたし、初めてCratesとして公開できたので、だいぶ良かったです。生成AI NGとかじゃなければ多分使えると思う。

リンク

機能比較表

Microsoft Access データベースツール比較表です。

調査日: 2026-02-19

jetdb MDB Tools Jackcess mdb-reader access-parser pyaccdb MMKiwi.MdbReader
基本情報
言語 Rust C Java JS/TS Python Python C#/.NET
バージョン 0.2.1 1.0.1 4.0.10 3.2.0 0.0.6 0.1.0β
ライセンス MIT/Apache-2.0 LGPL/GPL Apache 2.0 MIT Apache 2.0 AGPL v3 MIT
最終更新 2026-02 2025-01 2025-10 2026-02 2025-01 2025-11 2024-07
対応バージョン
Jet3 (Access 97) × ×
Jet4 (Access 2000) ×
Jet4 (Access 2003) ×
ACE12 (Access 2007) ×
ACE14 (Access 2010) ×
ACE16 (Access 2016) ×
ACE17 (Access 2019) ×
機能比較
テーブル読み取り
クエリ定義読み取り × × × ×
リレーションシップ × × × × ×
オブジェクトプロパティ × × × ×
VBA モジュール抽出 × × × × × ×
DDL 生成 × × × × ×
書き込み × × × × × ×
DateTimeExtended × × × ×
Complex Column ※2 × × × ×
暗号化対応
Jet (レガシー) △ ※1 × × ×
RC4 CryptoAPI × △ ※1 × × ×
Standard AES (ECB) × △ ※1 × × × ×
Agile AES × △ ※1 × ×
DDL 方言内訳
SQLite
PostgreSQL
MySQL
Access SQL
Oracle ×
Sybase ×

凡例: ○ 対応 △ 部分対応/条件付き × 非対応 — 該当なし

  • ※1 Jackcess 本体は暗号化非対応。Jackcess Encrypt 拡張ライブラリ(別途導入)で対応。
  • ※2 Attachment / Multi-Value / Versioned Memo。ACE 形式(Access 2007+)固有。jetdb は参照IDの取得のみ(実データ未展開)。Jackcess は読み取り対応(テーブル新規作成は不可)。

補足:

  • MDB Tools は Jet3/Jet4(.mdb)のみ対応。ACE 形式(.accdb)は非対応
  • Jackcess は Access 97(Jet3)非対応。Access 2000 以降の読み書きに対応
  • mdb-reader v3.2.0 で Attachment カラム対応を追加
  • pyaccdb は .accdb 形式のみ対応(.mdb 非対応)。暗号化は Agile のみ
  • access-parser は .accdb 対応を謳うがテスト範囲が限定的
  • MMKiwi.MdbReader はプレアルファ段階。本番利用は非推奨
  • jetdb v0.2.1 で RC4 CryptoAPI、Standard AES、NonStandard AES 暗号化と DateTimeExtended カラム型を追加