Jak zrzucić dane i tylko dane, a nie schemat, niektórych tabel SQLite3 bazy danych (nie wszystkich tabel)? Zrzut powinien mieć format SQL, ponieważ powinien być później łatwo ponownie wprowadzony do bazy danych i powinien zostać wykonany z wiersza poleceń. Coś jak
sqlite3 db .dump
ale bez zrzucania schematu i wybierania tabel, które należy zrzucić.
Odpowiedzi:
Nie mówisz, co chcesz zrobić z plikiem zrzuconym.
Korzystam z poniższych, aby uzyskać plik CSV, który mogę zaimportować do prawie wszystkiego
Jeśli chcesz ponownie wstawić do innej bazy danych SQLite:
źródło
Można to zrobić, uzyskując różnicę w poleceniach .schema i .dump. na przykład z grep:
data.sql
plik będzie zawierał tylko dane bez schematu, coś takiego:Mam nadzieję, że to Ci pomoże.
źródło
sqlite3 some.db < data.sql
sqlite3 storage/db/jobs.s3db .schema jobs > schema.sql
nie działa, aleecho '.schema' jobs | sqlite3 storage/db/jobs.s3db > schema.sql
działa dobrze);
, a grep usuwa wszystkie linie zawierające);
Dodanie-x
opcji grep rozwiązuje ten problem.Nie najlepszy sposób, ale w dzierżawie nie potrzebuje zewnętrznych narzędzi (oprócz grep, który i tak jest standardem w * nix boxach)
ale musisz wykonać to polecenie dla każdej tabeli, której szukasz.
Pamiętaj, że nie obejmuje to schematu.
źródło
sqlite3 Database.s3db .dump
grep -v '^CREATE'
jak sugerowano w jednej z pozostałych odpowiedzigrep -v '^CREATE;
spowoduje przerwanie, jeśliCREATE
instrukcje zawierają podział linii (co czasem robią). Najlepiej, IMO, wcale nie polega na automatycznym usuwaniuCREATE
instrukcji, ale na ręcznym ich edytowaniu. Wystarczy użyć dowolnego edytora tekstu, a następnie wyszukaćCREATE
i ręcznie usunąć te instrukcje. Tak długo, jak baza danych nie jest ogromna (a ponieważ używasz narzędzia sqlite, zgaduję, że jest to notatka), jest to dość proste.Możesz podać jeden lub więcej argumentów tabeli dla specjalnego polecenia .dump, np
sqlite3 db ".dump 'table1' 'table2'"
.źródło
sqlite3 3.31.1 (2020/01/27)
. Dziennik zmian nic o tym nie mówi. (Nawiasem mówiąc,--preserve-rowids
działa, ale nie jest to udokumentowane w ogóle.)Każda odpowiedź, która sugeruje użycie grep do wykluczenia
CREATE
linii lub po prostu uchwyceniaINSERT
linii zsqlite3 $DB .dump
wyjścia, zawiedzie. NaCREATE TABLE
liście Polecenia jedną kolumnę w jednej linii (a więc z wyłączeniemCREATE
nie będzie to wszystko), a wartości naINSERT
linii może mieć wbudowane znaki nowej linii (więc nie można złapać tylko teINSERT
linie).Testowane na sqlite3 wersja 3.6.20.
Jeśli chcesz wykluczyć niektóre tabele, możesz je przefiltrować
$(sqlite $DB .tables | grep -v -e one -e two -e three)
, lub jeśli chcesz uzyskać określony podzbiór, zastąp goone two three
.źródło
Jako ulepszenie odpowiedzi Paula Egana można to osiągnąć w następujący sposób:
--lub--
Zastrzeżeniem jest oczywiście to, że musisz mieć grep.
źródło
cat database.sql | grep '^INSERT' > database_inserts.sql
(to samo dla schematu, zamień nagrep '^CREATE'
grep '^INSERT' < database.sql > database_inserts.sql
żecat
jest to zbytecznecat
Kosztuje w zasadzie nic do wykonania i sprawia, że łańcuch z wejścia do wyjścia znacznie jaśniejsze. Oczywiście możesz również pisać,< database.sql grep '^INSERT' ...
ale wyraźny potok jest znacznie łatwiejszy do odczytania.W Pythonie, Javie lub innym języku wysokiego poziomu zrzut nie działa. Musimy ręcznie zakodować konwersję do CSV. Podaję przykład w języku Python. Inne, przykłady będą mile widziane:
Jeśli masz dane panelu, innymi słowy, wiele pojedynczych wpisów z identyfikatorami dodaje to do wyglądu, a także zrzuca statystyki podsumowujące:
źródło
Zgodnie z dokumentacją SQLite dla powłoki wiersza poleceń Dla SQLite możesz wyeksportować tabelę SQLite (lub jej część) jako CSV, po prostu ustawiając „tryb” na „csv”, a następnie uruchom zapytanie, aby wyodrębnić żądane wiersze stół:
Następnie użyj polecenia „.import”, aby zaimportować dane CSV (wartości oddzielone przecinkami) do tabeli SQLite:
Przeczytaj dalszą dokumentację na temat dwóch rozważanych przypadków: (1) Tabela „tab1” nie istnieje wcześniej i (2) tabela „tab1” już istnieje.
źródło
Najlepszą metodą byłoby pobranie kodu, który wykonałby zrzut bazy danych sqlite3, z wyłączeniem części schematu.
Przykład pseudo kodu:
Zobacz:
src/shell.c:838
(dla sqlite-3.5.9) dla faktycznego koduMożesz nawet wziąć tę powłokę i skomentować części schematu i użyć tego.
źródło
Przegląd innych możliwych rozwiązań
Uwzględnij tylko WSTAWKI
Łatwy do wdrożenia, ale zawiedzie, jeśli którakolwiek z kolumn zawiera nowe wiersze
Tryb wstawiania SQLite
To miłe i konfigurowalne rozwiązanie, ale nie działa, jeśli kolumny mają obiekty typu blob, takie jak „Geometry” w spatialite
Zróżnicuj zrzut ze schematem
Nie jestem pewien, dlaczego, ale nie działa dla mnie
Kolejne (nowe) możliwe rozwiązanie
Prawdopodobnie nie ma najlepszej odpowiedzi na to pytanie, ale dla mnie działające jest grep wstawki, biorąc pod uwagę, że są to nowe wiersze w wartościach kolumny z takim wyrażeniem jak to
Aby wybrać tabele, które należy zrzucić,
.dump
przyjmuje argument LIKE, aby dopasować nazwy tabel, ale jeśli to nie wystarczy, prawdopodobnie prosty skrypt jest lepszą opcjąlub coś bardziej rozbudowanego, aby uszanować klucze obce i zawrzeć cały zrzut tylko w jednej transakcji
Weź pod uwagę, że wyrażenie grep zakończy się niepowodzeniem, jeśli
);
ciąg znaków znajduje się w jednej z kolumnAby go przywrócić (w bazie danych z tabelami już utworzonymi)
źródło
Ta wersja działa dobrze z nowymi liniami wewnątrz wstawek:
sqlite3 database.sqlite3 .dump | grep -v '^CREATE'
W praktyce wyklucza wszystkie wiersze, od
CREATE
których mniej prawdopodobne jest, aby zawierały nowe wierszeźródło
Odpowiedź retracile powinna być najbliższa, ale nie działa w moim przypadku. Jedno zapytanie wstawiania właśnie pękło w środku, a eksport został zatrzymany. Nie jestem pewien, jaki jest powód. Jednak działa dobrze podczas
.dump
.W końcu napisałem narzędzie do podziału SQL wygenerowanego z
.dump
:https://github.com/motherapp/sqlite_sql_parser/
źródło
Możesz dokonać wyboru w tabelach wstawiając przecinki po każdym polu, aby utworzyć plik csv, lub użyć narzędzia GUI, aby zwrócić wszystkie dane i zapisać je w pliku csv.
źródło