Ce face .import
.import citește un fișier text (de obicei CSV) și pune fiecare rând într-un tabel. Opțiunea --csv spune că fișierul folosește virgula și ghilimelele după regulile CSV; fără ea, sqlite3 folosește separatorul modului de afișare curent.
Comportamentul depinde de existența tabelului. Dacă tabelul nu există, .import îl creează, iar primul rând din fișier dă numele coloanelor. Dacă tabelul există, toate rândurile, inclusiv primul, sunt date; antetul se sare cu --skip 1.
Când tabelul este creat de .import, în sqlite3 3.54 coloanele primesc tipul ANY. Într-un tabel obișnuit acesta are afinitate NUMERIC, așa că textele care arată ca numere sunt salvate ca numere. Dacă vrei tipuri precise și constrângeri, creează tabelul cu CREATE TABLE înainte de import.
Parametri
| Parametru | Descriere |
|---|---|
FISIER |
Calea fișierului de importat. Dacă începe cu |, este o comandă a cărei ieșire se importă. |
TABEL |
Tabelul în care intră datele; este creat dacă nu există. |
--csv |
Citește fișierul ca CSV (virgulă, ghilimele). |
--skip N |
Sare primele N rânduri (de obicei antetul). |
--schema NUME |
Importă într-un tabel din altă bază atașată, de exemplu temp. |
Exemple
Exemplul 1: Import într-un tabel nou
Fișierul orase.csv este creat chiar în exemplu: .output trimite textul lui .print în fișier, iar .output stdout revine la ecran. Tabelul orase nu există, deci primul rând devine numele coloanelor.
.output orase.csv
.print nume,judet,populatie
.print Iași,Iași,271692
.print Cluj-Napoca,Cluj,286598
.print Brașov,Brașov,237589
.output stdout
.import --csv orase.csv orase
.schema orase
SELECT nume, populatie, typeof(populatie) AS tip
FROM orase
ORDER BY populatie DESC;
Rezultat
CREATE TABLE "orase"(
"nume" ANY, "judet" ANY, "populatie" ANY);
╭─────────────┬───────────┬─────────╮
│ nume │ populatie │ tip │
╞═════════════╪═══════════╪═════════╡
│ Cluj-Napoca │ 286598 │ integer │
│ Iași │ 271692 │ integer │
│ Brașov │ 237589 │ integer │
╰─────────────┴───────────┴─────────╯
Exemplul 2: Import într-un tabel creat de tine, fără antet
Tabelul există și are tipuri clare, deci sărim primul rând al fișierului cu --skip 1. .mode csv și .once creează fișierul dintr-un SELECT: un mod simplu de a exporta un tabel în CSV.
.mode csv
.headers on
.once note.csv
SELECT 'Ana' AS elev, 9 AS nota UNION ALL SELECT 'Mihai', 7;
.mode box
.headers on
CREATE TABLE note (elev TEXT NOT NULL, nota INTEGER CHECK (nota BETWEEN 1 AND 10));
.import --csv --skip 1 note.csv note
SELECT * FROM note;
Rezultat
╭───────┬──────╮
│ elev │ nota │
╞═══════╪══════╡
│ Ana │ 9 │
│ Mihai │ 7 │
╰───────┴──────╯
Exemplul 3: Ce se întâmplă dacă uiți –skip
Tabelul există, deci și rândul de antet este luat drept date: apare un elev numit „elev”, cu nota „nota”. Coloana are tipul INTEGER, dar textul 'nota' nu poate fi transformat în număr, așa că SQLite îl salvează ca text. De aceea e bine să verifici datele după import, de exemplu cu typeof().
.output note.csv
.print elev,nota
.print Ana,9
.output stdout
CREATE TABLE note (elev TEXT, nota INTEGER);
.import --csv note.csv note
SELECT elev, nota, typeof(nota) AS tip FROM note;
Rezultat
╭──────┬──────┬─────────╮
│ elev │ nota │ tip │
╞══════╪══════╪═════════╡
│ elev │ nota │ text │
│ Ana │ 9 │ integer │
╰──────┴──────┴─────────╯
Greșeli frecvente
- Importi într-un tabel existent fără
--skip 1și te trezești cu antetul printre date. - Uiți
--csvși fișierul este citit cu separatorul modului curent (implicit|): tot rândul ajunge într-o singură coloană. - Lași
.importsă creeze tabelul și apoi te miri că lipsesc cheia primară și constrângerile. Pentru date reale, scrie întâiCREATE TABLE. - Fișierul CSV are alt separator (punct și virgulă, obișnuit în Excel în română). Setează separatorul înainte, între ghilimele:
.separator ";", și importă fără--csv, sau salvează fișierul cu virgulă.
Comenzi înrudite
.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..read: Rulează instrucțiunile SQL (și comenzile cu punct) dintr-un fișier, ca și cum le-ai fi scris de la tastatură.Afinitatea tipurilor și typeof(): În SQLite tipul aparține valorii, nu coloanei. Afinitatea coloanei doar încearcă să convertească valorile la inserare.CREATE TABLE: Creează un tabel nou. În SQLite tipul coloanei este opțional și doar sugerează cum se salvează valorile.Tabele STRICT: Un tabel STRICT verifică tipul fiecărei valori la scriere și refuză, cu eroare, valorile care nu se potrivesc cu coloana.