94 votes

Exporter une base de données MySQL vers une base de données SQLite

S'il vous plaît aidez-moi à exporter une base de données MySQL dans une base de données SQLite.

3 votes

Le projet SQLite dispose également d'une page sur les utilitaires de conversion : sqlite.org/cvstrac/wiki?p=ConverterTools

0 votes

@Clinton il y a un avertissement sur la page à laquelle vous avez lié indiquant que les informations sont obsolètes.

1 votes

@Le lien Clinton renvoie "Non trouvé". Il semble que ces outils de conversion ne soient plus disponibles ou pris en charge.

90voto

georgiecasey Points 2914

Il y a un fantastique script shell Linux sur Github qui convertit Mysql en un fichier Sqlite3. Vous avez besoin à la fois de mysqldump et sqlite3 installés sur votre serveur. Fonctionne très bien.

0 votes

Fonctionne le mieux jusqu'à présent! il suffisait de supprimer certaines déclarations "COLLATE xy" avec des encodages que sqlite ne comprend pas. Notez que vous n'aurez pas besoin de sqlite3 sur votre serveur si vous souhaitez un clone de votre base de données mysql pour le développement local.

1 votes

Malheureusement, cela n'a pas fonctionné pour moi. Outre les problèmes avec les déclarations "PRIMARY KEY" mentionnées ci-dessous, de nombreuses autres erreurs ont été signalées, liées aux déclarations "INSERT" et aux tables manquantes ("objects").

2 votes

L'auteur a abandonné le script, mais le travail a continué dans ce fork : github.com/dumblob/mysql2sqlite

8voto

George Fisher Points 521

La réponse de @user2111698 éditée par @quassy fonctionne comme promis. Comme je fais cela fréquemment, j'ai mis leurs instructions dans un script bash :

#!/bin/bash

mysql_host=localhost
mysql_user=george
mysql_dbname=database
sqlite3_dbname=database.sqlite3

# dump de la base de données MySQL dans un fichier texte
mysqldump \
  --skip-create-options \
  --compatible=ansi \
  --skip-extended-insert \
  --compact \
  --single-transaction \
  -h$mysql_host \
  -u$mysql_user \
  -p $mysql_dbname \
  > /tmp/localdb.txt

# supprimer les lignes mentionnant "PRIMARY KEY" ou "KEY"
cat /tmp/localdb.txt \
  | grep -v "PRIMARY KEY" \
  | grep -v KEY \
  > /tmp/localdb.txt.1

# mysqldump laisse des virgules finales avant les parenthèses fermantes
perl -0pe 's/,\n\)/\)/g' /tmp/localdb.txt.1 > /tmp/localdb.txt.2

# remplacer tous les \' par ''
sed -e 's/\\'\''/'\'''\''/g' /tmp/localdb.txt.2 > /tmp/localdb.txt.3

if [ -e $sqlite3_dbname ]; then
    mv $sqlite3_dbname $sqlite3_dbname.bak
fi
sqlite3 $sqlite3_dbname < /tmp/localdb.txt.3

Un gist avec des commentaires détaillés peut être trouvé à https://gist.github.com/grfiv/b79ace3656113bcfbd9b7c7da8e9ae8d

0 votes

Si vous formatez votre code pour éliminer le défilement, vous le rendez plus facile à lire pour les autres.

0 votes

Heureux de; ne pas voir rapidement comment

1 votes

Si vous supprimez les commentaires, vous en avez fini avec le défilement vertical (ajoutez tous les commentaires que vous jugez importants dans le texte de votre réponse). Le défilement vertical peut être géré avec un retour à la ligne.

4voto

Mysql2sqlite.sh mentionné dans le premier post ne gère pas bien les lignes PRIMARY KEY, il n'écrit pas la parenthèse fermante ) pour compléter l'instruction CREATE.

Voici ce que j'ai fait. J'ai exécuté la sauvegarde mysql comme suit :

mysqldump --skip-create-options --compatible=ansi --skip-extended-insert --compact --single-transaction -h -u -p  > localdb.txt

J'ai ensuite utilisé grep pour supprimer PRIMARY KEY et KEY :

cat localdb.txt | grep -v "PRIMARY KEY' | grep -v KEY > localdb.txt.1

Ensuite, j'ai utilisé un éditeur pour corriger le fichier. Lorsque les clés sont supprimées, vous obtenez une instruction CREATE qui ressemble à ceci :

CREATE ...
  ...,
)

Il faut supprimer cette virgule finale ,. Dans vi, cette expression les correspond ,$\n)

Ensuite, vous devez remplacer tous les \' par ''

Ensuite, vous pouvez importer :

sqlite3 local.sqlite3 < localdb.txt.1

Et voilà. Je n'ai trouvé aucun programme qui a fonctionné pour moi. J'espère que cela aide quelqu'un.

4voto

caiofior Points 39

J'ai créé manuellement la structure de la table dans la base de données SQLite.

Ensuite, j'ai téléchargé les données avec la commande suivante :

mysqldump -u root {database} {table} --no-create-info --skip-extended-insert  --complete-insert --skip-add-locks  --compatible=ansi | sed "s/\\\'/''/g" |sqlite3 flora.db

J'ai dû utiliser sed pour corriger un encodage d'apex différent dans les deux bases de données.

0 votes

Merci pour cela, c'était utile puisque la question initiale ne spécifiait pas si le schéma de création devait être inclus. Plus simple lorsque le schéma a déjà été configuré

0voto

user243202 Points 1

Personnellement, j'aime l'utilisation simple de mysqldump, mais quelques ajustements sont nécessaires (en fonction de votre maîtrise de Unix et de ce que vous voulez faire).

Par exemple, pour une seule table (prods) avec PK:

$ mysqldump mysql prods -u MOI -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
$ mysqldump mysql prods -u MOI -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
    Erreur: à la ligne 1: la table "prods" existe déjà
    Erreur: à la ligne 7: contrainte UNIQUE échouée: prods.id, prods.ts
$ sqlite3 testme2.db '.schema'
    CREATE TABLE "prods" (
      "id" varchar(30) NOT NULL DEFAULT '',
      "ts" int(11) NOT NULL DEFAULT '0',
      "val" double DEFAULT NULL,
      PRIMARY KEY ("id","ts")
    );

Pour des choses plus complexes, il est probablement préférable d'écrire un wrapper, ou alors, d'utiliser le fantastique script shell awk Linux sur Gist déjà mentionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X