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.
18 righe convertite, 3 correzioni, nessuna rifiutata
Tabelle in shop_2024_postgres.sqlDump PostgreSQL 18.6 · scritto da pg_dump · utf8mb4
customers8 righe2
8 colonne id INTEGER not null name TEXT not null email TEXT not null country VARCHAR(2) not null is_active INTEGER not null tags TEXT not null signed_up DATE created_at TIMESTAMP not null orders10 righe1
10 colonne id INTEGER not null customer_id INTEGER not null status TEXT not null total DECIMAL(10,2) not null items INTEGER not null ordered_at DATETIME not null shipped_at DATETIME note TEXT details TEXT delivery TEXT
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
- "created_at" di customers contiene istanti con fuso orario; SQLite non ha un tipo che lo conservi, quindi sono salvati in UTC come TIMESTAMP.
- "tags" di customers è text[], che SQLite non ha, quindi è TEXT con gli stessi valori.
- "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 PostgreSQL | In SQLite | Riga del report |
|---|---|---|
| boolean | INTEGER 0 o 1 con un CHECKSQLite non ha un tipo booleano; i suoi true e false sono 1 e 0. | |
| varchar(n), char(n), text | VARCHAR(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 precision | TEXTSQLite conserva circa 15 cifre significative in un numero. I numeri più ampi restano testo così ogni cifra resta esatta. | decimal_as_text |
| money | NUMERICSQLite non ha un tipo money. L'importo resta un numero, senza il simbolo di valuta aggiunto dal locale del server. | type_replaced |
| interval | TEXT 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 types | TEXT con il testo di PostgreSQLSQLite non ha un tipo equivalente, quindi ogni valore mantiene il testo scritto da PostgreSQL. | type_replaced |
| json, jsonb | TEXTLe funzioni JSON di SQLite leggono il JSON dal testo. | |
| timestamp | DATETIME come testo ISO 8601SQLite salva le date come testo che le sue funzioni di data leggono. | |
| timestamp with time zone | TIMESTAMP 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 |
| time | TIME come testoSQLite salva gli orari come testo, 24:00:00 incluso. | |
| infinity, -infinity and BC dates | NULLLe 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 precision | NULLSQLite 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 NULL | NOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe. | not_null_relaxed |
| enum types | TEXT con un CHECK delle sue etichetteIl testo con un vincolo CHECK mantiene gli stessi valori. | |
| enum columns holding values outside their labels | TEXT senza CHECKI valori che le etichette non nominano violerebbero il vincolo CHECK, quindi il vincolo non viene creato. | enum_check_skipped |
| uuid, inet, cidr, macaddr | TEXTSQLite non ha questi tipi; il testo mantiene ogni valore. | |
| bytea | BLOBI byte restano byte. | |
| bit(n), bit varying | INTEGER 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, cid | INTEGER con un CHECK che non sia negativoGli interi a 64 bit di SQLite contengono ogni valore. | |
| citext and nondeterministic collations | confronto 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, identity | INTEGER 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 key | INTEGER 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 column | non creatoSQLite non ha sequenze. | sequence_not_converted |
| generated columns | GENERATED ALWAYS AS, STORED o VIRTUAL come nella sorgenteSQLite dalla 3.31 calcola le colonne generate negli stessi due modi. | |
| generated columns with functions SQLite lacks | una 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 sequence | nessun valore predefinitoUn valore predefinito che non si può scrivere per SQLite viene omesso e segnalato. | default_not_translated |
| CHECK constraints | tradotti, dentro CREATE TABLESQLite accetta i vincoli CHECK solo in CREATE TABLE. | |
| CHECK constraints with functions SQLite lacks | non creatoUn vincolo CHECK che non si può scrivere per SQLite viene omesso e segnalato. | check_skipped |
| CHECK ... NOT VALID | non 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 indexes | non creatoIntoSQL scrive indici b-tree su colonne per SQLite; ricrea gli altri dopo il caricamento. | index_skipped |
| foreign keys | in 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 create | non creatoUna chiave non può riferirsi a una tabella che non c'è. | foreign_key_skipped |
| partitioned tables | una tabella con le righe di ogni partizioneLe righe sono le stesse. | partitions_dropped |
| schemas | un 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 types | elencati 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 values | NULLUn convertitore che non esegue un database non può valutarle. | expression_value |
| types IntoSQL doesn't know | TEXTIl testo contiene qualsiasi valore; cambia il tipo dopo il caricamento. | unknown_type |
| text that isn't valid in its encoding | i 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.sqlLe 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.