Zum Inhalt springen
IntoSQL-Startseite

PostgreSQL in SQLite umwandeln

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.

Deine Datei
sqlshop_2024_postgres.sqlBeispieldatei, 6,2 kB
Deine Datenbank

18 Zeilen konvertiert, 3 Korrekturen, keine abgelehnt

Anzeigen

Tabellen in shop_2024_postgres.sqlPostgreSQL-18.6-Dump · erstellt mit pg_dump · utf8mb4

  • customers8 Zeilen2
    8 Spalten
    idINTEGER not null
    nameTEXT not null
    emailTEXT not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    tagsTEXT not null
    signed_upDATE
    created_atTIMESTAMP not null
  • orders10 Zeilen1
    10 Spalten
    idINTEGER not null
    customer_idINTEGER not null
    statusTEXT not null
    totalDECIMAL(10,2) not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteTEXT
    detailsTEXT
    deliveryTEXT

Nicht konvertiert

  • Sicht paid_orders

Jede Datenbank schreibt diese in ihrer eigenen Sprache. Schreib sie für SQLite neu.

-- 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;

Korrekturen

  1. "created_at" von customers enthält Zeitpunkte mit Zeitzone; SQLite hat keinen Typ, der eine behält, daher werden sie in UTC als TIMESTAMP gespeichert.
  2. "tags" von customers ist text[], was SQLite nicht hat, daher ist sie TEXT mit denselben Werten.
  3. "delivery" von orders ist interval, was SQLite nicht hat, daher ist sie TEXT mit denselben Werten.

Zu prüfen

  • 1 Sicht, Trigger, Routine oder Ereignis wird nicht konvertiert; der Bericht listet sie einzeln auf. Lege sie in SQLite von Hand neu an.
  • Der Standardwert von "tags" in customers lässt sich nicht für SQLite schreiben (a value its type can't hold), daher hat die Spalte keinen Standardwert. Füge den Standardwert von Hand hinzu, wenn neue Zeilen ihn brauchen.
  • Der Index idx_orders_details auf orders nutzt einen Ausdruck, der sich nicht für SQLite schreiben lässt (a gin index), daher wird er nicht angelegt. Lege den Index von Hand an, wenn Abfragen ihn brauchen.
  • 1 Wert in "shipped_at" von orders ist ein Datum, das SQLite nicht speichern kann, etwa infinity, daher ist er NULL. SQLite speichert die Jahre 1 bis 9999, ohne Unendlich; ersetze diese Datumsangaben in der Quelle, wenn sie wichtig sind.

Deine Datei wird auf diesem Computer umgewandelt und nie hochgeladen.

Weitere Beispiele:

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.

  • boolean

    INTEGER 0 oder 1 mit einem CHECK

    SQLite hat keinen booleschen Typ; sein eigenes true und false sind 1 und 0.

  • varchar(n), char(n), text

    VARCHAR(n) und TEXT, nicht erzwungen

    SQLite behält den deklarierten Typ für Werkzeuge, begrenzt aber die Länge nicht.

  • numeric(p,s) past 15 digits and numeric without a precision

    TEXT

    SQLite hält etwa 15 signifikante Stellen in einer Zahl. Breitere Zahlen bleiben Text, damit jede Stelle exakt bleibt.

    Berichtszeile: decimal_as_text

  • money

    NUMERIC

    SQLite hat keinen money-Typ. Der Betrag bleibt eine Zahl, ohne das Währungssymbol, das die Locale des Servers hinzugefügt hat.

    Berichtszeile: type_replaced

  • interval

    TEXT mit dem Text von PostgreSQL

    SQLite hat keinen interval-Typ; der Text behält jeden Teil.

    Berichtszeile: type_replaced

  • arrays (integer[], text[]...)

    TEXT mit einem JSON-Array

    SQLite hat keine Arrays. Ein JSON-Array behält jedes Element und NULL, und die JSON-Funktionen von SQLite lesen es.

    Berichtszeile: type_replaced

  • ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types

    TEXT mit dem Text von PostgreSQL

    SQLite hat keinen entsprechenden Typ, daher behält jeder Wert den Text, den PostgreSQL geschrieben hat.

    Berichtszeile: type_replaced

  • json, jsonb

    TEXT

    Die JSON-Funktionen von SQLite lesen JSON aus Text.

  • timestamp

    DATETIME als ISO-8601-Text

    SQLite speichert Datumsangaben als Text, den seine Datumsfunktionen lesen.

  • timestamp with time zone

    TIMESTAMP als ISO-8601-Text in UTC

    SQLite hat keinen Typ, der einen Versatz behält, daher wird jeder Zeitpunkt in UTC geschrieben: derselbe Zeitpunkt, welchen Versatz der Dump auch geschrieben hat.

    Berichtszeile: moments_as_utc

  • time

    TIME als Text

    SQLite speichert Zeiten als Text, einschließlich 24:00:00.

  • infinity, -infinity and BC dates

    NULL

    Die Datumsfunktionen von SQLite lesen die Jahre 0 bis 9999, ohne Unendlich. Diese Werte werden NULL, und der Bericht zählt sie.

    Berichtszeile: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    SQLite speichert NaN als NULL, und sein Unendlich übersteht nicht jedes Werkzeug, daher werden diese Werte NULL, und der Bericht zählt sie.

    Berichtszeile: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL entfernt

    Eine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.

    Berichtszeile: not_null_relaxed

  • enum types

    TEXT mit einem CHECK seiner Labels

    Text mit einer CHECK-Bedingung behält dieselben Werte.

  • enum columns holding values outside their labels

    TEXT ohne CHECK

    Werte, die nicht unter den Labels stehen, würden die CHECK-Bedingung verletzen, daher wird sie nicht angelegt.

    Berichtszeile: enum_check_skipped

  • uuid, inet, cidr, macaddr

    TEXT

    SQLite hat solche Typen nicht; der Text behält jeden Wert.

  • bytea

    BLOB

    Bytes bleiben Bytes.

  • bit(n), bit varying

    INTEGER mit dem Wert der Bits bis 63 Bit; darüber Ziffern in TEXT

    Ein Bitstring wird als die Zahl gespeichert, die seine Bits ergeben, solange sie in eine vorzeichenbehaftete Ganzzahl passt.

  • oid, xid, cid

    INTEGER mit einem CHECK gegen negative Werte

    Die 64-Bit-Ganzzahlen von SQLite fassen jeden Wert.

  • citext and nondeterministic collations

    exakter Vergleich

    SQLite vergleicht Text exakt, sofern nicht anders angegeben, und sein NOCASE gleicht nur ASCII-Buchstaben an.

    Berichtszeile: case_insensitive_collation

  • serial, identity

    INTEGER PRIMARY KEY AUTOINCREMENT, weiter nach der höchsten ID

    SQLite zählt einen ganzen ganzzahligen Primärschlüssel, und AUTOINCREMENT verhindert, dass IDs wiederverwendet werden, wie bei einer Sequenz.

  • serial and identity columns that aren't the whole primary key

    INTEGER ohne Zähler

    SQLite zählt nur eine Spalte, die den ganzen Primärschlüssel bildet, daher behält die Spalte ihre Werte, und neue Zeilen brauchen eigene.

    Berichtszeile: counter_dropped

  • sequences not owned by a column

    nicht angelegt

    SQLite hat keine Sequenzen.

    Berichtszeile: sequence_not_converted

  • generated columns

    GENERATED ALWAYS AS, STORED oder VIRTUAL wie in der Quelle

    SQLite 3.31 und neuer berechnet generierte Spalten auf dieselben zwei Arten.

  • generated columns with functions SQLite lacks

    eine normale Spalte mit den Werten

    Eine Formel, die sich nicht für SQLite schreiben lässt, hinterlässt eine normale Spalte mit den Werten des Dumps und eine Zeile im Bericht.

    Berichtszeile: generated_not_translated

  • defaults with functions SQLite lacks, and defaults from a sequence

    kein Standardwert

    Ein Standardwert, der sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: default_not_translated

  • CHECK constraints

    übersetzt, inline in CREATE TABLE

    SQLite nimmt CHECK-Bedingungen nur in CREATE TABLE an.

  • CHECK constraints with functions SQLite lacks

    nicht angelegt

    Eine CHECK-Bedingung, die sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: check_skipped

  • CHECK ... NOT VALID

    nicht angelegt

    PostgreSQL hat die vorher vorhandenen Zeilen nie geprüft, und SQLite würde sie beim Laden prüfen.

    Berichtszeile: check_not_valid

  • gin, gist, brin and hash indexes, partial and expression indexes

    nicht angelegt

    IntoSQL schreibt für SQLite B-Tree-Indizes auf Spalten; lege die anderen nach dem Laden neu an.

    Berichtszeile: index_skipped

  • foreign keys

    in CREATE TABLE, ungeprüft geladen, dann mit PRAGMA foreign_key_check aufgelistet

    SQLite nimmt Fremdschlüssel nur in CREATE TABLE an und prüft sie nur mit eingeschaltetem PRAGMA foreign_keys. Die Zeilen laden ungeprüft, und das Skript listet am Ende jede Zeile ohne Elternzeile auf.

  • foreign keys to tables the dump doesn't create

    nicht angelegt

    Ein Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt.

    Berichtszeile: foreign_key_skipped

  • partitioned tables

    eine Tabelle mit den Zeilen aller Partitionen

    Die Zeilen sind dieselben.

    Berichtszeile: partitions_dropped

  • schemas

    eine Datei, jede Tabelle mit dem Namen ihres Schemas vorangestellt

    Eine SQLite-Datei ist eine Datenbank, daher hält der Schemaname gleichnamige Tabellen auseinander; Tabellen in public behalten ihre Namen.

    Berichtszeile: schemas_merged

  • views, functions, procedures, triggers, rules, policies, extensions and types

    im Bericht aufgeführt

    Ihr Code ist in der Sprache von PostgreSQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.

    Berichtszeile: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    Typen aus den Werten gelesen

    Ein Dump nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten.

    Berichtszeile: no_schema

  • expressions in INSERT values

    NULL

    Ein Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.

    Berichtszeile: expression_value

  • types IntoSQL doesn't know

    TEXT

    Text nimmt jeden Wert auf; ändere den Typ nach dem Laden.

    Berichtszeile: unknown_type

  • text that isn't valid in its encoding

    die fehlerhaften Bytes als Ersatzzeichen

    Text in SQLite ist UTF-8.

    Berichtszeile: invalid_utf8_replaced

  • text decoded twice (ñ)

    unverändert kopiert

    Der Dump enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.

    Berichtszeile: mojibake_suspected

In PostgreSQLIn SQLiteBerichtszeile
booleanINTEGER 0 oder 1 mit einem CHECKSQLite hat keinen booleschen Typ; sein eigenes true und false sind 1 und 0.
varchar(n), char(n), textVARCHAR(n) und TEXT, nicht erzwungenSQLite behält den deklarierten Typ für Werkzeuge, begrenzt aber die Länge nicht.
numeric(p,s) past 15 digits and numeric without a precisionTEXTSQLite hält etwa 15 signifikante Stellen in einer Zahl. Breitere Zahlen bleiben Text, damit jede Stelle exakt bleibt.decimal_as_text
moneyNUMERICSQLite hat keinen money-Typ. Der Betrag bleibt eine Zahl, ohne das Währungssymbol, das die Locale des Servers hinzugefügt hat.type_replaced
intervalTEXT mit dem Text von PostgreSQLSQLite hat keinen interval-Typ; der Text behält jeden Teil.type_replaced
arrays (integer[], text[]...)TEXT mit einem JSON-ArraySQLite hat keine Arrays. Ein JSON-Array behält jedes Element und NULL, und die JSON-Funktionen von SQLite lesen es.type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesTEXT mit dem Text von PostgreSQLSQLite hat keinen entsprechenden Typ, daher behält jeder Wert den Text, den PostgreSQL geschrieben hat.type_replaced
json, jsonbTEXTDie JSON-Funktionen von SQLite lesen JSON aus Text.
timestampDATETIME als ISO-8601-TextSQLite speichert Datumsangaben als Text, den seine Datumsfunktionen lesen.
timestamp with time zoneTIMESTAMP als ISO-8601-Text in UTCSQLite hat keinen Typ, der einen Versatz behält, daher wird jeder Zeitpunkt in UTC geschrieben: derselbe Zeitpunkt, welchen Versatz der Dump auch geschrieben hat.moments_as_utc
timeTIME als TextSQLite speichert Zeiten als Text, einschließlich 24:00:00.
infinity, -infinity and BC datesNULLDie Datumsfunktionen von SQLite lesen die Jahre 0 bis 9999, ohne Unendlich. Diese Werte werden NULL, und der Bericht zählt sie.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLSQLite speichert NaN als NULL, und sein Unendlich übersteht nicht jedes Werkzeug, daher werden diese Werte NULL, und der Bericht zählt sie.invalid_value_null
NOT NULL columns with values that become NULLNOT NULL entferntEine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.not_null_relaxed
enum typesTEXT mit einem CHECK seiner LabelsText mit einer CHECK-Bedingung behält dieselben Werte.
enum columns holding values outside their labelsTEXT ohne CHECKWerte, die nicht unter den Labels stehen, würden die CHECK-Bedingung verletzen, daher wird sie nicht angelegt.enum_check_skipped
uuid, inet, cidr, macaddrTEXTSQLite hat solche Typen nicht; der Text behält jeden Wert.
byteaBLOBBytes bleiben Bytes.
bit(n), bit varyingINTEGER mit dem Wert der Bits bis 63 Bit; darüber Ziffern in TEXTEin Bitstring wird als die Zahl gespeichert, die seine Bits ergeben, solange sie in eine vorzeichenbehaftete Ganzzahl passt.
oid, xid, cidINTEGER mit einem CHECK gegen negative WerteDie 64-Bit-Ganzzahlen von SQLite fassen jeden Wert.
citext and nondeterministic collationsexakter VergleichSQLite vergleicht Text exakt, sofern nicht anders angegeben, und sein NOCASE gleicht nur ASCII-Buchstaben an.case_insensitive_collation
serial, identityINTEGER PRIMARY KEY AUTOINCREMENT, weiter nach der höchsten IDSQLite zählt einen ganzen ganzzahligen Primärschlüssel, und AUTOINCREMENT verhindert, dass IDs wiederverwendet werden, wie bei einer Sequenz.
serial and identity columns that aren't the whole primary keyINTEGER ohne ZählerSQLite zählt nur eine Spalte, die den ganzen Primärschlüssel bildet, daher behält die Spalte ihre Werte, und neue Zeilen brauchen eigene.counter_dropped
sequences not owned by a columnnicht angelegtSQLite hat keine Sequenzen.sequence_not_converted
generated columnsGENERATED ALWAYS AS, STORED oder VIRTUAL wie in der QuelleSQLite 3.31 und neuer berechnet generierte Spalten auf dieselben zwei Arten.
generated columns with functions SQLite lackseine normale Spalte mit den WertenEine Formel, die sich nicht für SQLite schreiben lässt, hinterlässt eine normale Spalte mit den Werten des Dumps und eine Zeile im Bericht.generated_not_translated
defaults with functions SQLite lacks, and defaults from a sequencekein StandardwertEin Standardwert, der sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet.default_not_translated
CHECK constraintsübersetzt, inline in CREATE TABLESQLite nimmt CHECK-Bedingungen nur in CREATE TABLE an.
CHECK constraints with functions SQLite lacksnicht angelegtEine CHECK-Bedingung, die sich nicht für SQLite schreiben lässt, wird weggelassen und gemeldet.check_skipped
CHECK ... NOT VALIDnicht angelegtPostgreSQL hat die vorher vorhandenen Zeilen nie geprüft, und SQLite würde sie beim Laden prüfen.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexesnicht angelegtIntoSQL schreibt für SQLite B-Tree-Indizes auf Spalten; lege die anderen nach dem Laden neu an.index_skipped
foreign keysin CREATE TABLE, ungeprüft geladen, dann mit PRAGMA foreign_key_check aufgelistetSQLite nimmt Fremdschlüssel nur in CREATE TABLE an und prüft sie nur mit eingeschaltetem PRAGMA foreign_keys. Die Zeilen laden ungeprüft, und das Skript listet am Ende jede Zeile ohne Elternzeile auf.
foreign keys to tables the dump doesn't createnicht angelegtEin Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt.foreign_key_skipped
partitioned tableseine Tabelle mit den Zeilen aller PartitionenDie Zeilen sind dieselben.partitions_dropped
schemaseine Datei, jede Tabelle mit dem Namen ihres Schemas vorangestelltEine SQLite-Datei ist eine Datenbank, daher hält der Schemaname gleichnamige Tabellen auseinander; Tabellen in public behalten ihre Namen.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typesim Bericht aufgeführtIhr Code ist in der Sprache von PostgreSQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.not_converted_objects
dumps without CREATE TABLE (--data-only)Typen aus den Werten gelesenEin Dump nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten.no_schema
expressions in INSERT valuesNULLEin Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.expression_value
types IntoSQL doesn't knowTEXTText nimmt jeden Wert auf; ändere den Typ nach dem Laden.unknown_type
text that isn't valid in its encodingdie fehlerhaften Bytes als ErsatzzeichenText in SQLite ist UTF-8.invalid_utf8_replaced
text decoded twice (ñ)unverändert kopiertDer Dump enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.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.

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

Keine Antwort gefunden? Schreib uns über die Kontaktseite, und ein Mensch antwortet. Kontaktseite

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.