.dump în SQLite

Linia de comandă sqlite3 sqlite3 (toate versiunile 3.x)

Scrie toată baza de date (sau doar unele tabele) ca instrucțiuni SQL, bune pentru backup, transfer sau control al versiunilor.

Sintaxă
.dump
.dump TABEL
.dump --data-only TABEL

Ce face .dump

.dump transformă conținutul bazei într-un script SQL: instrucțiunile CREATE pentru structură și câte un INSERT pentru fiecare rând, într-o tranzacție. Rulând scriptul într-o bază goală obții o copie identică.

Cu un argument (tipar LIKE), primești doar tabelele potrivite. --data-only păstrează doar instrucțiunile INSERT, util când structura există deja. Rezultatul este text, deci îl poți compara cu diff sau păstra în Git.

Din terminal, backup-ul complet se face într-o singură linie: sqlite3 magazin.db .dump > backup.sql, iar restaurarea cu sqlite3 nou.db < backup.sql. Pentru o copie binară exactă a unei baze mari, .backup și VACUUM INTO sunt mai rapide.

Parametri

Parametru Descriere
TABEL Opțional. Tabelele de exportat, ca tipar LIKE.
--data-only Doar INSERT-urile, fără CREATE.
--preserve-rowids Păstrează valorile rowid și pentru tabelele fără INTEGER PRIMARY KEY.

Ce returnează

Un script SQL, ca text.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE produse (id INTEGER PRIMARY KEY, nume TEXT NOT NULL, pret INTEGER);
INSERT INTO produse (nume, pret) VALUES ('Caiet', 12), ('Pix', 4);

Exemplul 1: Toată baza ca SQL

PRAGMA foreign_keys=OFF la început lasă tabelele să fie create în orice ordine, iar BEGIN TRANSACTION … COMMIT face restaurarea rapidă și completă.

.dump

Rezultat

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE produse (id INTEGER PRIMARY KEY, nume TEXT NOT NULL, pret INTEGER);
INSERT INTO produse VALUES(1,'Caiet',12);
INSERT INTO produse VALUES(2,'Pix',4);
COMMIT;

Exemplul 2: Doar datele

.dump --data-only produse

Rezultat

INSERT INTO produse VALUES(1,'Caiet',12);
INSERT INTO produse VALUES(2,'Pix',4);

Exemplul 3: Backup într-un fișier și restaurare în altă bază

.output trimite dump-ul în copie.sql. Apoi .open deschide o bază nouă, goală, iar .read rulează scriptul în ea.

.output copie.sql
.dump
.output stdout

.open nou.db
.read copie.sql
SELECT * FROM produse;

Rezultat

╭────┬───────┬──────╮
│ id │ nume  │ pret │
╞════╪═══════╪══════╡
│  1 │ Caiet │   12 │
│  2 │ Pix   │    4 │
╰────┴───────┴──────╯

Greșeli frecvente

  • Copiezi fișierul .db în timp ce aplicația scrie în el. Poți obține o copie coruptă sau incompletă; folosește .dump, .backup sau VACUUM INTO, care citesc baza într-o tranzacție.
  • Restaurezi dump-ul într-o bază care are deja tabelele. CREATE TABLE dă eroare; folosește o bază goală sau --data-only.
  • Uiți .output stdout după .output fisier: tot ce urmează ajunge în fișier, nu pe ecran.

Comenzi înrudite

  • .read: Rulează instrucțiunile SQL (și comenzile cu punct) dintr-un fișier, ca și cum le-ai fi scris de la tastatură.
  • .open: Închide baza curentă și deschide (sau creează) alt fișier de bază de date, fără să ieși din sqlite3.
  • VACUUM: Reconstruiește fișierul bazei de date: eliberează spațiul rămas după ștergeri și, cu INTO, face o copie compactă.
  • .mode și .headers: Alege cum afișează sqlite3 rezultatele: tabel cu chenar, CSV, JSON, Markdown, câte o coloană pe rând; .headers pornește antetul.