Przejdź do treści
Strona główna IntoSQL

Konwertuj PostgreSQL do SQLite

Upuść zwykły zrzut z pg_dump lub pg_dumpall jako .sql lub .sql.gz i pobierz skrypt SQLite z tymi samymi tabelami, kluczami, indeksami i danymi. Każda wartość, której SQLite nie może przechować bez zmian, i każdy obiekt, którego nie przenosi, są wymienione w raporcie.

Twój plik
sqlshop_2024_postgres.sqlPlik przykładowy, 6,2 kB
Twoja baza danych

18 wierszy przekonwertowanych, 3 poprawki, brak odrzuconych

Pokaż

Tabele w pliku shop_2024_postgres.sqlZrzut PostgreSQL 18.6 · zapisany przez pg_dump · utf8mb4

  • customers8 wierszy2
    8 kolumn
    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 wierszy1
    10 kolumn
    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

Nieprzekonwertowane

  • Widok paid_orders

Każda baza danych zapisuje je we własnym języku. Przepisz je dla 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;

Poprawki

  1. "created_at" tabeli customers zawiera momenty ze strefą czasową; SQLite nie ma typu, który ją zachowuje, więc są zapisywane w UTC jako TIMESTAMP.
  2. "tags" w tabeli customers to text[], czego SQLite nie ma, więc ma typ TEXT z tymi samymi wartościami.
  3. "delivery" w tabeli orders to interval, czego SQLite nie ma, więc ma typ TEXT z tymi samymi wartościami.

Do sprawdzenia

  • Widoki, wyzwalacze, procedury i zdarzenia nie są konwertowane: 1 obiekt, każdy wymieniony w raporcie. Utwórz je ręcznie w SQLite.
  • Wartości domyślnej "tags" w tabeli customers nie da się zapisać dla SQLite (a value its type can't hold), więc kolumna nie ma wartości domyślnej. Dodaj wartość domyślną ręcznie, jeśli nowe wiersze jej potrzebują.
  • Indeks idx_orders_details w tabeli orders używa wyrażenia, którego nie da się zapisać dla SQLite (a gin index), więc go nie utworzono. Utwórz indeks ręcznie, jeśli zapytania go potrzebują.
  • W "shipped_at" tabeli orders 1 data poza zakresem SQLite, np. infinity, staje się NULL. SQLite przechowuje lata od 1 do 9999 bez nieskończoności; jeśli te daty są ważne, zastąp je w źródle.

Plik jest konwertowany na tym komputerze i nigdy nie jest wysyłany.

Inne przykłady:

Co zmienia się między PostgreSQL a SQLite

Każdy wiersz to reguła stosowana przez konwerter, z wpisem, który dodaje do raportu, gdy reguła coś zmienia w twoich danych.

  • boolean

    INTEGER 0 lub 1 z CHECK

    SQLite nie ma typu logicznego; jego własne true i false to 1 i 0.

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

    VARCHAR(n) i TEXT, bez wymuszania

    SQLite zachowuje zadeklarowany typ dla narzędzi, ale nie ogranicza długości.

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

    TEXT

    SQLite przechowuje w liczbie około 15 cyfr znaczących. Szersze liczby są zapisywane jako tekst, aby każda cyfra pozostała dokładna.

    Wpis w raporcie: decimal_as_text

  • money

    NUMERIC

    SQLite nie ma typu money. Kwota jest zapisywana jako liczba, bez symbolu waluty dodanego przez ustawienia regionalne serwera.

    Wpis w raporcie: type_replaced

  • interval

    TEXT z tekstem PostgreSQL

    SQLite nie ma typu interval; tekst zachowuje każdą część.

    Wpis w raporcie: type_replaced

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

    TEXT z tablicą JSON

    SQLite nie ma tablic. Tablica JSON zachowuje każdy element i NULL, a funkcje JSON w SQLite ją odczytują.

    Wpis w raporcie: type_replaced

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

    TEXT z tekstem PostgreSQL

    SQLite nie ma odpowiedniego typu, więc każda wartość zachowuje tekst zapisany przez PostgreSQL.

    Wpis w raporcie: type_replaced

  • json, jsonb

    TEXT

    Funkcje JSON w SQLite odczytują JSON z tekstu.

  • timestamp

    DATETIME jako tekst ISO 8601

    SQLite przechowuje daty jako tekst, który czytają jego funkcje dat.

  • timestamp with time zone

    TIMESTAMP jako tekst ISO 8601 w UTC

    SQLite nie ma typu, który zachowuje przesunięcie, więc każdy moment jest zapisywany w UTC: ten sam moment niezależnie od przesunięcia w zrzucie.

    Wpis w raporcie: moments_as_utc

  • time

    TIME jako tekst

    SQLite przechowuje godziny jako tekst, łącznie z 24:00:00.

  • infinity, -infinity and BC dates

    NULL

    Funkcje dat w SQLite odczytują lata od 0 do 9999 bez nieskończoności. Te wartości stają się NULL, a raport je liczy.

    Wpis w raporcie: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    SQLite zapisuje NaN jako NULL, a jego nieskończoność nie przetrwa w każdym narzędziu, więc te wartości stają się NULL, a raport je liczy.

    Wpis w raporcie: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL usunięte

    Kolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.

    Wpis w raporcie: not_null_relaxed

  • enum types

    TEXT z CHECK jego etykiet

    Tekst z ograniczeniem CHECK zachowuje te same wartości.

  • enum columns holding values outside their labels

    TEXT bez CHECK

    Wartości spoza etykiet nie przeszłyby ograniczenia CHECK, więc nie jest ono tworzone.

    Wpis w raporcie: enum_check_skipped

  • uuid, inet, cidr, macaddr

    TEXT

    SQLite nie ma takich typów; tekst zachowuje każdą wartość.

  • bytea

    BLOB

    Bajty pozostają bajtami.

  • bit(n), bit varying

    INTEGER z wartością bitów do 63 bitów; powyżej cyfry w TEXT

    Ciąg bitów jest zapisywany jako liczba, którą tworzą jego bity, dopóki mieści się w liczbie całkowitej ze znakiem.

  • oid, xid, cid

    INTEGER z CHECK, że wartość nie jest ujemna

    64-bitowe liczby całkowite w SQLite mieszczą każdą wartość.

  • citext and nondeterministic collations

    dokładne porównanie

    SQLite porównuje tekst dokładnie, chyba że ustawisz inaczej, a jego NOCASE ujednolica tylko litery ASCII.

    Wpis w raporcie: case_insensitive_collation

  • serial, identity

    INTEGER PRIMARY KEY AUTOINCREMENT, kontynuowane po najwyższym id

    SQLite liczy cały całkowity klucz główny, a AUTOINCREMENT nie pozwala ponownie użyć id, tak jak sekwencja.

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

    INTEGER bez licznika

    SQLite liczy tylko kolumnę, która jest całym kluczem głównym, więc kolumna zachowuje swoje wartości, a nowe wiersze potrzebują własnych.

    Wpis w raporcie: counter_dropped

  • sequences not owned by a column

    nie jest tworzone

    SQLite nie ma sekwencji.

    Wpis w raporcie: sequence_not_converted

  • generated columns

    GENERATED ALWAYS AS, STORED lub VIRTUAL jak w źródle

    SQLite 3.31 i nowsze obliczają kolumny generowane na te same dwa sposoby.

  • generated columns with functions SQLite lacks

    zwykła kolumna z wartościami

    Formuła, której nie da się zapisać dla SQLite, zostawia zwykłą kolumnę z wartościami ze zrzutu i wpis w raporcie.

    Wpis w raporcie: generated_not_translated

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

    brak wartości domyślnej

    Wartość domyślna, której nie da się zapisać dla SQLite, jest pomijana i zgłaszana w raporcie.

    Wpis w raporcie: default_not_translated

  • CHECK constraints

    przetłumaczone, wewnątrz CREATE TABLE

    SQLite przyjmuje ograniczenia CHECK tylko w CREATE TABLE.

  • CHECK constraints with functions SQLite lacks

    nie jest tworzone

    Ograniczenie CHECK, którego nie da się zapisać dla SQLite, jest pomijane i zgłaszane w raporcie.

    Wpis w raporcie: check_skipped

  • CHECK ... NOT VALID

    nie jest tworzone

    PostgreSQL nigdy nie sprawdził wierszy, które były wcześniej, a SQLite sprawdzałby je podczas ładowania.

    Wpis w raporcie: check_not_valid

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

    nie jest tworzone

    IntoSQL zapisuje dla SQLite indeksy b-tree na kolumnach; pozostałe utwórz ponownie po załadowaniu.

    Wpis w raporcie: index_skipped

  • foreign keys

    w CREATE TABLE, ładowane bez sprawdzania, potem wypisywane przez PRAGMA foreign_key_check

    SQLite przyjmuje klucze obce tylko w CREATE TABLE i sprawdza je tylko z włączonym PRAGMA foreign_keys. Wiersze ładują się bez sprawdzania, a na końcu skrypt wypisuje każdy wiersz bez rodzica.

  • foreign keys to tables the dump doesn't create

    nie jest tworzone

    Klucz nie może wskazywać tabeli, której nie ma.

    Wpis w raporcie: foreign_key_skipped

  • partitioned tables

    jedna tabela z wierszami wszystkich partycji

    Wiersze są te same.

    Wpis w raporcie: partitions_dropped

  • schemas

    jeden plik, nazwa każdej tabeli zaczyna się od nazwy jej schematu

    Plik SQLite to jedna baza danych, więc nazwa schematu odróżnia tabele o tej samej nazwie; tabele z public zachowują nazwy.

    Wpis w raporcie: schemas_merged

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

    wymienione w raporcie

    Ich kod jest napisany w języku PostgreSQL, więc trafiają na listę do ręcznego odtworzenia.

    Wpis w raporcie: not_converted_objects

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

    typy odczytane z wartości

    Zrzut samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.

    Wpis w raporcie: no_schema

  • expressions in INSERT values

    NULL

    Konwerter, który nie uruchamia bazy danych, nie może ich obliczyć.

    Wpis w raporcie: expression_value

  • types IntoSQL doesn't know

    TEXT

    Tekst mieści każdą wartość; zmień typ po załadowaniu.

    Wpis w raporcie: unknown_type

  • text that isn't valid in its encoding

    błędne bajty jako znak zastępczy

    Tekst w SQLite to UTF-8.

    Wpis w raporcie: invalid_utf8_replaced

  • text decoded twice (ñ)

    skopiowane bez zmian

    Zrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.

    Wpis w raporcie: mojibake_suspected

W PostgreSQLW SQLiteWpis w raporcie
booleanINTEGER 0 lub 1 z CHECKSQLite nie ma typu logicznego; jego własne true i false to 1 i 0.
varchar(n), char(n), textVARCHAR(n) i TEXT, bez wymuszaniaSQLite zachowuje zadeklarowany typ dla narzędzi, ale nie ogranicza długości.
numeric(p,s) past 15 digits and numeric without a precisionTEXTSQLite przechowuje w liczbie około 15 cyfr znaczących. Szersze liczby są zapisywane jako tekst, aby każda cyfra pozostała dokładna.decimal_as_text
moneyNUMERICSQLite nie ma typu money. Kwota jest zapisywana jako liczba, bez symbolu waluty dodanego przez ustawienia regionalne serwera.type_replaced
intervalTEXT z tekstem PostgreSQLSQLite nie ma typu interval; tekst zachowuje każdą część.type_replaced
arrays (integer[], text[]...)TEXT z tablicą JSONSQLite nie ma tablic. Tablica JSON zachowuje każdy element i NULL, a funkcje JSON w SQLite ją odczytują.type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesTEXT z tekstem PostgreSQLSQLite nie ma odpowiedniego typu, więc każda wartość zachowuje tekst zapisany przez PostgreSQL.type_replaced
json, jsonbTEXTFunkcje JSON w SQLite odczytują JSON z tekstu.
timestampDATETIME jako tekst ISO 8601SQLite przechowuje daty jako tekst, który czytają jego funkcje dat.
timestamp with time zoneTIMESTAMP jako tekst ISO 8601 w UTCSQLite nie ma typu, który zachowuje przesunięcie, więc każdy moment jest zapisywany w UTC: ten sam moment niezależnie od przesunięcia w zrzucie.moments_as_utc
timeTIME jako tekstSQLite przechowuje godziny jako tekst, łącznie z 24:00:00.
infinity, -infinity and BC datesNULLFunkcje dat w SQLite odczytują lata od 0 do 9999 bez nieskończoności. Te wartości stają się NULL, a raport je liczy.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLSQLite zapisuje NaN jako NULL, a jego nieskończoność nie przetrwa w każdym narzędziu, więc te wartości stają się NULL, a raport je liczy.invalid_value_null
NOT NULL columns with values that become NULLNOT NULL usunięteKolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.not_null_relaxed
enum typesTEXT z CHECK jego etykietTekst z ograniczeniem CHECK zachowuje te same wartości.
enum columns holding values outside their labelsTEXT bez CHECKWartości spoza etykiet nie przeszłyby ograniczenia CHECK, więc nie jest ono tworzone.enum_check_skipped
uuid, inet, cidr, macaddrTEXTSQLite nie ma takich typów; tekst zachowuje każdą wartość.
byteaBLOBBajty pozostają bajtami.
bit(n), bit varyingINTEGER z wartością bitów do 63 bitów; powyżej cyfry w TEXTCiąg bitów jest zapisywany jako liczba, którą tworzą jego bity, dopóki mieści się w liczbie całkowitej ze znakiem.
oid, xid, cidINTEGER z CHECK, że wartość nie jest ujemna64-bitowe liczby całkowite w SQLite mieszczą każdą wartość.
citext and nondeterministic collationsdokładne porównanieSQLite porównuje tekst dokładnie, chyba że ustawisz inaczej, a jego NOCASE ujednolica tylko litery ASCII.case_insensitive_collation
serial, identityINTEGER PRIMARY KEY AUTOINCREMENT, kontynuowane po najwyższym idSQLite liczy cały całkowity klucz główny, a AUTOINCREMENT nie pozwala ponownie użyć id, tak jak sekwencja.
serial and identity columns that aren't the whole primary keyINTEGER bez licznikaSQLite liczy tylko kolumnę, która jest całym kluczem głównym, więc kolumna zachowuje swoje wartości, a nowe wiersze potrzebują własnych.counter_dropped
sequences not owned by a columnnie jest tworzoneSQLite nie ma sekwencji.sequence_not_converted
generated columnsGENERATED ALWAYS AS, STORED lub VIRTUAL jak w źródleSQLite 3.31 i nowsze obliczają kolumny generowane na te same dwa sposoby.
generated columns with functions SQLite lackszwykła kolumna z wartościamiFormuła, której nie da się zapisać dla SQLite, zostawia zwykłą kolumnę z wartościami ze zrzutu i wpis w raporcie.generated_not_translated
defaults with functions SQLite lacks, and defaults from a sequencebrak wartości domyślnejWartość domyślna, której nie da się zapisać dla SQLite, jest pomijana i zgłaszana w raporcie.default_not_translated
CHECK constraintsprzetłumaczone, wewnątrz CREATE TABLESQLite przyjmuje ograniczenia CHECK tylko w CREATE TABLE.
CHECK constraints with functions SQLite lacksnie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać dla SQLite, jest pomijane i zgłaszane w raporcie.check_skipped
CHECK ... NOT VALIDnie jest tworzonePostgreSQL nigdy nie sprawdził wierszy, które były wcześniej, a SQLite sprawdzałby je podczas ładowania.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexesnie jest tworzoneIntoSQL zapisuje dla SQLite indeksy b-tree na kolumnach; pozostałe utwórz ponownie po załadowaniu.index_skipped
foreign keysw CREATE TABLE, ładowane bez sprawdzania, potem wypisywane przez PRAGMA foreign_key_checkSQLite przyjmuje klucze obce tylko w CREATE TABLE i sprawdza je tylko z włączonym PRAGMA foreign_keys. Wiersze ładują się bez sprawdzania, a na końcu skrypt wypisuje każdy wiersz bez rodzica.
foreign keys to tables the dump doesn't createnie jest tworzoneKlucz nie może wskazywać tabeli, której nie ma.foreign_key_skipped
partitioned tablesjedna tabela z wierszami wszystkich partycjiWiersze są te same.partitions_dropped
schemasjeden plik, nazwa każdej tabeli zaczyna się od nazwy jej schematuPlik SQLite to jedna baza danych, więc nazwa schematu odróżnia tabele o tej samej nazwie; tabele z public zachowują nazwy.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typeswymienione w raporcieIch kod jest napisany w języku PostgreSQL, więc trafiają na listę do ręcznego odtworzenia.not_converted_objects
dumps without CREATE TABLE (--data-only)typy odczytane z wartościZrzut samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.no_schema
expressions in INSERT valuesNULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć.expression_value
types IntoSQL doesn't knowTEXTTekst mieści każdą wartość; zmień typ po załadowaniu.unknown_type
text that isn't valid in its encodingbłędne bajty jako znak zastępczyTekst w SQLite to UTF-8.invalid_utf8_replaced
text decoded twice (ñ)skopiowane bez zmianZrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.mojibake_suspected

Załaduj skrypt do SQLite

Skrypt tworzy tabele, kopiuje wiersze, a potem dodaje klucze, indeksy i klucze obce, więc ładuje się szybko i zatrzymuje przy pierwszym błędzie.

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

Klucze obce są deklarowane w każdej tabeli, a wiersze ładują się z wyłączonym sprawdzaniem kluczy obcych. Potem skrypt wypisuje każdy wiersz, który wskazuje na nieistniejący wiersz, zamiast przerwać w połowie.

Duży zrzut ładuj do nowego pliku na dysku lokalnym. Skrypt ładuje wszystko w jednej transakcji z wyłączoną synchronizacją, więc działa z szybkością dysku, a przerwane ładowanie nie zostawia niepełnych tabel.

Wiersz poleceń ładuje plik prosto do bazy SQLite, bez pisania skryptu. To nic nie kosztuje.

Jak zrobić zrzut PostgreSQL dla najlepszego wyniku

Konwerter odczytuje to, co zawiera zrzut. Te opcje zachowują w nim więcej twoich danych:

  • --format=plain, domyślny w pg_dump, zapisuje SQL. Archiwum custom lub directory (-Fc, -Fd) zamienisz na SQL poleceniem pg_restore -f dump.sql, bez serwera bazy danych.
  • --no-owner --no-privileges pomijają role i uprawnienia, które konwerter i tak pomija, więc zrzut jest mniejszy.
  • pg_dumpall zapisuje każdą bazę danych w jednym pliku; nazwy tabel każdej z nich zaczynają się od jej nazwy, więc nic się nie powtarza.

Co nie jest konwertowane

Widoki, widoki zmaterializowane, funkcje, procedury, wyzwalacze, reguły, polityki bezpieczeństwa wierszy, rozszerzenia i typy są pisane we własnym języku PostgreSQL. Raport wymienia je z nazwy i nigdy nie pomija ich po cichu, więc możesz je przepisać dla SQLite.

Pytania o konwersję PostgreSQL do SQLite

Nie ma tu odpowiedzi? Napisz do nas przez stronę kontaktu, a odpowie człowiek. Strona kontaktu

Czy mój zrzut jest wysyłany?

Nie. Konwerter działa w przeglądarce i odczytuje zrzut z dysku po kawałku, więc nigdy nie opuszcza on twojego komputera. Aplikacja na komputer i wiersz poleceń też konwertują na twoim komputerze.

Jak duży może być zrzut?

Konwerter nigdy nie trzyma całego zrzutu w pamięci: czyta plik dwa razy, fragmentami, i zapisuje skrypt na bieżąco. Zrzuty wielogigabajtowe konwertują się w przeglądarce, w aplikacji na komputer i w wierszu poleceń.

Czy odczytuje archiwa pg_dump -Fc?

Nie bezpośrednio: archiwum custom to format binarny. pg_restore -f dump.sql dump.backup zamienia je na zwykły SQL, który czyta konwerter, bez łączenia z serwerem. Konwerter informuje o tym, gdy dostanie archiwum.

Z jakich wersji PostgreSQL może pochodzić zrzut?

Zrzuty zapisane przez pg_dump i pg_dumpall z PostgreSQL od wersji 10, z wierszami COPY lub INSERT. Każdy testowy zrzut pochodzi z PostgreSQL 13 i 18 i jest porównywany ze źródłem komórka po komórce.

Czy wartości serial i identity są zachowywane?

Kolumna serial lub identity, która stanowi cały klucz główny tabeli, staje się INTEGER PRIMARY KEY AUTOINCREMENT, każdy wiersz zachowuje swoje id, a kolejne id idzie po najwyższym. Każda inna zachowuje wartości bez licznika, a raport o tym mówi.

Co dzieje się z tablicami, typami enum i innymi typami PostgreSQL?

Tablice stają się tablicami JSON, wartości logiczne 0 i 1, typy enum tekstem z CHECK ich etykiet, a znaczniki czasu ze strefą tekstem w UTC. Szerokie liczby numeric zostają dokładne jako tekst. Zakresy, typy geometryczne i typy złożone zachowują tekst PostgreSQL.

A funkcje, wyzwalacze i widoki?

Raport wymienia je z nazwy, ale nie są konwertowane, bo każda baza danych zapisuje je we własnym języku.

Na jakich wersjach SQLite ładuje się skrypt?

SQLite 3.31 i nowsze. Każdy testowy zrzut ładuje się na 3.31 i 3.54 i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.