---
title: "PostgreSQL zu SQLite migrieren, im Browser"
description: "Migriere eine PostgreSQL-Datenbank zu SQLite: Eine pg_dump-Datei wird ein Skript mit denselben Tabellen, Schlüsseln und Daten, plus Bericht über jede Änderung."
canonical: https://intosql.com/de/postgresql-in-sqlite
last_updated: 2026-10-15
---

# PostgreSQL zu SQLite migrieren, im Browser

Leg einen einfachen Dump aus pg_dump oder pg_dumpall ab, als .sql oder .sql.gz, und lade ein SQLite-Skript mit denselben Tabellen, Schlüsseln, Indizes und Daten herunter. Jeder Wert, den SQLite nicht unverändert aufnehmen kann, und jedes Objekt, das es nicht übernimmt, steht im Bericht.

[Leitfaden: PostgreSQL zu SQLite migrieren](https://intosql.com/docs/migrations/postgresql-to-sqlite)

[Datentypen von PostgreSQL zu SQLite](https://intosql.com/docs/types/postgresql-to-sqlite)

## Was sich von PostgreSQL zu SQLite ändert

Jede Zeile ist eine Regel, die der Konverter anwendet, mit der Berichtszeile, die er schreibt, wenn die Regel etwas an deinen Daten ändert.

| In PostgreSQL | In SQLite | Berichtszeile |
| --- | --- | --- |
| boolean | INTEGER 0 oder 1 mit einem CHECK |  |
| varchar(n), char(n), text | VARCHAR(n) und TEXT, nicht erzwungen |  |
| numeric(p,s) past 15 digits and numeric without a precision | TEXT | `decimal_as_text` |
| money | NUMERIC | `type_replaced` |
| interval | TEXT mit dem Text von PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | TEXT mit einem JSON-Array | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | TEXT mit dem Text von PostgreSQL | `type_replaced` |
| json, jsonb | TEXT |  |
| timestamp | DATETIME als ISO-8601-Text |  |
| timestamp with time zone | TIMESTAMP als ISO-8601-Text in UTC | `moments_as_utc` |
| time | TIME als Text |  |
| 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 entfernt | `not_null_relaxed` |
| enum types | TEXT mit einem CHECK seiner Labels |  |
| enum columns holding values outside their labels | TEXT ohne CHECK | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | TEXT |  |
| bytea | BLOB |  |
| bit(n), bit varying | INTEGER mit dem Wert der Bits bis 63 Bit; darüber Ziffern in TEXT |  |
| oid, xid, cid | INTEGER mit einem CHECK gegen negative Werte |  |
| citext and nondeterministic collations | exakter Vergleich | `case_insensitive_collation` |
| serial, identity | INTEGER PRIMARY KEY AUTOINCREMENT, weiter nach der höchsten ID |  |
| serial and identity columns that aren't the whole primary key | INTEGER ohne Zähler | `counter_dropped` |
| sequences not owned by a column | nicht angelegt | `sequence_not_converted` |
| generated columns | GENERATED ALWAYS AS, STORED oder VIRTUAL wie in der Quelle |  |
| generated columns with functions SQLite lacks | eine normale Spalte mit den Werten | `generated_not_translated` |
| defaults with functions SQLite lacks, and defaults from a sequence | kein Standardwert | `default_not_translated` |
| CHECK constraints | übersetzt, inline in CREATE TABLE |  |
| CHECK constraints with functions SQLite lacks | nicht angelegt | `check_skipped` |
| CHECK ... NOT VALID | nicht angelegt | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes | nicht angelegt | `index_skipped` |
| foreign keys | in CREATE TABLE, ungeprüft geladen, dann mit PRAGMA foreign_key_check aufgelistet |  |
| foreign keys to tables the dump doesn't create | nicht angelegt | `foreign_key_skipped` |
| partitioned tables | eine Tabelle mit den Zeilen aller Partitionen | `partitions_dropped` |
| schemas | eine Datei, jede Tabelle mit dem Namen ihres Schemas vorangestellt | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | im Bericht aufgeführt | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | Typen aus den Werten gelesen | `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 | die fehlerhaften Bytes als Ersatzzeichen | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | unverändert kopiert | `mojibake_suspected` |

## Das Skript in SQLite laden

Das Skript legt die Tabellen an, kopiert die Zeilen und fügt dann Schlüssel, Indizes und Fremdschlüssel hinzu, so lädt es schnell und hält beim ersten Fehler an.

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

Fremdschlüssel werden in jeder Tabelle deklariert, und die Zeilen laden mit ausgeschalteter Fremdschlüsselprüfung. Danach listet das Skript jede Zeile auf, die auf eine nicht vorhandene Zeile verweist, statt auf halbem Weg abzubrechen.

Lade einen großen Dump in eine neue Datei auf einer lokalen Festplatte. Das Skript lädt alles in einer Transaktion ohne Synchronisierung, so läuft es mit Festplattengeschwindigkeit, und ein abgebrochenes Laden hinterlässt keine halben Tabellen.

Die Kommandozeile lädt die Datei direkt in eine SQLite-Datenbank, ohne ein Skript zu schreiben. Das ist kostenlos.

## Den PostgreSQL-Dump für das beste Ergebnis erstellen

Der Konverter liest, was der Dump enthält. Mit diesen Optionen bleibt mehr von deinen Daten darin:

- --format=plain, die Standardeinstellung von pg_dump, schreibt SQL. Ein custom- oder directory-Archiv (-Fc, -Fd) wird mit pg_restore -f dump.sql zu SQL, ohne Datenbankserver.
- --no-owner --no-privileges lassen Rollen und Rechte weg, die der Konverter ohnehin überspringt, daher wird der Dump kleiner.
- pg_dumpall schreibt jede Datenbank in eine Datei; die Tabellen jeder Datenbank werden nach ihr benannt, damit nichts kollidiert.

## Was nicht konvertiert wird

Sichten, materialisierte Sichten, Funktionen, Prozeduren, Trigger, Regeln, Zeilensicherheitsrichtlinien, Erweiterungen und Typen sind in der eigenen Sprache von PostgreSQL geschrieben. Sie stehen mit Namen im Bericht und werden nie stillschweigend weggelassen, damit du sie für SQLite neu schreiben kannst.

## Fragen zu PostgreSQL zu SQLite

### Wird mein Dump hochgeladen?

Nein. Der Konverter läuft in deinem Browser und liest den Dump stückweise von deiner Festplatte, daher verlässt er nie deinen Computer. Die Desktop-App und die Kommandozeile konvertieren ebenfalls auf deinem Computer.

### Wie groß darf der Dump sein?

Der Konverter hält nie den ganzen Dump im Speicher: Er liest die Datei zweimal, in Abschnitten, und schreibt das Skript fortlaufend. Dumps von mehreren Gigabyte werden im Browser, in der Desktop-App und mit der Kommandozeile konvertiert.

### Liest es pg_dump -Fc-Archive?

Nicht direkt: Ein custom-Archiv ist ein Binärformat. pg_restore -f dump.sql dump.backup wandelt es in das einfache SQL um, das der Konverter liest, ohne Verbindung zu einem Server. Der Konverter sagt das, wenn er ein Archiv bekommt.

### Aus welchen PostgreSQL-Versionen kann der Dump stammen?

Dumps aus pg_dump und pg_dumpall ab PostgreSQL 10, mit COPY- oder INSERT-Zeilen. Jeder Test-Dump stammt aus PostgreSQL 13 und 18 und wird Zelle für Zelle mit seiner Quelle verglichen.

### Bleiben serial- und Identity-Werte erhalten?

Eine serial- oder Identity-Spalte, die den ganzen Primärschlüssel der Tabelle bildet, wird INTEGER PRIMARY KEY AUTOINCREMENT, jede Zeile behält ihre ID, und die nächste ID macht nach der höchsten weiter. Jede andere behält ihre Werte ohne Zähler, und der Bericht sagt es.

### Was passiert mit Arrays, enums und anderen PostgreSQL-Typen?

Arrays werden JSON-Arrays, Booleans 0 und 1, enums Text mit einem CHECK ihrer Labels und Zeitstempel mit Zeitzone UTC-Text. Breite numerics bleiben als Text exakt. Ranges, geometrische Typen und zusammengesetzte Typen behalten den Text von PostgreSQL.

### Was ist mit Funktionen, Triggern und Sichten?

Sie stehen mit Namen im Bericht und werden nicht konvertiert, weil jede Datenbank sie in ihrer eigenen Sprache schreibt.

### Auf welchen SQLite-Versionen lädt das Skript?

SQLite 3.31 und neuer. Jeder Test-Dump lädt auf 3.31 und 3.54 und hält beim ersten Fehler an, falls etwas schiefgeht.

## Aus PostgreSQL

- [PostgreSQL zu PostgreSQL](https://intosql.com/de/postgresql-in-postgresql)
- [PostgreSQL zu MySQL](https://intosql.com/de/postgresql-in-mysql)
- [PostgreSQL zu MariaDB](https://intosql.com/de/postgresql-in-mariadb)
- [PostgreSQL zu SQL Server](https://intosql.com/de/postgresql-in-sql-server)
- [PostgreSQL zu Oracle](https://intosql.com/de/postgresql-in-oracle)

## Nach SQLite

- [MySQL zu SQLite](https://intosql.com/de/mysql-in-sqlite)
- [MariaDB zu SQLite](https://intosql.com/de/mariadb-in-sqlite)
- [SQL Server zu SQLite](https://intosql.com/de/sql-server-in-sqlite)
- [SQLite zu SQLite](https://intosql.com/de/sqlite-in-sqlite)
- [Oracle zu SQLite](https://intosql.com/de/oracle-in-sqlite)

## Leitfaden und alle Paare

- [SQLite zu PostgreSQL](https://intosql.com/de/sqlite-in-postgresql)
- [Leitfaden: PostgreSQL zu SQLite migrieren](https://intosql.com/docs/migrations/postgresql-to-sqlite)
- [Datentypen von PostgreSQL zu SQLite](https://intosql.com/docs/types/postgresql-to-sqlite)
- [Alle Datenbankpaare](https://intosql.com/de/datenbankmigration)
