Kennt jemand eine schnelle und einfache Möglichkeit, eine SQLite3-Datenbank auf MySQL zu migrieren?
Hier ist eine Liste der Konverter (seit 2011 nicht aktualisiert):
dh Sie könnten dies tun:
Jeder scheint mit ein paar Greps- und Perl-Ausdrücken zu beginnen, und Sie erhalten irgendwie etwas, das für Ihren bestimmten Datensatz funktioniert, aber Sie haben keine Ahnung, ob die Daten korrekt importiert wurden oder nicht. Ich bin ernsthaft überrascht, dass niemand eine solide Bibliothek aufgebaut hat, die zwischen den beiden konvertieren kann.
Hier eine Liste ALLER Unterschiede in der SQL-Syntax, die ich zwischen den beiden Dateiformaten kenne: Die Zeilen beginnen mit:
werden in MySQL nicht verwendet
CREATE TABLE/INSERT INTO "table_name"
und MySQL verwendetCREATE TABLE/INSERT INTO table_name
INSERT INTO
KlauselnINSERT INTO
Klauseln zu umgehen't'
und 'f'
für Boolesche Werte verwendet MySQL 1
und 0
(ein einfacher regulärer Ausdruck hierfür kann fehlschlagen, wenn Sie eine Zeichenfolge wie "Ich tue, Sie tun es nicht" in Ihrem INSERT INTO
).AUTOINCREMENT
, MySQL verwendetAUTO_INCREMENT
Hier ist ein sehr einfaches gehacktes Perl-Skript, das für meinen Datensatz funktioniert und auf viele weitere dieser Bedingungen überprüft, die andere Perl-Skripte im Web gefunden haben. Nu garantiert, dass es für Ihre Daten funktioniert, Sie können es jedoch gerne ändern und hier veröffentlichen.
#! /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/)
Hinzufügen&& ($line !~ /PRAGMA foreign_keys=OFF/)
* fehlen bei der mit dem Tabellennamen übereinstimmenden Regex Ziffern, das heißt,$line =~ /INSERT INTO \"([a-z_]*)\"(.*)/
es muss$line =~ /INSERT INTO \"([a-z_1-9]*)\"(.*)/
Hoffnung geben, dass dies der Zukunft hilft LeserHier ist ein Python-Skript, das aus Shalmaneses Antwort und etwas Hilfe von Alex Martelli bei Translating Perl to Python aufgebaut ist
Ich mache es zum Community-Wiki, also zögern Sie nicht, es zu bearbeiten und umzugestalten, solange es die Funktionalität nicht beeinträchtigt (zum Glück können wir einfach einen Rollback durchführen) - Es ist ziemlich hässlich, funktioniert aber
Verwenden Sie wie folgt (vorausgesetzt, das Skript heißt
dump_for_mysql.py
:Was Sie dann in MySQL importieren können
Hinweis - Sie müssen Fremdschlüsseleinschränkungen manuell hinzufügen, da SQLite diese nicht unterstützt
Hier ist das Skript:
quelle
schema_migrations
(version
varchar (255) NOT NULL); INSERT INTO schema_migrations VALUES (20100714032840
); INSERT INTO schema_migrations VALUES ('20100714033251'); __Blobvar
Datentyp, Back Ticks in CREATE-Anweisung ...Der schnellste und einfachste Weg ist wahrscheinlich die Verwendung des Befehls sqlite .dump. In diesem Fall erstellen Sie einen Speicherauszug der Beispieldatenbank.
Sie können dies dann (theoretisch) mit dem Benutzer root in die MySQL-Datenbank importieren, in diesem Fall in die Testdatenbank auf dem Datenbankserver 127.0.0.1.
Ich sage theoretisch, da es einige Unterschiede zwischen den Grammatiken gibt.
In SQLite beginnen Transaktionen
MySQL verwendet nur
Es gibt andere ähnliche Probleme (Varchars und doppelte Anführungszeichen fallen mir ein), aber nichts, was gefunden und ersetzt werden konnte, konnte nicht behoben werden.
Vielleicht sollten Sie sich fragen, warum Sie migrieren. Wenn Leistung / Datenbankgröße das Problem sind, sollten Sie das Schema neu definieren. Wenn das System auf ein leistungsfähigeres Produkt umstellt, ist dies möglicherweise der ideale Zeitpunkt, um die Zukunft Ihrer Daten zu planen.
quelle
Wenn Sie Python / Django verwenden, ist es ziemlich einfach:
Erstellen Sie zwei Datenbanken in settings.py (wie hier https://docs.djangoproject.com/de/1.11/topics/db/multi-db/ ).
dann mach einfach so:
quelle
quelle
Ich habe gerade diesen Prozess durchlaufen und es gibt eine Menge sehr guter Hilfe und Informationen in dieser Frage / Antwort, aber ich stellte fest, dass ich verschiedene Elemente (plus einige aus anderen Fragen / Antworten) zusammenführen musste, um eine funktionierende Lösung zu finden um erfolgreich zu migrieren.
Selbst nachdem ich die vorhandenen Antworten kombiniert hatte, stellte ich fest, dass das Python-Skript für mich nicht vollständig funktionierte, da es nicht funktionierte, wenn in einem INSERT mehrere boolesche Vorkommen vorkamen. Sehen Sie hier, warum das so war.
Also dachte ich, ich würde meine zusammengeführte Antwort hier veröffentlichen. Der Kredit geht natürlich an diejenigen, die anderswo beigetragen haben. Aber ich wollte etwas zurückgeben und anderen Zeit sparen, die folgen.
Ich werde das Skript unten posten. Aber zuerst hier die Anweisungen für eine Konvertierung ...
Ich habe das Skript unter OS X 10.7.5 Lion ausgeführt. Python hat sofort funktioniert.
Führen Sie das Skript wie folgt aus, um die MySQL-Eingabedatei aus Ihrer vorhandenen SQLite3-Datenbank zu generieren:
Ich habe dann die resultierende Datei dumped_sql.sql auf eine Linux-Box mit Ubuntu 10.04.4 LTS kopiert, auf der sich meine MySQL-Datenbank befinden sollte.
Ein weiteres Problem beim Importieren der MySQL-Datei war, dass einige Unicode-UTF-8-Zeichen (insbesondere einfache Anführungszeichen) nicht korrekt importiert wurden. Daher musste ich dem Befehl einen Schalter hinzufügen, um UTF-8 anzugeben.
Der resultierende Befehl zum Eingeben der Daten in eine neue leere MySQL-Datenbank lautet wie folgt:
Lass es kochen, und das sollte es sein! Vergessen Sie nicht, Ihre Daten vorher und nachher zu überprüfen.
Wie vom OP gefordert, ist es also schnell und einfach, wenn Sie wissen wie! :-)
Abgesehen davon war ich mir vor der Untersuchung dieser Migration nicht sicher, ob die Feldwerte created_at und updated_at erhalten bleiben würden. Die gute Nachricht für mich ist, dass dies der Fall ist, sodass ich meine vorhandenen Produktionsdaten migrieren kann.
Viel Glück!
AKTUALISIEREN
Seit ich diesen Wechsel vorgenommen habe, ist mir ein Problem aufgefallen, das ich vorher nicht bemerkt hatte. In meiner Rails-Anwendung sind meine Textfelder als "Zeichenfolge" definiert, was sich auf das Datenbankschema auswirkt. Der hier beschriebene Prozess führt dazu, dass diese in der MySQL-Datenbank als VARCHAR (255) definiert werden. Dadurch werden diese Feldgrößen auf 255 Zeichen begrenzt - und alles darüber hinaus wurde während des Imports stillschweigend abgeschnitten. Um eine Textlänge von mehr als 255 zu unterstützen, müsste das MySQL-Schema meiner Meinung nach 'TEXT' anstelle von VARCHAR (255) verwenden. Der hier definierte Prozess beinhaltet diese Konvertierung nicht.
Hier ist das zusammengeführte und überarbeitete Python-Skript, das für meine Daten funktioniert hat:
quelle
Normalerweise verwende ich die Funktion zum Exportieren / Importieren von Tabellen von IntelliJ DataGrip .
Sie können den Fortschritt in der unteren rechten Ecke sehen.
[ ]
quelle
Ich musste kürzlich für ein Projekt, an dem unser Team arbeitet, von MySQL auf JavaDB migrieren. Ich habe eine von Apache geschriebene Java-Bibliothek namens DdlUtils gefunden , die dies ziemlich einfach gemacht hat. Es bietet eine API, mit der Sie Folgendes tun können:
Die Tools, mit denen wir endeten, waren nicht vollständig automatisiert, aber sie funktionierten ziemlich gut. Selbst wenn sich Ihre Anwendung nicht in Java befindet, sollte es nicht allzu schwierig sein, ein paar kleine Tools für eine einmalige Migration zu erstellen. Ich glaube, ich konnte unsere Migration mit weniger als 150 Codezeilen abbrechen.
quelle
Es ist kein Skript, Befehl usw. erforderlich.
Sie müssen Ihre SQLite-Datenbank nur als
.csv
Datei exportieren und dann mit phpmyadmin in MySQL importieren.Ich habe es benutzt und es hat unglaublich funktioniert ...
quelle
Basierend auf Jims 'Lösung: Schnelle und einfache Möglichkeit, SQLite3 auf MySQL zu migrieren?
Das funktioniert bei mir. Ich benutze sed nur, um die erste Zeile zu werfen, die nicht MySQL-ähnlich ist, aber Sie können auch das dump.py-Skript ändern, um diese Zeile wegzuwerfen.
quelle
Holen Sie sich einen SQL-Dump
Dump in MySQL importieren
Für kleine Importe:
oder
Dadurch werden Sie zur Eingabe eines Kennworts aufgefordert. Bitte beachten Sie: Wenn Sie Ihr Passwort direkt eingeben möchten, müssen Sie dies OHNE Leerzeichen direkt nach
-p
:Für größere Deponien:
mysqlimport oder andere Importtools wie BigDump .
BigDump gibt Ihnen einen Fortschrittsbalken:
quelle
Ha ... ich wünschte ich hätte das zuerst gefunden! Meine Antwort war auf dieses Post ... -Skript, um die MySQL-Dump-SQL-Datei in ein Format zu konvertieren, das in die SQLite3-Datenbank importiert werden kann
Die beiden zu kombinieren wäre genau das, was ich brauchte:
Wenn die sqlite3-Datenbank mit Ruby verwendet werden soll, möchten Sie möglicherweise Folgendes ändern:
zu:
Leider funktioniert dies nur zur Hälfte, denn obwohl Sie Einsen und Nullen in ein mit Booleschem Wert gekennzeichnetes Feld einfügen, speichert sqlite3 sie als Einsen und Nullen, sodass Sie Folgendes tun müssen:
Es war jedoch hilfreich, die SQL-Datei zu haben, um alle Booleschen Werte zu finden.
quelle
Ich habe dieses einfache Skript in Python3 geschrieben. Es kann als enthaltene Klasse oder als eigenständiges Skript verwendet werden, das über eine Terminal-Shell aufgerufen wird. Standardmäßig werden alle Ganzzahlen als
int(11)
und Zeichenfolgen als importiertvarchar(300)
, aber alles, was in den Konstruktor- bzw. Skriptargumenten angepasst werden kann.HINWEIS: Es erfordert MySQL Connector / Python 2.0.4 oder höher
Hier ist ein Link zur Quelle auf GitHub, wenn Sie den folgenden Code schwer lesen können: https://github.com/techouse/sqlite3-to-mysql
quelle
Dieses Skript ist in Ordnung, außer in diesem Fall, den ich natürlich getroffen habe:
Das Skript sollte diese Ausgabe geben:
Aber gibt stattdessen diese Ausgabe:
mit einigen seltsamen Nicht-ASCII-Zeichen um die letzten 0 und 1.
Dies wurde nicht mehr angezeigt, als ich die folgenden Zeilen des Codes (43-46) kommentierte, aber andere Probleme traten auf:
Dies ist nur ein Sonderfall, wenn wir einen Wert hinzufügen möchten, der 'f' oder 't' ist, ich aber mit regulären Ausdrücken nicht wirklich vertraut bin. Ich wollte nur diesen Fall erkennen, um von jemandem korrigiert zu werden.
Trotzdem vielen Dank für das praktische Skript !!!
quelle
Diese einfache Lösung hat bei mir funktioniert:
quelle
Achten Sie auf CREATE-Anweisungen
quelle