Mot-clé - sqlite

Fil des billets

dimanche 30 mars 2014

Convertir une base de données SQLite vers MySQL/MariaDB

Il est assez aisé de convertir une base SQLite pour MySQL/MariaDB. J'inspire le contenu de ce poste de cet article : http://fabianpeter.de/cloud/owncloud-migrating-from-sqlite-to-mysql/ écrit pour ownCloud mais qui peut fonctionner pour d'autres cas de migration bien sûr.

On commence par exporter le contenu de la base SQLite dans un fichier dump.sql :

sqlite3 database.sqlite3 .dump > dump.sql

On effectue ensuite automatiquement les modifications de syntaxe nécessaires pour que MySQL/MariaDB s'y retrouve à l'aide d'un script trouvé ici dont le contenu est rappelé plus bas pour archivage :

cat dump.sql | python sqlite3-to-mysql.py > nouveau-sql-pour-mariadb.sql

Le script de conversion (dont je ne suis pas l'auteur) :

#! /usr/bin/env python

import sys

def main():
    print "SET sql_mode='NO_BACKSLASH_ESCAPES';"
    lines = sys.stdin.read().splitlines()
    for line in lines:
        processLine(line)

def processLine(line):
    if (
        line.startswith("PRAGMA") or 
        line.startswith("BEGIN TRANSACTION;") or
        line.startswith("COMMIT;") or
        line.startswith("DELETE FROM sqlite_sequence;") or
        line.startswith("INSERT INTO \"sqlite_sequence\"")
       ):
        return
    line = line.replace("AUTOINCREMENT", "AUTO_INCREMENT")
    line = line.replace("DEFAULT 't'", "DEFAULT '1'")
    line = line.replace("DEFAULT 'f'", "DEFAULT '0'")
    line = line.replace(",'t'", ",'1'")
    line = line.replace(",'f'", ",'0'")
    in_string = False
    newLine = ''
    for c in line:
        if not in_string:
            if c == "'":
                in_string = True
            elif c == '"':
                newLine = newLine + '`'
                continue
        elif c == "'":
            in_string = False
        newLine = newLine + c
    print newLine

if __name__ == "__main__":
    main()