---
title: "Migrer une base PostgreSQL vers SQLite"
description: "Migrez une base PostgreSQL vers SQLite : convertissez un fichier pg_dump en script avec les mêmes tables, clés et données, et un rapport de chaque changement."
canonical: https://intosql.com/fr/postgresql-en-sqlite
last_updated: 2026-10-15
---

# Migrer une base PostgreSQL vers 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.

[Guide de migration de PostgreSQL vers SQLite](https://intosql.com/docs/migrations/postgresql-to-sqlite)

[Types de données de PostgreSQL vers SQLite](https://intosql.com/docs/types/postgresql-to-sqlite)

## 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.

| Dans PostgreSQL | Dans SQLite | Ligne du rapport |
| --- | --- | --- |
| boolean | INTEGER 0 ou 1 avec un CHECK |  |
| varchar(n), char(n), text | VARCHAR(n) et TEXT, non appliqués |  |
| numeric(p,s) past 15 digits and numeric without a precision | TEXT | `decimal_as_text` |
| money | NUMERIC | `type_replaced` |
| interval | TEXT avec le texte de PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | TEXT avec un tableau JSON | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | TEXT avec le texte de PostgreSQL | `type_replaced` |
| json, jsonb | TEXT |  |
| timestamp | DATETIME en texte ISO 8601 |  |
| timestamp with time zone | TIMESTAMP en texte ISO 8601 en UTC | `moments_as_utc` |
| time | TIME en texte |  |
| infinity, -infinity and BC dates | NULL | `date_out_of_range` |
| NaN and Infinity in numeric, real and double precision | NULL | `invalid_value_null` |
| NOT NULL columns with values that become NULL | NOT NULL retiré | `not_null_relaxed` |
| enum types | TEXT avec un CHECK de ses libellés |  |
| enum columns holding values outside their labels | TEXT sans CHECK | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | TEXT |  |
| bytea | BLOB |  |
| bit(n), bit varying | INTEGER avec la valeur des bits jusqu'à 63 bits ; chiffres TEXT au-delà |  |
| oid, xid, cid | INTEGER avec un CHECK qui interdit les négatifs |  |
| citext and nondeterministic collations | comparaison exacte | `case_insensitive_collation` |
| serial, identity | INTEGER PRIMARY KEY AUTOINCREMENT, qui reprend après l'identifiant le plus élevé |  |
| serial and identity columns that aren't the whole primary key | INTEGER sans compteur | `counter_dropped` |
| sequences not owned by a column | non créée | `sequence_not_converted` |
| generated columns | GENERATED ALWAYS AS, STORED ou VIRTUAL comme dans la source |  |
| generated columns with functions SQLite lacks | une colonne simple avec les valeurs | `generated_not_translated` |
| defaults with functions SQLite lacks, and defaults from a sequence | aucune valeur par défaut | `default_not_translated` |
| CHECK constraints | traduites, en ligne dans CREATE TABLE |  |
| CHECK constraints with functions SQLite lacks | non créée | `check_skipped` |
| CHECK ... NOT VALID | non créée | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes | non créé | `index_skipped` |
| foreign keys | dans CREATE TABLE, chargées sans vérification, puis listées par PRAGMA foreign_key_check |  |
| foreign keys to tables the dump doesn't create | non créée | `foreign_key_skipped` |
| partitioned tables | une seule table avec les lignes de chaque partition | `partitions_dropped` |
| schemas | un seul fichier, tables préfixées par le nom de leur schéma | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | listés dans le rapport | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | types déduits des valeurs | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | TEXT | `unknown_type` |
| text that isn't valid in its encoding | les octets invalides deviennent le caractère de remplacement | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copié tel quel | `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.

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

Les 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

### 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.

## Depuis PostgreSQL

- [PostgreSQL vers PostgreSQL](https://intosql.com/fr/postgresql-en-postgresql)
- [PostgreSQL vers MySQL](https://intosql.com/fr/postgresql-en-mysql)
- [PostgreSQL vers MariaDB](https://intosql.com/fr/postgresql-en-mariadb)
- [PostgreSQL vers SQL Server](https://intosql.com/fr/postgresql-en-sql-server)
- [PostgreSQL vers Oracle](https://intosql.com/fr/postgresql-en-oracle)

## Vers SQLite

- [MySQL vers SQLite](https://intosql.com/fr/mysql-en-sqlite)
- [MariaDB vers SQLite](https://intosql.com/fr/mariadb-en-sqlite)
- [SQL Server vers SQLite](https://intosql.com/fr/sql-server-en-sqlite)
- [SQLite vers SQLite](https://intosql.com/fr/sqlite-en-sqlite)
- [Oracle vers SQLite](https://intosql.com/fr/oracle-en-sqlite)

## Guide et toutes les paires

- [SQLite vers PostgreSQL](https://intosql.com/fr/sqlite-en-postgresql)
- [Guide de migration de PostgreSQL vers SQLite](https://intosql.com/docs/migrations/postgresql-to-sqlite)
- [Types de données de PostgreSQL vers SQLite](https://intosql.com/docs/types/postgresql-to-sqlite)
- [Toutes les paires de bases de données](https://intosql.com/fr/migration-de-base-de-donnees)
