Porta un dump PostgreSQL su un PostgreSQL più vecchio o più recente
Trascina un dump in testo semplice di pg_dump o pg_dumpall, come .sql o .sql.gz, e scarica uno script che si carica su PostgreSQL da 13 a 18, qualunque versione abbia scritto il dump. Identity, enum, array e jsonb restano come sono, i tipi portati da un'estensione diventano testo, e ogni modifica è elencata nel report.
18 righe convertite, nessuna correzione, nessuna rifiutata
Tabelle in shop_2024_postgres.sqlDump PostgreSQL 18.6 · scritto da pg_dump · utf8mb4
customers8 righe
8 colonne id integer not null name text not null email text not null country varchar(2) not null is_active boolean not null tags text[] not null signed_up date created_at timestamptz(6) not null orders10 righe
10 colonne id integer not null customer_id integer not null status order_status not null total numeric(10,2) not null items smallint not null ordered_at timestamp(6) not null shipped_at timestamp(6) note text details jsonb delivery interval
Non convertiti
- Vista paid_orders
Ogni database li scrive nel proprio linguaggio. Riscrivili per PostgreSQL.
-- Written by IntoSQL from a PostgreSQL dump. Load it with: psql -v ON_ERROR_STOP=1 -f <file>
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET synchronous_commit = off;
SET maintenance_work_mem = '512MB';
CREATE TYPE order_status AS ENUM ('pending', 'paid', 'shipped', 'cancelled');
CREATE TABLE customers (
id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
name text NOT NULL,
email text NOT NULL,
country varchar(2) DEFAULT 'US' NOT NULL,
is_active boolean DEFAULT true NOT NULL,
tags text[] DEFAULT '{}' NOT NULL,
signed_up date,
created_at timestamptz(6) DEFAULT CURRENT_TIMESTAMP NOT NULL
);
CREATE TABLE orders (
id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
customer_id integer NOT NULL,
status order_status DEFAULT 'pending' NOT NULL,
total numeric(10,2) NOT NULL,
items smallint DEFAULT 1 NOT NULL,
ordered_at timestamp(6) NOT NULL,
shipped_at timestamp(6),
note text,
details jsonb,
delivery interval,
CONSTRAINT orders_total_check CHECK (total >= (0))
);
COPY customers (id, name, email, country, is_active, tags, signed_up, created_at) FROM stdin;
1 Ana Martínez ana@example.com MX t {vip} 2023-01-15 2023-01-15 10:24:00+00
2 Zoë Müller zoe@example.de DE t {} 2023-02-03 2023-02-03 08:11:42+00
3 José Peña jose@example.es ES f {wholesale,"late payer"} 2023-03-21 2023-03-21 19:05:17+00
4 李雷 lilei@example.cn CN t {} 2023-05-09 2023-05-09 02:40:00+00
5 Noah O'Brien noah@example.ie IE t {} \N 2023-06-30 14:00:00+00
6 Amélie Laurent amelie@example.fr FR t {vip} 2024-01-02 2024-01-02 09:30:00+00
7 Ravi Patel ravi@example.in IN f {} 2024-02-29 2024-02-29 23:59:59+00
8 Sofia Rossi 🌻 sofia@example.it IT t {} 2024-04-12 2024-04-12 12:12:12+00
\.
COPY orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, delivery) FROM stdin;
1 1 shipped 129.90 3 2024-03-01 10:00:00 2024-03-02 16:30:00 \N {"gift": false} 1 day 06:30:00
2 2 paid 54.00 1 2024-03-02 11:15:00 \N Gift wrap 🎁 {"gift": true, "wrap": "red"} \N
3 1 cancelled 12.50 1 2024-03-03 09:45:00 \N Customer changed their mind \N \N
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 \N Leave at the door; ring twice \N \N
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 \N \N \N \N
8 2 shipped 19.99 1 2024-03-12 08:00:00 infinity Shipped date set to infinity by an old import \N \N
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 \N C:\\Users\\ravi\\invoice.pdf \N \N
\.
-- Keys, indexes and constraints, after the rows so each builds once.
CREATE UNIQUE INDEX customers_email_key ON customers (email);
CREATE UNIQUE INDEX customers_pkey ON customers (id);
CREATE UNIQUE INDEX orders_pkey ON orders (id);
CREATE INDEX idx_orders_customer ON orders (customer_id);
CREATE INDEX idx_orders_status_date ON orders (status, ordered_at);
ALTER TABLE customers ADD CONSTRAINT customers_email_key UNIQUE USING INDEX customers_email_key;
ALTER TABLE customers ADD CONSTRAINT customers_pkey PRIMARY KEY USING INDEX customers_pkey;
ALTER TABLE orders ADD CONSTRAINT orders_pkey PRIMARY KEY USING INDEX orders_pkey;
ALTER TABLE orders ADD CONSTRAINT orders_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customers (id) NOT VALID;
DO $f$ BEGIN
ALTER TABLE orders VALIDATE CONSTRAINT orders_customer_id_fkey;
EXCEPTION WHEN foreign_key_violation THEN
RAISE WARNING 'foreign key % has rows without a parent: it stays NOT VALID, and new rows are checked', 'orders_customer_id_fkey';
END $f$;
SELECT setval(pg_get_serial_sequence('customers', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM customers)::numeric, 0) + 1, 1001), 2147483647)::bigint, false);
COMMENT ON TABLE customers IS 'People who bought at least once';
SELECT setval(pg_get_serial_sequence('orders', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM orders)::numeric, 0) + 1, 5001), 2147483647)::bigint, false);
Correzioni
Non c'era niente da correggere.
Da controllare
- 1 vista, trigger, routine o evento non è convertito; il report li elenca uno per uno. Ricreali a mano in PostgreSQL.
- L'indice idx_orders_details su orders usa un'espressione che non si può scrivere per PostgreSQL (a gin index), quindi non viene creato. Crea l'indice a mano se le query ne hanno bisogno.
Il tuo file viene convertito su questo computer e non viene mai caricato.
Altri esempi:
Cosa cambia tra il file e lo script
Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.
varchar(n), char(n), text
gli stessi tipi
Gli stessi tipi, con le stesse lunghezze.
numeric(p,s), numeric without a precision, NaN and Infinity
gli stessi tipi e valori
Lo stesso tipo: ogni cifra viene copiata come l'ha scritta il dump.
money
numeric(19,2)
Il formato di money dipende da lc_monetary del server, quindi l'importo resta un numero senza simbolo di valuta, e si carica con qualsiasi locale di destinazione.
Riga del report: type_replaced
enum types
gli stessi tipi enum, creati prima delle tabelle
Le etichette mantengono il loro ordine.
enum columns holding values outside their labels
text senza CHECK
Il tipo rifiuterebbe quei valori, quindi la colonna è testo e li mantiene tutti.
Riga del report: enum_check_skipped
composite and range types the dump defines, extension types (citext, hstore, ltree, PostGIS) and multiranges
text con il testo di PostgreSQL
Lo script non crea né estensioni né tipi composti, quindi ogni valore mantiene il testo scritto da PostgreSQL; crea il tipo e modifica la colonna dopo il caricamento.
Riga del report: type_replaced
citext
text, confrontato in modo esatto
Lo script non crea l'estensione citext, quindi queste colonne confrontano il testo in modo esatto; creala e ripristina le colonne dopo il caricamento.
Riga del report: case_insensitive_collation
json, jsonb
gli stessi tipi
json mantiene il testo come scritto; jsonb mantiene i valori come li ha normalizzati il server.
timestamp with time zone
timestamptz, gli stessi istanti
Ogni valore mantiene l'offset scritto dal dump, quindi l'istante è lo stesso in qualsiasi fuso orario.
time, time with time zone
gli stessi tipi
Gli stessi tipi, 24:00:00 incluso.
infinity, -infinity and BC dates
mantenuto
PostgreSQL li contiene così come sono.
NaN and Infinity in numeric, real and double precision
mantenuto
PostgreSQL li contiene così come sono.
generated columns
le stesse colonne generate
La stessa formula, calcolata dalla destinazione.
generated columns with functions IntoSQL doesn't write
una colonna semplice con i valori
Una formula che IntoSQL non sa scrivere lascia una colonna semplice con i valori del dump e una riga nel report.
Riga del report: generated_not_translated
defaults with functions IntoSQL doesn't write
nessun valore predefinito
Un valore predefinito che IntoSQL non sa scrivere viene omesso e segnalato.
Riga del report: default_not_translated
CHECK constraints with functions IntoSQL doesn't write
non creato
Un vincolo CHECK che IntoSQL non sa scrivere viene omesso e segnalato.
Riga del report: check_skipped
CHECK ... NOT VALID
aggiunto NOT VALID dopo le righe
Le righe che c'erano prima non sono mai state verificate, quindi il vincolo CHECK viene aggiunto dopo di loro, ancora non valido.
gin, gist, brin and hash indexes, partial and expression indexes
non creato
IntoSQL scrive indici b-tree su colonne; ricrea gli altri dopo il caricamento.
Riga del report: index_skipped
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
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
partitioned tables
una tabella con le righe di ogni partizione
Le righe sono le stesse; partiziona di nuovo la tabella se serve.
Riga del report: partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and types other than enums
elencati nel report
IntoSQL converte le tabelle e le loro righe; il resto viene elencato perché tu lo 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 PostgreSQL deve essere UTF-8 valido.
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
| Nel file | Nello script | Riga del report |
|---|---|---|
| varchar(n), char(n), text | gli stessi tipiGli stessi tipi, con le stesse lunghezze. | |
| numeric(p,s), numeric without a precision, NaN and Infinity | gli stessi tipi e valoriLo stesso tipo: ogni cifra viene copiata come l'ha scritta il dump. | |
| money | numeric(19,2)Il formato di money dipende da lc_monetary del server, quindi l'importo resta un numero senza simbolo di valuta, e si carica con qualsiasi locale di destinazione. | type_replaced |
| enum types | gli stessi tipi enum, creati prima delle tabelleLe etichette mantengono il loro ordine. | |
| enum columns holding values outside their labels | text senza CHECKIl tipo rifiuterebbe quei valori, quindi la colonna è testo e li mantiene tutti. | enum_check_skipped |
| composite and range types the dump defines, extension types (citext, hstore, ltree, PostGIS) and multiranges | text con il testo di PostgreSQLLo script non crea né estensioni né tipi composti, quindi ogni valore mantiene il testo scritto da PostgreSQL; crea il tipo e modifica la colonna dopo il caricamento. | type_replaced |
| citext | text, confrontato in modo esattoLo script non crea l'estensione citext, quindi queste colonne confrontano il testo in modo esatto; creala e ripristina le colonne dopo il caricamento. | case_insensitive_collation |
| json, jsonb | gli stessi tipijson mantiene il testo come scritto; jsonb mantiene i valori come li ha normalizzati il server. | |
| timestamp with time zone | timestamptz, gli stessi istantiOgni valore mantiene l'offset scritto dal dump, quindi l'istante è lo stesso in qualsiasi fuso orario. | |
| time, time with time zone | gli stessi tipiGli stessi tipi, 24:00:00 incluso. | |
| infinity, -infinity and BC dates | mantenutoPostgreSQL li contiene così come sono. | |
| NaN and Infinity in numeric, real and double precision | mantenutoPostgreSQL li contiene così come sono. | |
| generated columns | le stesse colonne generateLa stessa formula, calcolata dalla destinazione. | |
| generated columns with functions IntoSQL doesn't write | una colonna semplice con i valoriUna formula che IntoSQL non sa scrivere lascia una colonna semplice con i valori del dump e una riga nel report. | generated_not_translated |
| defaults with functions IntoSQL doesn't write | nessun valore predefinitoUn valore predefinito che IntoSQL non sa scrivere viene omesso e segnalato. | default_not_translated |
| CHECK constraints with functions IntoSQL doesn't write | non creatoUn vincolo CHECK che IntoSQL non sa scrivere viene omesso e segnalato. | check_skipped |
| CHECK ... NOT VALID | aggiunto NOT VALID dopo le righeLe righe che c'erano prima non sono mai state verificate, quindi il vincolo CHECK viene aggiunto dopo di loro, ancora non valido. | |
| gin, gist, brin and hash indexes, partial and expression indexes | non creatoIntoSQL scrive indici b-tree su colonne; ricrea gli altri dopo il caricamento. | index_skipped |
| foreign keys to tables the dump doesn't create | non creatoUna chiave non può riferirsi a una tabella che non c'è. | foreign_key_skipped |
| 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 |
| partitioned tables | una tabella con le righe di ogni partizioneLe righe sono le stesse; partiziona di nuovo la tabella se serve. | partitions_dropped |
| views, functions, procedures, triggers, rules, policies, extensions and types other than enums | elencati nel reportIntoSQL converte le tabelle e le loro righe; il resto viene elencato perché tu lo 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 PostgreSQL deve essere UTF-8 valido. | 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 PostgreSQL
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.
psql -v ON_ERROR_STOP=1 -d mydb -f postgresql.postgresql.sqlLe chiavi esterne vengono aggiunte come NOT VALID e poi validate. Se una riga punta a una riga che non esiste, lo script ti dice quale vincolo, invece di fallire a metà.
Per un dump grande, crea prima il database ed esegui lo script con psql dalla stessa macchina del server.
IntoSQL Pro carica il file direttamente in PostgreSQL dall'app desktop o dalla riga di comando, senza scrivere uno script.
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, trigger, procedure, funzioni e altri oggetti scritti nel linguaggio di PostgreSQL sono elencati per nome nel report, mai eliminati in silenzio, così puoi verificare ognuno con la versione di PostgreSQL in cui carichi prima di ricrearlo.
Domande sul passaggio di PostgreSQL tra versioni
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?
Sì. Le colonne serial e identity restano colonne identity, ogni riga mantiene il suo id e ogni contatore riparte dal valore che la sequenza del dump aveva raggiunto.
Cosa succede ad array, enum e altri tipi di PostgreSQL?
Restano come sono: array, range, json e jsonb, stringhe di bit, money a parte. I tipi enum vengono ricreati con le loro etichette. I tipi portati da un'estensione (citext, hstore, PostGIS) e i tipi composti diventano testo, e il report dice quali colonne.
E funzioni, trigger e viste?
Sono elencati per nome nel report e non vengono convertiti, così puoi ricrearli una volta caricate le tabelle. I CHECK NOT VALID vengono aggiunti dopo le righe, ancora non validi.
Su quali versioni di PostgreSQL si carica lo script?
PostgreSQL dalla 13 alla 18, qualunque versione abbia scritto il dump. Lo stesso script si carica su ognuna, fermandosi al primo errore se qualcosa va storto.