Quelqu'un connaît un moyen rapide et facile de migrer une base de données SQLite3 vers MySQL?
Voici une liste de convertisseurs (non mis à jour depuis 2011):
c'est-à-dire que vous pourriez faire ceci:
Tout le monde semble commencer avec quelques expressions greps et perl et vous obtenez en quelque sorte quelque chose qui fonctionne pour votre ensemble de données particulier, mais vous ne savez pas s'il a importé les données correctement ou non. Je suis sérieusement surpris que personne n'ait construit une bibliothèque solide qui puisse convertir entre les deux.
Voici une liste de TOUTES les différences de syntaxe SQL que je connais entre les deux formats de fichier: Les lignes commençant par:
ne sont pas utilisés dans MySQL
CREATE TABLE/INSERT INTO "table_name"
et MySQLCREATE TABLE/INSERT INTO table_name
INSERT INTO
clausesINSERT INTO
clauses't'
et 'f'
pour les booléens, MySQL utilise 1
et 0
(une simple expression régulière pour cela peut échouer lorsque vous avez une chaîne comme: `` Je le fais, vous ne le faites pas '' à l'intérieur de votre INSERT INTO
)AUTOINCREMENT
, MySQL utiliseAUTO_INCREMENT
Voici un script perl piraté très basique qui fonctionne pour mon jeu de données et vérifie beaucoup plus de ces conditions que les autres scripts perl que j'ai trouvés sur le web. Nu garantit que cela fonctionnera pour vos données, mais n'hésitez pas à modifier et à publier ici.
#! /usr/bin/perl
while ($line = <>){
if (($line !~ /BEGIN TRANSACTION/) && ($line !~ /COMMIT/) && ($line !~ /sqlite_sequence/) && ($line !~ /CREATE UNIQUE INDEX/)){
if ($line =~ /CREATE TABLE \"([a-z_]*)\"(.*)/i){
$name = $1;
$sub = $2;
$sub =~ s/\"//g;
$line = "DROP TABLE IF EXISTS $name;\nCREATE TABLE IF NOT EXISTS $name$sub\n";
}
elsif ($line =~ /INSERT INTO \"([a-z_]*)\"(.*)/i){
$line = "INSERT INTO $1$2\n";
$line =~ s/\"/\\\"/g;
$line =~ s/\"/\'/g;
}else{
$line =~ s/\'\'/\\\'/g;
}
$line =~ s/([^\\'])\'t\'(.)/$1THIS_IS_TRUE$2/g;
$line =~ s/THIS_IS_TRUE/1/g;
$line =~ s/([^\\'])\'f\'(.)/$1THIS_IS_FALSE$2/g;
$line =~ s/THIS_IS_FALSE/0/g;
$line =~ s/AUTOINCREMENT/AUTO_INCREMENT/g;
print $line;
}
}
&& ($line !~ /CREATE UNIQUE INDEX/)
ajout&& ($line !~ /PRAGMA foreign_keys=OFF/)
* le regex correspondant au nom de la table manque des chiffres, c'est-à-dire$line =~ /INSERT INTO \"([a-z_]*)\"(.*)/
qu'il doit y avoir au lieu d'$line =~ /INSERT INTO \"([a-z_1-9]*)\"(.*)/
espérer que cela aide l'avenir lecteursVoici un script python, construit à partir de la réponse de Shalmanese et de l'aide d'Alex martelli sur Translating Perl to Python
J'en fais un wiki communautaire, alors n'hésitez pas à le modifier et à le refactoriser tant qu'il ne casse pas la fonctionnalité (heureusement, nous pouvons simplement revenir en arrière) - C'est assez moche mais ça marche
utiliser comme tel (en supposant que le script s'appelle
dump_for_mysql.py
:Que vous pouvez ensuite importer dans mysql
note - vous devez ajouter manuellement les contraintes de clé étrangère car sqlite ne les prend pas réellement en charge
voici le script:
la source
schema_migrations
(version
varchar (255) NOT NULL); INSÉRER DANS schema_migrations VALUES (20100714032840
); INSERT INTO schema_migrations VALUES ('20100714033251'); __Blobvar
type de données, back ticks dans l'instruction CREATE ...La méthode la plus simple et rapide consiste probablement à utiliser la commande sqlite .dump, dans ce cas, créez un vidage de la base de données exemple.
Vous pouvez ensuite (en théorie) l'importer dans la base de données mysql, dans ce cas la base de données de test sur le serveur de base de données 127.0.0.1, en utilisant l'utilisateur root.
Je dis en théorie car il y a quelques différences entre les grammaires.
Dans sqlite, les transactions commencent
MySQL utilise juste
Il y a d'autres problèmes similaires (varchars et guillemets reviennent à l'esprit) mais rien à trouver et à remplacer n'a pu être résolu.
Vous devriez peut-être vous demander pourquoi vous migrez, si les performances / la taille de la base de données sont le problème, peut-être envisager de réorganiser le schéma, si le système passe à un produit plus puissant, cela pourrait être le moment idéal pour planifier l'avenir de vos données.
la source
Si vous utilisez Python / Django, c'est assez simple:
créer deux bases de données dans settings.py (comme ici https://docs.djangoproject.com/en/1.11/topics/db/multi-db/ )
alors faites comme ça:
la source
la source
J'utilise généralement la fonction Exporter / importer des tableaux d' IntelliJ DataGrip .
Vous pouvez voir la progression dans le coin inférieur droit.
[ ]
la source
Je viens de passer par ce processus, et il y a beaucoup de très bonnes informations et aide dans ce Q / R, mais j'ai trouvé que je devais rassembler divers éléments (plus certains d'autres Q / As) pour obtenir une solution de travail dans afin de réussir la migration.
Cependant, même après avoir combiné les réponses existantes, j'ai constaté que le script Python ne fonctionnait pas entièrement pour moi car il ne fonctionnait pas lorsqu'il y avait plusieurs occurrences booléennes dans un INSERT. Voir ici pourquoi c'était le cas.
Donc, je pensais publier ma réponse fusionnée ici. Le mérite revient à ceux qui ont contribué ailleurs, bien sûr. Mais je voulais donner quelque chose en retour et faire gagner du temps aux autres.
Je posterai le script ci-dessous. Mais d'abord, voici les instructions pour une conversion ...
J'ai exécuté le script sur OS X 10.7.5 Lion. Python a fonctionné hors de la boîte.
Pour générer le fichier d'entrée MySQL à partir de votre base de données SQLite3 existante, exécutez le script sur vos propres fichiers comme suit,
J'ai ensuite copié le fichier dumped_sql.sql résultant sur une boîte Linux exécutant Ubuntu 10.04.4 LTS où ma base de données MySQL devait résider.
Un autre problème que j'ai eu lors de l'importation du fichier MySQL était que certains caractères Unicode UTF-8 (en particulier les guillemets simples) n'étaient pas importés correctement, j'ai donc dû ajouter un commutateur à la commande pour spécifier UTF-8.
La commande résultante pour entrer les données dans une nouvelle base de données MySQL vide fessée est la suivante:
Laissez-le cuire, et ça devrait être ça! N'oubliez pas d'examiner vos données avant et après.
Ainsi, comme l'OP l'a demandé, c'est rapide et facile, quand vous savez comment! :-)
Soit dit en passant, une chose dont je n'étais pas sûr avant d'examiner cette migration, était de savoir si les valeurs des champs created_at et updated_at seraient préservées - la bonne nouvelle pour moi est qu'elles le sont, afin que je puisse migrer mes données de production existantes.
Bonne chance!
METTRE À JOUR
Depuis que j'ai fait ce changement, j'ai remarqué un problème que je n'avais pas remarqué auparavant. Dans mon application Rails, mes champs de texte sont définis comme «chaîne», et cela se poursuit jusqu'au schéma de base de données. Le processus décrit ici entraîne leur définition comme VARCHAR (255) dans la base de données MySQL. Cela place une limite de 255 caractères sur ces tailles de champ - et tout ce qui était au-delà a été tronqué silencieusement lors de l'importation. Pour prendre en charge une longueur de texte supérieure à 255, le schéma MySQL devrait utiliser «TEXT» plutôt que VARCHAR (255), je crois. Le processus défini ici n'inclut pas cette conversion.
Voici le script Python fusionné et révisé qui a fonctionné pour mes données:
la source
J'ai récemment dû migrer de MySQL vers JavaDB pour un projet sur lequel notre équipe travaille. J'ai trouvé une bibliothèque Java écrite par Apache appelée DdlUtils qui a rendu cela assez facile. Il fournit une API qui vous permet d'effectuer les opérations suivantes:
Les outils avec lesquels nous nous sommes retrouvés n'étaient pas complètement automatisés, mais ils fonctionnaient plutôt bien. Même si votre application n'est pas en Java, il ne devrait pas être trop difficile de concocter quelques petits outils pour effectuer une migration unique. Je pense que j'ai pu tirer de notre migration avec moins de 150 lignes de code.
la source
Il n'y a aucun besoin de script, commande, etc ...
vous devez uniquement exporter votre base de données sqlite en tant que
.csv
fichier, puis l'importer dans Mysql en utilisant phpmyadmin.Je l'ai utilisé et cela a fonctionné de façon incroyable ...
la source
Basé sur la solution de Jims: un moyen simple et rapide de migrer SQLite3 vers MySQL?
Cela fonctionne pour moi. J'utilise sed juste pour jeter la première ligne, qui n'est pas semblable à mysql, mais vous pourriez aussi bien modifier le script dump.py pour jeter cette ligne.
la source
Obtenez un vidage SQL
Importer le vidage dans MySQL
Pour les petites importations:
ou
Cela vous demandera un mot de passe. Attention: si vous souhaitez saisir directement votre mot de passe, vous devez le faire SANS espace, directement après
-p
:Pour les décharges plus importantes:
mysqlimport ou d'autres outils d'importation comme BigDump .
BigDump vous donne une barre de progression:
la source
Ha ... j'aurais aimé l'avoir trouvé en premier! Ma réponse a été à ce poste ... script pour convertir le fichier sql dump mysql dans un format qui peut être importé dans sqlite3 db
La combinaison des deux serait exactement ce dont j'avais besoin:
Lorsque la base de données sqlite3 va être utilisée avec ruby, vous pouvez changer:
à:
hélas, cela ne fonctionne qu'à moitié parce que même si vous insérez des 1 et des 0 dans un champ marqué booléen, sqlite3 les stocke en tant que 1 et 0, vous devez donc passer par et faire quelque chose comme:
mais il était utile d'avoir le fichier sql à regarder pour trouver tous les booléens.
la source
J'ai écrit ce script simple en Python3. Il peut être utilisé comme classe incluse ou script autonome appelé via un shell de terminal. Par défaut, il importe tous les entiers en tant que
int(11)
et les chaînes en tant quevarchar(300)
, mais tout ce qui peut être ajusté dans les arguments du constructeur ou du script respectivement.REMARQUE: il nécessite MySQL Connector / Python 2.0.4 ou supérieur
Voici un lien vers la source sur GitHub si vous trouvez le code ci-dessous difficile à lire: https://github.com/techouse/sqlite3-to-mysql
la source
Ce script est ok, sauf dans ce cas, bien sûr, j'ai rencontré:
Le script devrait donner cette sortie:
Mais donne à la place cette sortie:
avec d'étranges caractères non ascii autour des 0 et 1 derniers.
Cela ne s'est plus affiché lorsque j'ai commenté les lignes suivantes du code (43-46) mais d'autres problèmes sont apparus:
Ceci est juste un cas spécial, lorsque nous voulons ajouter une valeur étant 'f' ou 't' mais je ne suis pas vraiment à l'aise avec les expressions régulières, je voulais juste repérer ce cas pour être corrigé par quelqu'un.
Quoi qu'il en soit, merci beaucoup pour ce script pratique !!!
la source
Cette solution simple a fonctionné pour moi:
la source
attention aux instructions CREATE
la source