Convertir PostgreSQL en SQLite
Déposez un dump texte de pg_dump ou pg_dumpall, en .sql ou .sql.gz, et téléchargez un script SQLite avec les mêmes tables, clés, index et données. Chaque valeur que SQLite ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.
18 lignes converties, 3 corrections, aucune rejetée
Tables de shop_2024_postgres.sqlDump PostgreSQL 18.6 · écrit par pg_dump · utf8mb4
customers8 lignes2
8 colonnes 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 lignes1
10 colonnes 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 converti
- Vue paid_orders
Chaque base de données les écrit dans son propre langage. Réécrivez-les pour 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;
Corrections
- "created_at" de customers contient des instants avec fuseau horaire ; SQLite n'a aucun type qui le garde, ils sont donc stockés en UTC en TIMESTAMP.
- "tags" de customers est text[], que SQLite n'a pas ; elle est donc en TEXT avec les mêmes valeurs.
- "delivery" de orders est interval, que SQLite n'a pas ; elle est donc en TEXT avec les mêmes valeurs.
À vérifier
- 1 objet non converti (vues, déclencheurs, routines ou événements) ; le rapport les liste un par un. Recréez-les à la main dans SQLite.
- La valeur par défaut de "tags" dans customers ne peut pas être écrite pour SQLite (a value its type can't hold) ; la colonne n'a donc pas de valeur par défaut. Ajoutez la valeur par défaut à la main si les nouvelles lignes en ont besoin.
- L'index idx_orders_details sur orders utilise une expression qui ne peut pas être écrite pour SQLite (a gin index) ; il n'est donc pas créé. Créez l'index à la main si les requêtes en ont besoin.
- 1 date de "shipped_at" dans orders, que SQLite ne peut pas stocker (par exemple infinity), devient NULL. SQLite stocke les années 1 à 9999, sans infini ; remplacez ces dates dans la source si elles comptent.
Votre fichier est converti sur cet ordinateur et n'est jamais envoyé.
Autres exemples :
Ce qui change de PostgreSQL à SQLite
Chaque ligne est une règle appliquée par le convertisseur, avec la ligne de rapport qu'il écrit quand la règle change quelque chose dans vos données.
boolean
INTEGER 0 ou 1 avec un CHECK
SQLite n'a pas de type booléen ; ses propres true et false valent 1 et 0.
varchar(n), char(n), text
VARCHAR(n) et TEXT, non appliqués
SQLite garde le type déclaré pour les outils mais ne limite pas la longueur.
numeric(p,s) past 15 digits and numeric without a precision
TEXT
SQLite garde environ 15 chiffres significatifs dans un nombre. Les nombres plus larges sont gardés en texte pour que chaque chiffre reste exact.
Ligne du rapport: decimal_as_text
money
NUMERIC
SQLite n'a pas de type monétaire. Le montant est gardé comme nombre, sans le symbole monétaire ajouté par la locale du serveur.
Ligne du rapport: type_replaced
interval
TEXT avec le texte de PostgreSQL
SQLite n'a pas de type intervalle ; le texte en garde chaque partie.
Ligne du rapport: type_replaced
arrays (integer[], text[]...)
TEXT avec un tableau JSON
SQLite n'a pas de tableaux. Un tableau JSON garde chaque élément et NULL, et les fonctions JSON de SQLite le lisent.
Ligne du rapport: type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types
TEXT avec le texte de PostgreSQL
SQLite n'a pas de type équivalent ; chaque valeur garde donc le texte écrit par PostgreSQL.
Ligne du rapport: type_replaced
json, jsonb
TEXT
Les fonctions JSON de SQLite lisent le JSON depuis du texte.
timestamp
DATETIME en texte ISO 8601
SQLite stocke les dates en texte que ses fonctions de date savent lire.
timestamp with time zone
TIMESTAMP en texte ISO 8601 en UTC
SQLite n'a aucun type qui garde un décalage ; chaque instant est donc écrit en UTC : le même instant quel que soit le décalage écrit par le dump.
Ligne du rapport: moments_as_utc
time
TIME en texte
SQLite garde les heures en texte, 24:00:00 compris.
infinity, -infinity and BC dates
NULL
Les fonctions de date de SQLite lisent les années 0 à 9999, sans infini. Ces valeurs deviennent NULL et le rapport les compte.
Ligne du rapport: date_out_of_range
NaN and Infinity in numeric, real and double precision
NULL
SQLite stocke NaN comme NULL et son infini ne survit pas à tous les outils ; ces valeurs deviennent donc NULL et le rapport les compte.
Ligne du rapport: invalid_value_null
NOT NULL columns with values that become NULL
NOT NULL retiré
Une colonne dont des valeurs ont dû devenir NULL ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.
Ligne du rapport: not_null_relaxed
enum types
TEXT avec un CHECK de ses libellés
Un texte avec une contrainte CHECK garde les mêmes valeurs.
enum columns holding values outside their labels
TEXT sans CHECK
Les valeurs absentes des libellés feraient échouer la contrainte CHECK, qui n'est donc pas créée.
Ligne du rapport: enum_check_skipped
uuid, inet, cidr, macaddr
TEXT
SQLite n'a pas ces types ; le texte garde chaque valeur.
bytea
BLOB
Les octets restent des octets.
bit(n), bit varying
INTEGER avec la valeur des bits jusqu'à 63 bits ; chiffres TEXT au-delà
Une chaîne de bits est stockée comme le nombre que forment ses bits tant qu'il tient dans un entier signé.
oid, xid, cid
INTEGER avec un CHECK qui interdit les négatifs
Les entiers 64 bits de SQLite contiennent chaque valeur.
citext and nondeterministic collations
comparaison exacte
SQLite compare le texte exactement sauf indication contraire, et son NOCASE ne traite que les lettres ASCII.
Ligne du rapport: case_insensitive_collation
serial, identity
INTEGER PRIMARY KEY AUTOINCREMENT, qui reprend après l'identifiant le plus élevé
SQLite compte une clé primaire entière de type entier, et AUTOINCREMENT empêche de réutiliser les identifiants, comme une séquence.
serial and identity columns that aren't the whole primary key
INTEGER sans compteur
SQLite ne compte qu'une colonne qui forme toute la clé primaire ; la colonne garde donc ses valeurs et les nouvelles lignes doivent fournir les leurs.
Ligne du rapport: counter_dropped
sequences not owned by a column
non créée
SQLite n'a pas de séquences.
Ligne du rapport: sequence_not_converted
generated columns
GENERATED ALWAYS AS, STORED ou VIRTUAL comme dans la source
SQLite 3.31 et versions ultérieures calculent les colonnes générées des deux mêmes façons.
generated columns with functions SQLite lacks
une colonne simple avec les valeurs
Une formule qui ne peut pas être écrite pour SQLite laisse une colonne simple avec les valeurs du dump et une ligne dans le rapport.
Ligne du rapport: generated_not_translated
defaults with functions SQLite lacks, and defaults from a sequence
aucune valeur par défaut
Une valeur par défaut qui ne peut pas être écrite pour SQLite est omise et signalée.
Ligne du rapport: default_not_translated
CHECK constraints
traduites, en ligne dans CREATE TABLE
SQLite n'accepte les contraintes CHECK que dans CREATE TABLE.
CHECK constraints with functions SQLite lacks
non créée
Une contrainte CHECK qui ne peut pas être écrite pour SQLite est omise et signalée.
Ligne du rapport: check_skipped
CHECK ... NOT VALID
non créée
PostgreSQL n'a jamais vérifié les lignes déjà présentes, et SQLite les vérifierait au chargement.
Ligne du rapport: check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes
non créé
IntoSQL écrit des index b-tree sur des colonnes pour SQLite ; recréez les autres après le chargement.
Ligne du rapport: index_skipped
foreign keys
dans CREATE TABLE, chargées sans vérification, puis listées par PRAGMA foreign_key_check
SQLite n'accepte les clés étrangères que dans CREATE TABLE et ne les vérifie qu'avec PRAGMA foreign_keys activé. Les lignes se chargent sans vérification et le script finit en listant toute ligne sans parent.
foreign keys to tables the dump doesn't create
non créée
Une clé ne peut pas désigner une table absente.
Ligne du rapport: foreign_key_skipped
partitioned tables
une seule table avec les lignes de chaque partition
Les lignes sont les mêmes.
Ligne du rapport: partitions_dropped
schemas
un seul fichier, tables préfixées par le nom de leur schéma
Un fichier SQLite est une seule base de données ; le nom du schéma distingue donc les tables de même nom, et celles de public gardent leur nom.
Ligne du rapport: schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and types
listés dans le rapport
Leur code est écrit dans le langage de PostgreSQL ; ils sont donc listés pour que vous les recréiez.
Ligne du rapport: not_converted_objects
dumps without CREATE TABLE (--data-only)
types déduits des valeurs
Un dump de données seules ne contient que des lignes, donc les types viennent des valeurs.
Ligne du rapport: no_schema
expressions in INSERT values
NULL
Un convertisseur qui n'exécute pas de base de données ne peut pas les évaluer.
Ligne du rapport: expression_value
types IntoSQL doesn't know
TEXT
Le texte accepte toute valeur ; changez le type après le chargement.
Ligne du rapport: unknown_type
text that isn't valid in its encoding
les octets invalides deviennent le caractère de remplacement
Le texte SQLite est en UTF-8.
Ligne du rapport: invalid_utf8_replaced
text decoded twice (ñ)
copié tel quel
Le dump contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.
Ligne du rapport: mojibake_suspected
| Dans PostgreSQL | Dans SQLite | Ligne du rapport |
|---|---|---|
| boolean | INTEGER 0 ou 1 avec un CHECKSQLite n'a pas de type booléen ; ses propres true et false valent 1 et 0. | |
| varchar(n), char(n), text | VARCHAR(n) et TEXT, non appliquésSQLite garde le type déclaré pour les outils mais ne limite pas la longueur. | |
| numeric(p,s) past 15 digits and numeric without a precision | TEXTSQLite garde environ 15 chiffres significatifs dans un nombre. Les nombres plus larges sont gardés en texte pour que chaque chiffre reste exact. | decimal_as_text |
| money | NUMERICSQLite n'a pas de type monétaire. Le montant est gardé comme nombre, sans le symbole monétaire ajouté par la locale du serveur. | type_replaced |
| interval | TEXT avec le texte de PostgreSQLSQLite n'a pas de type intervalle ; le texte en garde chaque partie. | type_replaced |
| arrays (integer[], text[]...) | TEXT avec un tableau JSONSQLite n'a pas de tableaux. Un tableau JSON garde chaque élément et NULL, et les fonctions JSON de SQLite le lisent. | type_replaced |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | TEXT avec le texte de PostgreSQLSQLite n'a pas de type équivalent ; chaque valeur garde donc le texte écrit par PostgreSQL. | type_replaced |
| json, jsonb | TEXTLes fonctions JSON de SQLite lisent le JSON depuis du texte. | |
| timestamp | DATETIME en texte ISO 8601SQLite stocke les dates en texte que ses fonctions de date savent lire. | |
| timestamp with time zone | TIMESTAMP en texte ISO 8601 en UTCSQLite n'a aucun type qui garde un décalage ; chaque instant est donc écrit en UTC : le même instant quel que soit le décalage écrit par le dump. | moments_as_utc |
| time | TIME en texteSQLite garde les heures en texte, 24:00:00 compris. | |
| infinity, -infinity and BC dates | NULLLes fonctions de date de SQLite lisent les années 0 à 9999, sans infini. Ces valeurs deviennent NULL et le rapport les compte. | date_out_of_range |
| NaN and Infinity in numeric, real and double precision | NULLSQLite stocke NaN comme NULL et son infini ne survit pas à tous les outils ; ces valeurs deviennent donc NULL et le rapport les compte. | invalid_value_null |
| NOT NULL columns with values that become NULL | NOT NULL retiréUne colonne dont des valeurs ont dû devenir NULL ne peut pas garder NOT NULL, sinon le chargement s'arrêterait. | not_null_relaxed |
| enum types | TEXT avec un CHECK de ses libellésUn texte avec une contrainte CHECK garde les mêmes valeurs. | |
| enum columns holding values outside their labels | TEXT sans CHECKLes valeurs absentes des libellés feraient échouer la contrainte CHECK, qui n'est donc pas créée. | enum_check_skipped |
| uuid, inet, cidr, macaddr | TEXTSQLite n'a pas ces types ; le texte garde chaque valeur. | |
| bytea | BLOBLes octets restent des octets. | |
| bit(n), bit varying | INTEGER avec la valeur des bits jusqu'à 63 bits ; chiffres TEXT au-delàUne chaîne de bits est stockée comme le nombre que forment ses bits tant qu'il tient dans un entier signé. | |
| oid, xid, cid | INTEGER avec un CHECK qui interdit les négatifsLes entiers 64 bits de SQLite contiennent chaque valeur. | |
| citext and nondeterministic collations | comparaison exacteSQLite compare le texte exactement sauf indication contraire, et son NOCASE ne traite que les lettres ASCII. | case_insensitive_collation |
| serial, identity | INTEGER PRIMARY KEY AUTOINCREMENT, qui reprend après l'identifiant le plus élevéSQLite compte une clé primaire entière de type entier, et AUTOINCREMENT empêche de réutiliser les identifiants, comme une séquence. | |
| serial and identity columns that aren't the whole primary key | INTEGER sans compteurSQLite ne compte qu'une colonne qui forme toute la clé primaire ; la colonne garde donc ses valeurs et les nouvelles lignes doivent fournir les leurs. | counter_dropped |
| sequences not owned by a column | non crééeSQLite n'a pas de séquences. | sequence_not_converted |
| generated columns | GENERATED ALWAYS AS, STORED ou VIRTUAL comme dans la sourceSQLite 3.31 et versions ultérieures calculent les colonnes générées des deux mêmes façons. | |
| generated columns with functions SQLite lacks | une colonne simple avec les valeursUne formule qui ne peut pas être écrite pour SQLite laisse une colonne simple avec les valeurs du dump et une ligne dans le rapport. | generated_not_translated |
| defaults with functions SQLite lacks, and defaults from a sequence | aucune valeur par défautUne valeur par défaut qui ne peut pas être écrite pour SQLite est omise et signalée. | default_not_translated |
| CHECK constraints | traduites, en ligne dans CREATE TABLESQLite n'accepte les contraintes CHECK que dans CREATE TABLE. | |
| CHECK constraints with functions SQLite lacks | non crééeUne contrainte CHECK qui ne peut pas être écrite pour SQLite est omise et signalée. | check_skipped |
| CHECK ... NOT VALID | non crééePostgreSQL n'a jamais vérifié les lignes déjà présentes, et SQLite les vérifierait au chargement. | check_not_valid |
| gin, gist, brin and hash indexes, partial and expression indexes | non crééIntoSQL écrit des index b-tree sur des colonnes pour SQLite ; recréez les autres après le chargement. | index_skipped |
| foreign keys | dans CREATE TABLE, chargées sans vérification, puis listées par PRAGMA foreign_key_checkSQLite n'accepte les clés étrangères que dans CREATE TABLE et ne les vérifie qu'avec PRAGMA foreign_keys activé. Les lignes se chargent sans vérification et le script finit en listant toute ligne sans parent. | |
| foreign keys to tables the dump doesn't create | non crééeUne clé ne peut pas désigner une table absente. | foreign_key_skipped |
| partitioned tables | une seule table avec les lignes de chaque partitionLes lignes sont les mêmes. | partitions_dropped |
| schemas | un seul fichier, tables préfixées par le nom de leur schémaUn fichier SQLite est une seule base de données ; le nom du schéma distingue donc les tables de même nom, et celles de public gardent leur nom. | schemas_merged |
| views, functions, procedures, triggers, rules, policies, extensions and types | listés dans le rapportLeur code est écrit dans le langage de PostgreSQL ; ils sont donc listés pour que vous les recréiez. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | types déduits des valeursUn dump de données seules ne contient que des lignes, donc les types viennent des valeurs. | no_schema |
| expressions in INSERT values | NULLUn convertisseur qui n'exécute pas de base de données ne peut pas les évaluer. | expression_value |
| types IntoSQL doesn't know | TEXTLe texte accepte toute valeur ; changez le type après le chargement. | unknown_type |
| text that isn't valid in its encoding | les octets invalides deviennent le caractère de remplacementLe texte SQLite est en UTF-8. | invalid_utf8_replaced |
| text decoded twice (ñ) | copié tel quelLe dump contient exactement ces caractères, ils sont donc copiés ; le rapport les signale. | mojibake_suspected |
Charger le script dans SQLite
Le script crée les tables, copie les lignes, puis ajoute les clés, les index et les clés étrangères ; il se charge donc vite et s'arrête à la première erreur.
sqlite3 -bail mydb.sqlite < postgresql.sqlite.sqlLes clés étrangères sont déclarées dans chaque table et les lignes se chargent sans vérification des clés étrangères. Le script liste ensuite toute ligne qui pointe vers une ligne qui n'existe pas, au lieu d'échouer à mi-chemin.
Pour un gros dump, chargez-le dans un nouveau fichier sur un disque local. Le script charge tout dans une seule transaction sans synchronisation, il va donc à la vitesse du disque, et un chargement interrompu ne laisse aucune table partielle.
La ligne de commande charge le fichier directement dans une base SQLite, sans écrire de script. C'est gratuit.
Faire le dump PostgreSQL pour un meilleur résultat
Le convertisseur lit ce que contient le dump. Ces options y gardent davantage de vos données :
- --format=plain, le format par défaut de pg_dump, écrit du SQL. Une archive custom ou directory (-Fc, -Fd) devient du SQL avec pg_restore -f dump.sql, sans serveur de base de données.
- --no-owner --no-privileges omettent les rôles et les droits, que le convertisseur ignore de toute façon ; le dump est donc plus petit.
- pg_dumpall met toutes les bases de données dans un seul fichier ; les tables de chacune sont préfixées par son nom, donc rien n'entre en collision.
Ce qui n'est pas converti
Les vues, vues matérialisées, fonctions, procédures, déclencheurs, règles, politiques de sécurité des lignes, extensions et types sont écrits dans le langage propre à PostgreSQL. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour SQLite.
Questions sur PostgreSQL vers SQLite
Pas de réponse ici ? Écrivez-nous depuis la page de contact, une personne vous répond. Page de contact
Mon dump est-il envoyé ?
Non. Le convertisseur s'exécute dans votre navigateur et lit le dump depuis votre disque par morceaux ; il ne quitte donc jamais votre ordinateur. L'application de bureau et la ligne de commande convertissent aussi sur votre ordinateur.
Quelle taille peut avoir le dump ?
Le convertisseur ne garde jamais tout le dump en mémoire : il lit le fichier deux fois, par plages, et écrit le script au fur et à mesure. Les dumps de plusieurs gigaoctets se convertissent dans le navigateur, dans l'application de bureau et avec la ligne de commande.
Lit-il les archives pg_dump -Fc ?
Pas directement : une archive custom est un format binaire. pg_restore -f dump.sql dump.backup la transforme en SQL texte que le convertisseur lit, sans se connecter à un serveur. Le convertisseur le signale quand il reçoit une archive.
De quelles versions de PostgreSQL le dump peut-il venir ?
Les dumps écrits par pg_dump et pg_dumpall depuis PostgreSQL 10, avec des lignes COPY ou INSERT. Chaque dump de test vient de PostgreSQL 13 et 18 et est comparé à sa source cellule par cellule.
Les valeurs serial et identity sont-elles conservées ?
Une colonne serial ou identity qui forme toute la clé primaire de la table devient INTEGER PRIMARY KEY AUTOINCREMENT, chaque ligne garde son identifiant, et le prochain identifiant reprend après le plus élevé. Toute autre garde ses valeurs sans compteur, et le rapport le signale.
Que deviennent les tableaux, les enums et les autres types PostgreSQL ?
Les tableaux deviennent des tableaux JSON, les booléens 0 et 1, les enums du texte avec un CHECK de leurs libellés, et les timestamps avec fuseau horaire du texte UTC. Les numeric larges restent exacts en texte. Les plages, types géométriques et types composites gardent le texte de PostgreSQL.
Et les fonctions, les déclencheurs et les vues ?
Ils sont listés par nom dans le rapport et ne sont pas convertis, car chaque base de données les écrit dans son propre langage.
Sur quelles versions de SQLite le script se charge-t-il ?
SQLite 3.31 et versions ultérieures. Chaque dump de test se charge sur 3.31 et 3.54, et s'arrête à la première erreur en cas de problème.