How to Migrate MS Access (.mdb) to SQLite (.db) Programmatically: Tools and Code Examples


4 views

When migrating from MS Access to SQLite, we face several technical considerations:

  1. Schema translation between different database systems
  2. Data type mapping (e.g., Access' MEMO to SQLite's TEXT)
  3. Primary key and index preservation
  4. Relationship and constraint conversion

Here are three reliable approaches with code examples:

Method 1: Using Python with pyodbc and sqlite3

import pyodbc
import sqlite3

# Connect to Access DB
access_conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\path\to\your.mdb;')
access_cursor = access_conn.cursor()

# Connect to SQLite DB
sqlite_conn = sqlite3.connect('output.db')
sqlite_cursor = sqlite_conn.cursor()

# Get table list
tables = access_cursor.tables(tableType='TABLE')
table_names = [table.table_name for table in tables]

for table in table_names:
    # Get schema
    access_cursor.execute(f"SELECT * FROM [{table}] WHERE 1=0")
    columns = [column[0] for column in access_cursor.description]
    
    # Create table in SQLite
    sqlite_cursor.execute(f"CREATE TABLE {table} ({', '.join(columns)})")
    
    # Transfer data
    access_cursor.execute(f"SELECT * FROM [{table}]")
    for row in access_cursor:
        placeholders = ', '.join(['?'] * len(row))
        sqlite_cursor.execute(f"INSERT INTO {table} VALUES ({placeholders})", row)

sqlite_conn.commit()

Method 2: Using MDB Tools (Linux/Mac)

For Unix-based systems, install mdb-tools first:

sudo apt-get install mdbtools

Then use this bash script:

#!/bin/bash
mdb-schema database.mdb sqlite > schema.sql
sed -i 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /g' schema.sql
sqlite3 output.db < schema.sql

for table in $(mdb-tables database.mdb); do
    mdb-export -D '%Y-%m-%d %H:%M:%S' -I sqlite database.mdb $table | sqlite3 output.db
done

Method 3: Using Commercial Tools

For large databases, consider these specialized tools:

  • Full Convert Ultimate (Windows/Linux/Mac)
  • DB Browser for SQLite with MDB plugin
  • ESF Database Migration Toolkit

Watch out for these specific challenges during migration:

Access Type SQLite Equivalent Notes
AutoNumber INTEGER PRIMARY KEY Set as autoincrement
DateTime TEXT ISO8601 format recommended
YES/NO INTEGER (0/1) Convert boolean values

After conversion, always verify:

SELECT COUNT(*) FROM tablename; -- Compare record counts
PRAGMA foreign_key_check; -- Verify constraints
.schema -- Check table structures

Converting from MS Access (Jet Database Engine) to SQLite requires handling both schema migration and data transfer. The fundamental steps involve:

  • Extracting table schemas from the .mdb file
  • Creating equivalent SQLite tables
  • Transferring the data while handling type conversions
  • Preserving relationships and constraints

Here's a complete Python script that handles the conversion:


import pyodbc
import sqlite3

def access_to_sqlite(mdb_path, sqlite_path):
    # Connect to Access DB
    access_conn = pyodbc.connect(
        r'Driver={{Microsoft Access Driver (*.mdb, *.accdb)}};'
        r'DBQ={};'.format(mdb_path))
    
    # Connect to SQLite DB
    sqlite_conn = sqlite3.connect(sqlite_path)
    sqlite_cursor = sqlite_conn.cursor()
    
    # Get all tables
    table_names = [row.table_name for row in 
                  access_conn.cursor().tables(tableType='TABLE')]
    
    for table in table_names:
        # Get schema information
        access_cursor = access_conn.cursor()
        access_cursor.execute(f"SELECT * FROM [{table}] WHERE 1=0")
        columns = [column[0] for column in access_cursor.description]
        
        # Create SQLite table
        create_sql = f"CREATE TABLE IF NOT EXISTS [{table}] ({', '.join(columns)})"
        sqlite_cursor.execute(create_sql)
        
        # Transfer data
        access_cursor.execute(f"SELECT * FROM [{table}]")
        rows = access_cursor.fetchall()
        placeholders = ', '.join(['?'] * len(columns))
        sqlite_cursor.executemany(
            f"INSERT INTO [{table}] VALUES ({placeholders})", rows)
    
    sqlite_conn.commit()
    access_conn.close()
    sqlite_conn.close()

For those preferring command line solutions:


# First export Access data to CSV using mdb-tools
sudo apt-get install mdbtools  # For Linux
mdb-tables database.mdb > tables.txt

while read -r table; do
    mdb-export database.mdb "$table" > "$table".csv
    sqlite3 output.db ".mode csv" ".import $table.csv $table"
done < tables.txt

Common type mapping challenges include:

MS Access Type SQLite Type
AutoNumber INTEGER PRIMARY KEY AUTOINCREMENT
Text TEXT
Memo TEXT
DateTime TEXT (ISO8601 format)
Yes/No INTEGER (0 or 1)

For enterprise needs, consider these robust solutions:

  • Full Convert (https://www.fullconvert.com)
  • DBConvert (https://dbconvert.com)
  • Navicat Premium (https://www.navicat.com)

Problem: "Driver not found" error in Python
Solution: Install the correct Access ODBC driver from Microsoft's website or use 32-bit Python (as 64-bit may have driver issues).

Problem: Special characters corrupted during conversion
Solution: Ensure proper encoding handling by adding charset='utf-8' in your connection strings.