Created
September 8, 2016 13:26
-
-
Save kazlauskis/1d0bdb9efb3b1bb1e76d48aa368f3a64 to your computer and use it in GitHub Desktop.
Transforms MS Access MDB file to sqlite database using mdbtools
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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 |
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Today, on my system, it needs extra
--quote=\'passed tomdb-exportin order to make it work due to sqlite changes, that make it not accept double quotes anymore