Skip to content

Instantly share code, notes, and snippets.

@kazlauskis
Created September 8, 2016 13:26
Show Gist options
  • Save kazlauskis/1d0bdb9efb3b1bb1e76d48aa368f3a64 to your computer and use it in GitHub Desktop.
Save kazlauskis/1d0bdb9efb3b1bb1e76d48aa368f3a64 to your computer and use it in GitHub Desktop.
Transforms MS Access MDB file to sqlite database using mdbtools
#!/bin/bash
# Inspired by
# https://www.codeenigma.com/community/blog/using-mdbtools-nix-convert-microsoft-access-mysql
# USAGE
# Rename your MDB file to migration-export.mdb
# run ./mdb2sqlite.sh migration-export.mdb
# wait and wait a bit longer...
mdb-schema migration-export.mdb sqlite > schema.sql
mkdir sqlite
mkdir sql
for i in $( mdb-tables migration-export.mdb ); do echo $i ; mdb-export -D "%Y-%m-%d %H:%M:%S" -H -I sqlite migration-export.mdb $i > sql/$i.sql; done
mv schema.sql sqlite
mv sql sqlite
cd sqlite
cat schema.sql | sqlite3 db.sqlite3
for f in sql/* ; do echo $f && cat $f | sqlite3 db.sqlite3; done
@platipusica
Copy link

platipusica commented Oct 7, 2025

Here is the ChatGPT:

https://chatgpt.com/share/68e4fac3-c604-8012-acc9-38d0876b29f3

It produced 100% accurate script for non-Latin database AND removed MS Access attachment type, which is a no-no ( ie. Attachments type 0012):

#!/bin/bash
set -euo pipefail

MDB_NAME="migration-export.mdb"
OUTPUT_DB_NAME="sqlite/db.sqlite3"

mkdir -p ./sqlite/sql

echo "Extracting schema..."
mdb-schema "$MDB_NAME" sqlite > sqlite/schema.sql

echo "Cleaning schema..."
# Fix unsupported Access types and syntax
sed -i '
    s/type 0012/BLOB/g;
    s/OLEOBJECT/BLOB/g;
    s/MEMO/TEXT/g;
    s/TEXT ([0-9]*)/TEXT/g;
    /CONSTRAINT/d
' sqlite/schema.sql

# ⚠️ Removed quote-wrapping for CREATE TABLE — mdb-schema already uses backticks

echo "Creating SQLite database..."
sqlite3 "$OUTPUT_DB_NAME" < sqlite/schema.sql || echo "⚠️ Schema import produced warnings"

echo "Exporting tables..."
mdb-tables -1 "$MDB_NAME" | while read -r table; do
    [ -z "$table" ] && continue
    echo "→ Exporting $table..."
    mdb-export -q \' -D "%Y-%m-%d %H:%M:%S" -H -I sqlite "$MDB_NAME" "$table" > "sqlite/sql/$table.sql" || {
        echo "⚠️ Failed to export $table"
        continue
    }
done

echo "Importing into SQLite..."
for f in sqlite/sql/*.sql; do
    [ -s "$f" ] || continue
    echo "→ Importing $(basename "$f")"
    (echo 'BEGIN;'; cat "$f"; echo 'COMMIT;') | sqlite3 "$OUTPUT_DB_NAME" || echo "⚠️ Import warning for $f"
done

echo "✅ Done."

Enjoy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment