Blog de Contraslash (Legacy)

Migrar de sqlite3 a MySQL Django

January 29, 2016

Migrar de sqlite3 a MySQL Django

Las migraciones de base de datos, independiente de la razón, siempre son fastiosas

Si aún no está instalado MySQL, instalarlo

sudo apt-get install mysql-server

También necesitamos Python-dev

sudo apt-get install python-dev

Instalamos dependencias requeridas en el Sistema operativo

sudo apt-get install libmysqlclient-dev
sudo pip install MySQL-python

Insalamos las dependencias en nuestro virtualenv

pip install MySQL-python

Existen dos aproximaciones a al dump data: especificando las aplicaciones que queremos migrar manage.py dumpdata --natural-foreign auth.User > initial_data.json

y excluyendo

./manage.py dumpdata --exclude=contenttypes --exclude=auth.Permission > initial_data.json

Altamente recomiendo usar este último, pues evita problemas de llaves foraneas.

Luego podemos modificar nuestro archivo settings.py actualizando nuestra configuración de bases de datos de:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

a:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': os.path.join(BASE_DIR,  'database.cnf'),
        },
    }
}

donde database.cnf es algo como

[client]
database = database
user = user_database
password = password_database
default-character-set = utf8

Ahora es importante migrar la base de datos ./manage.py migrate

Luego podemos importar datos.

Para importar los datos.

python manage.py loaddata initial_data.json

Cabe aclarar que pueden existir conflictos, específicamete con llaves foraneas, es posible que realmente el problema sea de integridad de la base de datos. Igual vale la pena verificar que los datos sean correctos

Espero que esto les haya sido útil o al menos les haya dado algo de luz

PD: Para extraer datos directamente de sqlite, uso el siguiente comando:

sqlite3 db.sqlite3 ".dump 'tabla1' 'tabla2'" | grep INSERT > dump_tablas.sql