When migrating from MS Access to SQLite, we face several technical considerations:
- Schema translation between different database systems
- Data type mapping (e.g., Access' MEMO to SQLite's TEXT)
- Primary key and index preservation
- 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.