-
-
Save kazlauskis/1d0bdb9efb3b1bb1e76d48aa368f3a64 to your computer and use it in GitHub Desktop.
| #!/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 |
Today, on my system, it needs extra --quote=\' passed to mdb-export in order to make it work due to sqlite changes, that make it not accept double quotes anymore
Writing my version based on some comments above (sadly before I saw kristopolous's clean version):
#!/bin/bash
MDB_NAME="migration-export.mdb"
OUTPUT_DB_NAME="sqlite/db.sqlite3"
mkdir -p ./sqlite/sql
mdb-schema "$MDB_NAME" sqlite > sqlite/schema.sql
sIFS=$IFS
IFS='|'
for table in $( mdb-tables --delimiter="|" "$MDB_NAME" ); do echo $i ; mdb-export --quote=\' -D "%Y-%m-%d %H:%M:%S" -H -I sqlite "$MDB_NAME" "$table" > "sqlite/sql/$table.sql"; done
cat sqlite/schema.sql | sqlite3 "$OUTPUT_DB_NAME"
for f in sqlite/sql/* ; do echo "$f" && (echo 'BEGIN;'; cat "$f"; echo 'COMMIT;') | sqlite3 "$OUTPUT_DB_NAME"; done
IFS=$sIFSThe important change here is temporarily changing delimiter to |, since table names can and often have spaces!!! And that would mess up the current script, since mdb-tables prints them all space-delimited by default, which is impossible to properly parse. Plus fixed missing quotes around variable names that can contain spaces
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
Here's a cleanup I did.