PRAGMA table_info în SQLite

PRAGMA și configurare SQLite 3.0.0 (pragma_table_info() din 3.16.0)

Afișează coloanele unui tabel: poziția, numele, tipul declarat, NOT NULL, valoarea implicită și cheia primară.

Sintaxă
PRAGMA table_info(tabel);
PRAGMA table_xinfo(tabel);
SELECT * FROM pragma_table_info('tabel');

Ce face PRAGMA table_info

SQLite nu are DESCRIBE ca MySQL. Structura unui tabel o afli cu PRAGMA table_info(tabel), care întoarce câte un rând pe coloană: cid (poziția, de la 0), name, type (tipul scris în CREATE TABLE), notnull, dflt_value și pk (poziția în cheia primară, 0 dacă nu face parte din ea).

PRAGMA table_xinfo arată în plus coloanele ascunse și coloanele generate, cu o coloană hidden (2 = generată virtual, 3 = generată stocat).

Fiecare pragma care întoarce date are și o formă de funcție-tabel: pragma_table_info('tabel'). Pe ea poți pune WHERE, JOIN sau ORDER BY, de exemplu ca să listezi coloanele tuturor tabelelor dintr-o bază.

Parametri

Parametru Descriere
tabel Numele tabelului (sau al vederii). Opțional cu schema: main.produse.

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 REAL DEFAULT 0,
  stoc INTEGER,
  valoare REAL GENERATED ALWAYS AS (pret * stoc)
);
CREATE TABLE clienti (id INTEGER PRIMARY KEY, nume TEXT, oras TEXT DEFAULT 'Iași');

Exemplul 1: Coloanele unui tabel

Coloana generată valoare nu apare în table_info.

PRAGMA table_info(produse);

Rezultat

╭─────┬──────┬─────────┬─────────┬────────────┬────╮
│ cid │ name │  type   │ notnull │ dflt_value │ pk │
╞═════╪══════╪═════════╪═════════╪════════════╪════╡
│   0 │ id   │ INTEGER │       0 │            │  1 │
│   1 │ nume │ TEXT    │       1 │            │  0 │
│   2 │ pret │ REAL    │       0 │ 0          │  0 │
│   3 │ stoc │ INTEGER │       0 │            │  0 │
╰─────┴──────┴─────────┴─────────┴────────────┴────╯

Exemplul 2: Cu coloanele generate

table_xinfo include și coloana generată, marcată cu hidden = 2 (virtuală).

PRAGMA table_xinfo(produse);

Rezultat

╭─────┬─────────┬─────────┬─────────┬────────────┬────┬────────╮
│ cid │  name   │  type   │ notnull │ dflt_value │ pk │ hidden │
╞═════╪═════════╪═════════╪═════════╪════════════╪════╪════════╡
│   0 │ id      │ INTEGER │       0 │            │  1 │      0 │
│   1 │ nume    │ TEXT    │       1 │            │  0 │      0 │
│   2 │ pret    │ REAL    │       0 │ 0          │  0 │      0 │
│   3 │ stoc    │ INTEGER │       0 │            │  0 │      0 │
│   4 │ valoare │ REAL    │       0 │            │  0 │      2 │
╰─────┴─────────┴─────────┴─────────┴────────────┴────┴────────╯

Exemplul 3: Coloanele tuturor tabelelor, cu SQL obișnuit

Funcția-tabel pragma_table_info() se poate lega cu sqlite_schema, tabelul care listează obiectele bazei.

SELECT t.name AS tabel, c.name AS coloana, c.type AS tip
FROM sqlite_schema t
JOIN pragma_table_info(t.name) c
WHERE t.type = 'table'
ORDER BY t.name, c.cid;

Rezultat

╭─────────┬─────────┬─────────╮
│  tabel  │ coloana │   tip   │
╞═════════╪═════════╪═════════╡
│ clienti │ id      │ INTEGER │
│ clienti │ nume    │ TEXT    │
│ clienti │ oras    │ TEXT    │
│ produse │ id      │ INTEGER │
│ produse │ nume    │ TEXT    │
│ produse │ pret    │ REAL    │
│ produse │ stoc    │ INTEGER │
╰─────────┴─────────┴─────────╯

Greșeli frecvente

  • Te bazezi pe coloana type ca pe tipul real al datelor. Este doar textul declarat; într-un tabel care nu e STRICT, coloana poate conține valori de alte tipuri. Tipul unei valori îl afli cu typeof().
  • Scrii PRAGMA table_info('produse') cu un nume greșit și nu primești nicio eroare: pentru un tabel inexistent, pragma întoarce zero rânduri.

Comenzi înrudite

  • .schema: Afișează instrucțiunile CREATE pentru tabelele, indexurile, vederile și declanșatorii din bază, exact cum au fost scrise.
  • .tables: Afișează numele tabelelor și vederilor din baza de date deschisă, eventual doar pe cele care se potrivesc cu un tipar LIKE.
  • CREATE TABLE: Creează un tabel nou. În SQLite tipul coloanei este opțional și doar sugerează cum se salvează valorile.
  • Afinitatea tipurilor și typeof(): În SQLite tipul aparține valorii, nu coloanei. Afinitatea coloanei doar încearcă să convertească valorile la inserare.
  • Coloane generate (GENERATED ALWAYS AS): O coloană a cărei valoare este calculată automat dintr-o expresie peste celelalte coloane ale rândului, la citire sau la scriere.