Wie speichere ich die Daten und nur die Daten, nicht das Schema, einiger SQLite3-Tabellen einer Datenbank (nicht aller Tabellen)? Der Speicherauszug sollte im SQL-Format vorliegen, da er später leicht wieder in die Datenbank eingegeben werden kann und über die Befehlszeile erfolgen sollte. Etwas wie
sqlite3 db .dump
aber ohne das Schema zu sichern und auszuwählen, welche Tabellen ausgegeben werden sollen.
Antworten:
Sie sagen nicht, was Sie mit der abgelegten Datei tun möchten.
Ich würde Folgendes verwenden, um eine CSV-Datei zu erhalten, die ich in fast alles importieren kann
Wenn Sie erneut in eine andere SQLite-Datenbank einfügen möchten, gehen Sie wie folgt vor:
quelle
Sie können dies tun, um einen Unterschied zwischen den Befehlen .schema und .dump zu erhalten. zum Beispiel mit grep:
data.sql
Die Datei enthält nur Daten ohne Schema.Ich hoffe das hilft dir.
quelle
sqlite3 some.db < data.sql
sqlite3 storage/db/jobs.s3db .schema jobs > schema.sql
nicht funktionieren, aber gutecho '.schema' jobs | sqlite3 storage/db/jobs.s3db > schema.sql
funktionieren);
, und grep entfernt alle Zeilen, die das);
Hinzufügen der-x
Option zu grep enthalten, um dieses Problem zu beheben.Nicht der beste Weg, benötigt aber zumindest keine externen Tools (außer grep, das auf * nix-Boxen sowieso Standard ist)
Sie müssen diesen Befehl jedoch für jede gesuchte Tabelle ausführen.
Beachten Sie, dass dies kein Schema enthält.
quelle
sqlite3 Database.s3db .dump
grep -v '^CREATE'
wie in einer der anderen Antworten vorgeschlagengrep -v '^CREATE;
wird unterbrochen, wenn dieCREATE
Anweisungen Zeilenumbrüche enthalten (was manchmal der Fall ist). Das Beste, IMO, ist, dieCREATE
Anweisungen nicht automatisch zu entfernen , sondern manuell zu bearbeiten. Verwenden Sie einfach den gewünschten Texteditor und suchen SieCREATE
diese Anweisungen und entfernen Sie sie manuell. Solange die Datenbank nicht riesig ist (und da Sie SQLite verwenden, würde ich vermuten, dass es ein Hinweis ist), ist dies ziemlich einfach.Sie können ein oder mehrere Tabellenargumente für den Spezialbefehl .dump angeben, z
sqlite3 db ".dump 'table1' 'table2'"
.quelle
sqlite3 3.31.1 (2020/01/27)
. Das Changelog sagt nichts darüber aus. (Funktioniert übrigens,--preserve-rowids
ist aber überhaupt nicht dokumentiert.)Jede Antwort, die vorschlägt, grep zu verwenden, um die
CREATE
Zeilen auszuschließen oder nur dieINSERT
Zeilen aus dersqlite3 $DB .dump
Ausgabe zu übernehmen, schlägt fehl. In denCREATE TABLE
Befehlen wird eine Spalte pro Zeile aufgelistet (sodass beim AusschließenCREATE
nicht alleINSERT
Spalten angezeigt werden ), und Werte in den Zeilen können eingebettete Zeilenumbrüche enthalten (sodass Sie nicht nur dieINSERT
Zeilen erfassen können ).Getestet auf sqlite3 Version 3.6.20.
Wenn Sie bestimmte Tabellen ausschließen möchten, können Sie sie filtern
$(sqlite $DB .tables | grep -v -e one -e two -e three)
, oder wenn Sie eine bestimmte Teilmenge erhalten möchten, ersetzen Sie diese durchone two three
.quelle
Als Verbesserung der Antwort von Paul Egan kann dies wie folgt erreicht werden:
--oder--
Die Einschränkung ist natürlich, dass Sie grep installiert haben müssen.
quelle
cat database.sql | grep '^INSERT' > database_inserts.sql
grep '^CREATE'
grep '^INSERT' < database.sql > database_inserts.sql
dascat
ist überflüssigcat
Ausführung kostet im Grunde nichts und macht die Input-Kette viel klarer. Natürlich können Sie auch schreiben,< database.sql grep '^INSERT' ...
aber eine explizite Pipe ist viel einfacher zu lesen.In Python oder Java oder einer anderen Hochsprache funktioniert der .dump nicht. Wir müssen die Konvertierung in CSV von Hand codieren. Ich gebe ein Python-Beispiel. Andere, Beispiele wären willkommen:
Wenn Sie Paneldaten haben, mit anderen Worten, fügen viele einzelne Einträge mit IDs diese dem with look hinzu und es werden auch zusammenfassende Statistiken ausgegeben:
quelle
Gemäß der SQLite-Dokumentation für die Befehlszeilen-Shell Für SQLite können Sie eine SQLite-Tabelle (oder einen Teil einer Tabelle) als CSV exportieren, indem Sie einfach den "Modus" auf "csv" setzen und dann eine Abfrage ausführen, um die gewünschten Zeilen von zu extrahieren Der Tisch:
Verwenden Sie dann den Befehl ".import", um CSV-Daten (Comma Separated Value) in eine SQLite-Tabelle zu importieren:
Bitte lesen Sie die weitere Dokumentation zu den beiden zu berücksichtigenden Fällen: (1) Tabelle "tab1" existiert bisher nicht und (2) Tabelle "tab1" existiert bereits.
quelle
Die beste Methode wäre, den Code zu verwenden, den der sqlite3-Datenbankspeicherauszug ausführen würde, ausgenommen Schemateile.
Beispiel Pseudocode:
Sehen:
src/shell.c:838
(für sqlite-3.5.9) für den tatsächlichen CodeSie können sogar einfach diese Shell nehmen und die Schemateile auskommentieren und diese verwenden.
quelle
Überprüfung anderer möglicher Lösungen
Schließen Sie nur INSERTs ein
Einfach zu implementieren, schlägt jedoch fehl, wenn eine Ihrer Spalten neue Zeilen enthält
SQLite-Einfügemodus
Dies ist eine nette und anpassbare Lösung, die jedoch nicht funktioniert, wenn Ihre Spalten Blob-Objekte wie den Typ "Geometrie" in Spatialite enthalten
Diff den Dump mit dem Schema
Ich weiß nicht warum, aber es funktioniert nicht für mich
Eine andere (neue) mögliche Lösung
Wahrscheinlich gibt es keine beste Antwort auf diese Frage, aber eine, die für mich funktioniert, ist das Grep der Einfügungen unter Berücksichtigung neuer Zeilen in den Spaltenwerten mit einem Ausdruck wie diesem
Um die Tabellen auszuwählen, die ausgegeben werden sollen, wird
.dump
ein LIKE-Argument zugelassen, das mit den Tabellennamen übereinstimmt. Wenn dies jedoch nicht ausreicht, ist wahrscheinlich ein einfaches Skript die bessere Optionoder etwas ausgefeilteres, um Fremdschlüssel zu respektieren und den gesamten Speicherauszug in nur einer Transaktion zu kapseln
Berücksichtigen Sie, dass der grep-Ausdruck fehlschlägt, wenn
);
in einer der Spalten eine Zeichenfolge vorhanden istSo stellen Sie es wieder her (in einer Datenbank mit den bereits erstellten Tabellen)
quelle
Diese Version funktioniert gut mit Zeilenumbrüchen in Beilagen:
sqlite3 database.sqlite3 .dump | grep -v '^CREATE'
In der Praxis werden alle Zeilen ausgeschlossen, mit
CREATE
denen weniger wahrscheinlich Zeilenumbrüche enthaltenquelle
Die Antwort von retracile sollte die nächstgelegene sein, funktioniert aber in meinem Fall nicht. Eine Einfügeabfrage ist gerade in der Mitte kaputt gegangen und der Export wurde gerade gestoppt. Ich bin mir nicht sicher, was der Grund ist. Es funktioniert jedoch gut während
.dump
.Schließlich schrieb ich ein Tool für die Aufteilung der SQL generiert aus
.dump
:https://github.com/motherapp/sqlite_sql_parser/
quelle
Sie können in den Tabellen nach jedem Feld Kommas einfügen, um eine CSV zu erstellen, oder ein GUI-Tool verwenden, um alle Daten zurückzugeben und in einer CSV zu speichern.
quelle