Vai al contenuto
Home di IntoSQL

Converti PostgreSQL in SQLite

Trascina un dump plain di pg_dump o pg_dumpall, come .sql o .sql.gz, e scarica uno script per SQLite con le stesse tabelle, chiavi, indici e dati. Ogni valore che SQLite non può contenere così com'è, e ogni oggetto che non supporta, è elencato nel report.

Il tuo file
sqlshop_2024_postgres.sqlFile di esempio, 6,2 kB
Il tuo database

18 righe convertite, 3 correzioni, nessuna rifiutata

Mostra

Tabelle in shop_2024_postgres.sqlDump PostgreSQL 18.6 · scritto da pg_dump · utf8mb4

  • customers8 righe2
    8 colonne
    idINTEGER not null
    nameTEXT not null
    emailTEXT not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    tagsTEXT not null
    signed_upDATE
    created_atTIMESTAMP not null
  • orders10 righe1
    10 colonne
    idINTEGER not null
    customer_idINTEGER not null
    statusTEXT not null
    totalDECIMAL(10,2) not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteTEXT
    detailsTEXT
    deliveryTEXT

Non convertiti

  • Vista paid_orders

Ogni database li scrive nel proprio linguaggio. Riscrivili per SQLite.

-- Written by IntoSQL from a PostgreSQL dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;

CREATE TABLE customers ( -- People who bought at least once
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT NOT NULL,
    country VARCHAR(2) DEFAULT 'US' NOT NULL,
    is_active INTEGER DEFAULT 1 NOT NULL,
    tags TEXT NOT NULL,
    signed_up DATE,
    created_at TIMESTAMP DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now')) NOT NULL,
    CONSTRAINT customers_is_active_check CHECK (is_active IN (0, 1))
);

CREATE TABLE orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    customer_id INTEGER NOT NULL,
    status TEXT DEFAULT 'pending' NOT NULL,
    total DECIMAL(10,2) NOT NULL,
    items INTEGER DEFAULT 1 NOT NULL,
    ordered_at DATETIME NOT NULL,
    shipped_at DATETIME,
    note TEXT,
    details TEXT,
    delivery TEXT,
    CONSTRAINT orders_status_check CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled')),
    CONSTRAINT orders_orders_total_check CHECK (total >= (0)),
    CONSTRAINT orders_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customers (id)
);

INSERT INTO customers (id, name, email, country, is_active, tags, signed_up, created_at) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'["vip"]','2023-01-15','2023-01-15 10:24:00'),
(2,'Zoë Müller','zoe@example.de','DE',1,'[]','2023-02-03','2023-02-03 08:11:42'),
(3,'José Peña','jose@example.es','ES',0,'["wholesale","late payer"]','2023-03-21','2023-03-21 19:05:17'),
(4,'李雷','lilei@example.cn','CN',1,'[]','2023-05-09','2023-05-09 02:40:00'),
(5,'Noah O''Brien','noah@example.ie','IE',1,'[]',NULL,'2023-06-30 14:00:00'),
(6,'Amélie Laurent','amelie@example.fr','FR',1,'["vip"]','2024-01-02','2024-01-02 09:30:00'),
(7,'Ravi Patel','ravi@example.in','IN',0,'[]','2024-02-29','2024-02-29 23:59:59'),
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'[]','2024-04-12','2024-04-12 12:12:12');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, delivery) VALUES
(1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'{"gift": false}','1 day 06:30:00'),
(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}',NULL),
(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind',NULL,NULL),
(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','{"fragile": true}','2 days 05:50:00'),
(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice',NULL,NULL),
(6,6,'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"','{"fragile": true}','20:00:00'),
(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,NULL,NULL),
(8,2,'shipped',19.99,1,'2024-03-12 08:00:00',NULL,'Shipped date set to infinity by an old import',NULL,NULL),
(9,3,'shipped',64.00,2,'2024-03-14 15:30:00','2024-03-15 10:00:00','Two parcels','{"parcels": [1, 2]}','18:30:00'),
(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf',NULL,NULL);

-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE UNIQUE INDEX customers_customers_email_key ON customers (email);
CREATE INDEX orders_idx_orders_customer ON orders (customer_id);
CREATE INDEX orders_idx_orders_status_date ON orders (status, ordered_at);
UPDATE sqlite_sequence SET seq = max(seq, 1000) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 1000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
UPDATE sqlite_sequence SET seq = max(seq, 5000) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 5000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
COMMIT;

-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;

Correzioni

  1. "created_at" di customers contiene istanti con fuso orario; SQLite non ha un tipo che lo conservi, quindi sono salvati in UTC come TIMESTAMP.
  2. "tags" di customers è text[], che SQLite non ha, quindi è TEXT con gli stessi valori.
  3. "delivery" di orders è interval, che SQLite non ha, quindi è TEXT con gli stessi valori.

Da controllare

  • 1 vista, trigger, routine o evento non è convertito; il report li elenca uno per uno. Ricreali a mano in SQLite.
  • Il valore predefinito di "tags" in customers non si può scrivere per SQLite (a value its type can't hold), quindi la colonna non ha un valore predefinito. Aggiungi a mano il valore predefinito se le nuove righe ne hanno bisogno.
  • L'indice idx_orders_details su orders usa un'espressione che non si può scrivere per SQLite (a gin index), quindi non viene creato. Crea l'indice a mano se le query ne hanno bisogno.
  • 1 valore in "shipped_at" di orders è una data che SQLite non può salvare, come infinity, quindi è NULL. SQLite salva gli anni dall'1 al 9999 senza infinito; sostituisci quelle date nella sorgente se contano.

Il tuo file viene convertito su questo computer e non viene mai caricato.

Altri esempi:

Cosa cambia da PostgreSQL a SQLite

Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.

  • boolean

    INTEGER 0 o 1 con un CHECK

    SQLite non ha un tipo booleano; i suoi true e false sono 1 e 0.

  • varchar(n), char(n), text

    VARCHAR(n) e TEXT, non applicati

    SQLite mantiene il tipo dichiarato perché gli strumenti lo leggano, ma non limita la lunghezza.

  • numeric(p,s) past 15 digits and numeric without a precision

    TEXT

    SQLite conserva circa 15 cifre significative in un numero. I numeri più ampi restano testo così ogni cifra resta esatta.

    Riga del report: decimal_as_text

  • money

    NUMERIC

    SQLite non ha un tipo money. L'importo resta un numero, senza il simbolo di valuta aggiunto dal locale del server.

    Riga del report: type_replaced

  • interval

    TEXT con il testo di PostgreSQL

    SQLite non ha un tipo interval; il testo mantiene ogni parte.

    Riga del report: type_replaced

  • arrays (integer[], text[]...)

    TEXT con un array JSON

    SQLite non ha array. Un array JSON mantiene ogni elemento e i NULL, e le funzioni JSON di SQLite lo leggono.

    Riga del report: type_replaced

  • ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types

    TEXT con il testo di PostgreSQL

    SQLite non ha un tipo equivalente, quindi ogni valore mantiene il testo scritto da PostgreSQL.

    Riga del report: type_replaced

  • json, jsonb

    TEXT

    Le funzioni JSON di SQLite leggono il JSON dal testo.

  • timestamp

    DATETIME come testo ISO 8601

    SQLite salva le date come testo che le sue funzioni di data leggono.

  • timestamp with time zone

    TIMESTAMP come testo ISO 8601 in UTC

    SQLite non ha un tipo che conservi un offset, quindi ogni istante è scritto in UTC: lo stesso istante qualunque offset abbia scritto il dump.

    Riga del report: moments_as_utc

  • time

    TIME come testo

    SQLite salva gli orari come testo, 24:00:00 incluso.

  • infinity, -infinity and BC dates

    NULL

    Le funzioni di data di SQLite leggono gli anni da 0 a 9999 senza infinito. Quei valori diventano NULL e il report li conta.

    Riga del report: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    SQLite salva NaN come NULL e il suo infinito non sopravvive in ogni strumento, quindi quei valori diventano NULL e il report li conta.

    Riga del report: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL rimosso

    Una colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.

    Riga del report: not_null_relaxed

  • enum types

    TEXT con un CHECK delle sue etichette

    Il testo con un vincolo CHECK mantiene gli stessi valori.

  • enum columns holding values outside their labels

    TEXT senza CHECK

    I valori che le etichette non nominano violerebbero il vincolo CHECK, quindi il vincolo non viene creato.

    Riga del report: enum_check_skipped

  • uuid, inet, cidr, macaddr

    TEXT

    SQLite non ha questi tipi; il testo mantiene ogni valore.

  • bytea

    BLOB

    I byte restano byte.

  • bit(n), bit varying

    INTEGER con il valore dei bit fino a 63 bit; cifre TEXT oltre

    Una stringa di bit viene salvata come il numero formato dai suoi bit, finché entra in un intero con segno.

  • oid, xid, cid

    INTEGER con un CHECK che non sia negativo

    Gli interi a 64 bit di SQLite contengono ogni valore.

  • citext and nondeterministic collations

    confronto esatto

    SQLite confronta il testo in modo esatto salvo indicazione diversa, e il suo NOCASE ignora le maiuscole solo per le lettere ASCII.

    Riga del report: case_insensitive_collation

  • serial, identity

    INTEGER PRIMARY KEY AUTOINCREMENT, che riparte dopo l'id più alto

    SQLite conta una chiave primaria intera di tipo intero, e AUTOINCREMENT evita che gli id vengano riusati, come fa una sequenza.

  • serial and identity columns that aren't the whole primary key

    INTEGER senza contatore

    SQLite conta solo una colonna che è l'intera chiave primaria, quindi la colonna mantiene i suoi valori e le nuove righe devono avere i loro.

    Riga del report: counter_dropped

  • sequences not owned by a column

    non creato

    SQLite non ha sequenze.

    Riga del report: sequence_not_converted

  • generated columns

    GENERATED ALWAYS AS, STORED o VIRTUAL come nella sorgente

    SQLite dalla 3.31 calcola le colonne generate negli stessi due modi.

  • generated columns with functions SQLite lacks

    una colonna semplice con i valori

    Una formula che non si può scrivere per SQLite lascia una colonna semplice con i valori del dump e una riga nel report.

    Riga del report: generated_not_translated

  • defaults with functions SQLite lacks, and defaults from a sequence

    nessun valore predefinito

    Un valore predefinito che non si può scrivere per SQLite viene omesso e segnalato.

    Riga del report: default_not_translated

  • CHECK constraints

    tradotti, dentro CREATE TABLE

    SQLite accetta i vincoli CHECK solo in CREATE TABLE.

  • CHECK constraints with functions SQLite lacks

    non creato

    Un vincolo CHECK che non si può scrivere per SQLite viene omesso e segnalato.

    Riga del report: check_skipped

  • CHECK ... NOT VALID

    non creato

    PostgreSQL non ha mai verificato le righe che c'erano prima, e SQLite le verificherebbe durante il caricamento.

    Riga del report: check_not_valid

  • gin, gist, brin and hash indexes, partial and expression indexes

    non creato

    IntoSQL scrive indici b-tree su colonne per SQLite; ricrea gli altri dopo il caricamento.

    Riga del report: index_skipped

  • foreign keys

    in CREATE TABLE, caricate senza controllo, poi elencate da PRAGMA foreign_key_check

    SQLite accetta le chiavi esterne solo in CREATE TABLE e le verifica solo con PRAGMA foreign_keys attivo. Le righe si caricano senza controllo e lo script finisce elencando ogni riga senza padre.

  • foreign keys to tables the dump doesn't create

    non creato

    Una chiave non può riferirsi a una tabella che non c'è.

    Riga del report: foreign_key_skipped

  • partitioned tables

    una tabella con le righe di ogni partizione

    Le righe sono le stesse.

    Riga del report: partitions_dropped

  • schemas

    un file, tabelle con il nome del loro schema davanti

    Un file SQLite è un solo database, quindi il nome dello schema separa le tabelle con lo stesso nome; le tabelle in public mantengono il loro nome.

    Riga del report: schemas_merged

  • views, functions, procedures, triggers, rules, policies, extensions and types

    elencati nel report

    Il loro codice è scritto nel linguaggio di PostgreSQL, quindi vengono elencati perché tu li ricrei.

    Riga del report: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    tipi ricavati dai valori

    Un dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.

    Riga del report: no_schema

  • expressions in INSERT values

    NULL

    Un convertitore che non esegue un database non può valutarle.

    Riga del report: expression_value

  • types IntoSQL doesn't know

    TEXT

    Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.

    Riga del report: unknown_type

  • text that isn't valid in its encoding

    i byte errati come carattere di sostituzione

    Il testo di SQLite è UTF-8.

    Riga del report: invalid_utf8_replaced

  • text decoded twice (ñ)

    copiato così com'è

    Il dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.

    Riga del report: mojibake_suspected

In PostgreSQLIn SQLiteRiga del report
booleanINTEGER 0 o 1 con un CHECKSQLite non ha un tipo booleano; i suoi true e false sono 1 e 0.
varchar(n), char(n), textVARCHAR(n) e TEXT, non applicatiSQLite mantiene il tipo dichiarato perché gli strumenti lo leggano, ma non limita la lunghezza.
numeric(p,s) past 15 digits and numeric without a precisionTEXTSQLite conserva circa 15 cifre significative in un numero. I numeri più ampi restano testo così ogni cifra resta esatta.decimal_as_text
moneyNUMERICSQLite non ha un tipo money. L'importo resta un numero, senza il simbolo di valuta aggiunto dal locale del server.type_replaced
intervalTEXT con il testo di PostgreSQLSQLite non ha un tipo interval; il testo mantiene ogni parte.type_replaced
arrays (integer[], text[]...)TEXT con un array JSONSQLite non ha array. Un array JSON mantiene ogni elemento e i NULL, e le funzioni JSON di SQLite lo leggono.type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesTEXT con il testo di PostgreSQLSQLite non ha un tipo equivalente, quindi ogni valore mantiene il testo scritto da PostgreSQL.type_replaced
json, jsonbTEXTLe funzioni JSON di SQLite leggono il JSON dal testo.
timestampDATETIME come testo ISO 8601SQLite salva le date come testo che le sue funzioni di data leggono.
timestamp with time zoneTIMESTAMP come testo ISO 8601 in UTCSQLite non ha un tipo che conservi un offset, quindi ogni istante è scritto in UTC: lo stesso istante qualunque offset abbia scritto il dump.moments_as_utc
timeTIME come testoSQLite salva gli orari come testo, 24:00:00 incluso.
infinity, -infinity and BC datesNULLLe funzioni di data di SQLite leggono gli anni da 0 a 9999 senza infinito. Quei valori diventano NULL e il report li conta.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLSQLite salva NaN come NULL e il suo infinito non sopravvive in ogni strumento, quindi quei valori diventano NULL e il report li conta.invalid_value_null
NOT NULL columns with values that become NULLNOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.not_null_relaxed
enum typesTEXT con un CHECK delle sue etichetteIl testo con un vincolo CHECK mantiene gli stessi valori.
enum columns holding values outside their labelsTEXT senza CHECKI valori che le etichette non nominano violerebbero il vincolo CHECK, quindi il vincolo non viene creato.enum_check_skipped
uuid, inet, cidr, macaddrTEXTSQLite non ha questi tipi; il testo mantiene ogni valore.
byteaBLOBI byte restano byte.
bit(n), bit varyingINTEGER con il valore dei bit fino a 63 bit; cifre TEXT oltreUna stringa di bit viene salvata come il numero formato dai suoi bit, finché entra in un intero con segno.
oid, xid, cidINTEGER con un CHECK che non sia negativoGli interi a 64 bit di SQLite contengono ogni valore.
citext and nondeterministic collationsconfronto esattoSQLite confronta il testo in modo esatto salvo indicazione diversa, e il suo NOCASE ignora le maiuscole solo per le lettere ASCII.case_insensitive_collation
serial, identityINTEGER PRIMARY KEY AUTOINCREMENT, che riparte dopo l'id più altoSQLite conta una chiave primaria intera di tipo intero, e AUTOINCREMENT evita che gli id vengano riusati, come fa una sequenza.
serial and identity columns that aren't the whole primary keyINTEGER senza contatoreSQLite conta solo una colonna che è l'intera chiave primaria, quindi la colonna mantiene i suoi valori e le nuove righe devono avere i loro.counter_dropped
sequences not owned by a columnnon creatoSQLite non ha sequenze.sequence_not_converted
generated columnsGENERATED ALWAYS AS, STORED o VIRTUAL come nella sorgenteSQLite dalla 3.31 calcola le colonne generate negli stessi due modi.
generated columns with functions SQLite lacksuna colonna semplice con i valoriUna formula che non si può scrivere per SQLite lascia una colonna semplice con i valori del dump e una riga nel report.generated_not_translated
defaults with functions SQLite lacks, and defaults from a sequencenessun valore predefinitoUn valore predefinito che non si può scrivere per SQLite viene omesso e segnalato.default_not_translated
CHECK constraintstradotti, dentro CREATE TABLESQLite accetta i vincoli CHECK solo in CREATE TABLE.
CHECK constraints with functions SQLite lacksnon creatoUn vincolo CHECK che non si può scrivere per SQLite viene omesso e segnalato.check_skipped
CHECK ... NOT VALIDnon creatoPostgreSQL non ha mai verificato le righe che c'erano prima, e SQLite le verificherebbe durante il caricamento.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexesnon creatoIntoSQL scrive indici b-tree su colonne per SQLite; ricrea gli altri dopo il caricamento.index_skipped
foreign keysin CREATE TABLE, caricate senza controllo, poi elencate da PRAGMA foreign_key_checkSQLite accetta le chiavi esterne solo in CREATE TABLE e le verifica solo con PRAGMA foreign_keys attivo. Le righe si caricano senza controllo e lo script finisce elencando ogni riga senza padre.
foreign keys to tables the dump doesn't createnon creatoUna chiave non può riferirsi a una tabella che non c'è.foreign_key_skipped
partitioned tablesuna tabella con le righe di ogni partizioneLe righe sono le stesse.partitions_dropped
schemasun file, tabelle con il nome del loro schema davantiUn file SQLite è un solo database, quindi il nome dello schema separa le tabelle con lo stesso nome; le tabelle in public mantengono il loro nome.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typeselencati nel reportIl loro codice è scritto nel linguaggio di PostgreSQL, quindi vengono elencati perché tu li ricrei.not_converted_objects
dumps without CREATE TABLE (--data-only)tipi ricavati dai valoriUn dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.no_schema
expressions in INSERT valuesNULLUn convertitore che non esegue un database non può valutarle.expression_value
types IntoSQL doesn't knowTEXTIl testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.unknown_type
text that isn't valid in its encodingi byte errati come carattere di sostituzioneIl testo di SQLite è UTF-8.invalid_utf8_replaced
text decoded twice (ñ)copiato così com'èIl dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.mojibake_suspected

Carica lo script in SQLite

Lo script crea le tabelle, copia le righe, poi aggiunge chiavi, indici e chiavi esterne, così si carica in fretta e si ferma al primo errore.

sqlite3 -bail mydb.sqlite < postgresql.sqlite.sql

Le chiavi esterne sono dichiarate in ogni tabella e le righe si caricano con i controlli delle chiavi esterne disattivati. Lo script poi elenca ogni riga che punta a una riga che non esiste, invece di fallire a metà.

Per un dump grande, carica in un file nuovo su un disco locale. Lo script carica tutto in un'unica transazione con la sincronizzazione disattivata, così va alla velocità del disco, e un caricamento che si ferma a metà non lascia tabelle parziali.

La riga di comando carica il file direttamente in un database SQLite, senza scrivere uno script. È gratis.

Fai il dump di PostgreSQL per il miglior risultato

Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:

  • --format=plain, il default di pg_dump, scrive SQL. Un archivio custom o directory (-Fc, -Fd) diventa SQL con pg_restore -f dump.sql, senza un server di database.
  • --no-owner --no-privileges escludono ruoli e permessi, che il convertitore comunque salta, così il dump è più piccolo.
  • pg_dumpall esporta ogni database in un solo file; le tabelle di ognuno hanno il suo nome davanti, così niente entra in conflitto.

Cosa non viene convertito

Viste, viste materializzate, funzioni, procedure, trigger, regole, policy di sicurezza a livello di riga, estensioni e tipi sono scritti nel linguaggio di PostgreSQL. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per SQLite.

Domande sulla conversione da PostgreSQL a SQLite

Non trovi la risposta? Scrivici dalla pagina dei contatti e ti risponde una persona. Pagina dei contatti

Il mio dump viene caricato?

No. Il convertitore funziona nel tuo browser e legge il dump dal tuo disco a pezzi, quindi non lascia mai il tuo computer. Anche l'app desktop e la riga di comando convertono sul tuo computer.

Quanto può essere grande il dump?

Il convertitore non tiene mai l'intero dump in memoria: legge il file due volte, per intervalli, e scrive lo script man mano. I dump di più gigabyte si convertono nel browser, nell'app desktop e con la riga di comando.

Legge gli archivi pg_dump -Fc?

Non direttamente: un archivio custom è un formato binario. pg_restore -f dump.sql dump.backup lo trasforma nel SQL plain che il convertitore legge, senza connettersi a un server. Il convertitore lo dice quando riceve un archivio.

Da quali versioni di PostgreSQL può provenire il dump?

Dump scritti da pg_dump e pg_dumpall da PostgreSQL 10 in poi, con righe COPY o INSERT. Ogni dump di test viene da PostgreSQL 13 e 18 ed è confrontato con la sorgente cella per cella.

I valori serial e identity vengono mantenuti?

Una colonna serial o identity che è l'intera chiave primaria della tabella diventa INTEGER PRIMARY KEY AUTOINCREMENT, ogni riga mantiene il suo id e l'id successivo riparte dopo il più alto. Ogni altra mantiene i suoi valori senza contatore, e il report lo dice.

Cosa succede ad array, enum e altri tipi di PostgreSQL?

Gli array diventano array JSON, i booleani 0 e 1, gli enum testo con un CHECK delle etichette, e i timestamp con fuso orario testo in UTC. I numeric ampi restano esatti come testo. Range, tipi geometrici e tipi composti mantengono il testo di PostgreSQL.

E funzioni, trigger e viste?

Sono elencati per nome nel report e non vengono convertiti, perché ogni database li scrive nel proprio linguaggio.

Su quali versioni di SQLite si carica lo script?

SQLite 3.31 e successive. Ogni dump di test si carica su 3.31 e 3.54, fermandosi al primo errore se qualcosa va storto.