Перейти к содержимому
Главная страница IntoSQL

Конвертация PostgreSQL в SQLite

Перетащите обычный дамп из pg_dump или pg_dumpall в формате .sql или .sql.gz и скачайте скрипт SQLite с теми же таблицами, ключами, индексами и данными. Каждое значение, которое SQLite не может хранить как есть, и каждый объект, который он не переносит, указаны в отчете.

Ваш файл
sqlshop_2024_postgres.sqlПример файла, 6,2 кБ
Ваша база данных

18 строк конвертировано, 3 исправления, ни одна не отклонена

Показать

Таблицы в shop_2024_postgres.sqlДамп PostgreSQL 18.6 · создан программой pg_dump · utf8mb4

  • customers8 строк2
    8 столбцов
    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 строк1
    10 столбцов
    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

Не конвертировано

  • Представление paid_orders

Каждая база данных пишет их на своем языке. Перепишите их для 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;

Исправления

  1. "created_at" таблицы customers содержит моменты времени с часовым поясом; в SQLite нет типа, который его сохраняет, поэтому они хранятся в UTC как TIMESTAMP.
  2. "tags" таблицы customers имеет тип text[], которого нет в SQLite, поэтому тип TEXT с теми же значениями.
  3. "delivery" таблицы orders имеет тип interval, которого нет в SQLite, поэтому тип TEXT с теми же значениями.

Требует проверки

  • Не конвертированы представления, триггеры, процедуры и события (1 объект); отчет перечисляет каждый. Создайте их заново вручную в SQLite.
  • Значение по умолчанию столбца "tags" таблицы customers нельзя записать для SQLite (a value its type can't hold), поэтому у столбца его нет. Добавьте значение по умолчанию вручную, если оно нужно новым строкам.
  • Индекс idx_orders_details таблицы orders использует выражение, которое нельзя записать для SQLite (a gin index), поэтому он не создан. Создайте индекс вручную, если он нужен запросам.
  • В "shipped_at" таблицы orders есть даты, которые SQLite не может хранить (1 значение), например infinity; они заменены на NULL. SQLite хранит годы с 1 по 9999 без бесконечности; если эти даты важны, замените их в источнике.

Файл конвертируется на этом компьютере и никуда не загружается.

Другие примеры:

Что меняется при переходе с PostgreSQL на SQLite

Каждая строка - это правило, которое применяет конвертер, и строка отчета, которую он пишет, когда правило что-то меняет в ваших данных.

  • boolean

    INTEGER 0 или 1 с CHECK

    В SQLite нет логического типа; его собственные true и false - это 1 и 0.

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

    VARCHAR(n) и TEXT, без ограничения

    SQLite сохраняет объявленный тип для инструментов, но не ограничивает длину.

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

    TEXT

    SQLite хранит в числе около 15 значащих цифр. Более широкие числа хранятся как текст, чтобы каждая цифра осталась точной.

    Строка отчета: decimal_as_text

  • money

    NUMERIC

    В SQLite нет типа money. Сумма хранится как число, без символа валюты, добавленного локалью сервера.

    Строка отчета: type_replaced

  • interval

    TEXT с текстом PostgreSQL

    В SQLite нет типа interval; текст сохраняет каждую часть.

    Строка отчета: type_replaced

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

    TEXT с массивом JSON

    В SQLite нет массивов. Массив JSON сохраняет каждый элемент и NULL, а функции JSON в SQLite его читают.

    Строка отчета: type_replaced

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

    TEXT с текстом PostgreSQL

    В SQLite нет равнозначного типа, поэтому каждое значение сохраняет текст, записанный PostgreSQL.

    Строка отчета: type_replaced

  • json, jsonb

    TEXT

    Функции JSON в SQLite читают JSON из текста.

  • timestamp

    DATETIME как текст ISO 8601

    SQLite хранит даты как текст, который читают его функции дат.

  • timestamp with time zone

    TIMESTAMP как текст ISO 8601 в UTC

    В SQLite нет типа, который сохраняет смещение, поэтому каждый момент записывается в UTC: тот же момент, какое бы смещение ни записал дамп.

    Строка отчета: moments_as_utc

  • time

    TIME как текст

    SQLite хранит время как текст, включая 24:00:00.

  • infinity, -infinity and BC dates

    NULL

    Функции дат в SQLite читают годы с 0 по 9999 без бесконечности. Такие значения становятся NULL, а отчет их подсчитывает.

    Строка отчета: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    SQLite хранит NaN как NULL, а его бесконечность переносит не каждый инструмент, поэтому такие значения становятся NULL, а отчет их подсчитывает.

    Строка отчета: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL снимается

    Столбец, значения которого пришлось заменить на NULL, не может сохранить NOT NULL, иначе загрузка остановится.

    Строка отчета: not_null_relaxed

  • enum types

    TEXT с CHECK его меток

    Текст с проверкой хранит те же значения.

  • enum columns holding values outside their labels

    TEXT без проверки

    Значения, которых нет среди меток, не прошли бы проверку, поэтому она не создается.

    Строка отчета: enum_check_skipped

  • uuid, inet, cidr, macaddr

    TEXT

    В SQLite нет таких типов; текст сохраняет каждое значение.

  • bytea

    BLOB

    Байты остаются байтами.

  • bit(n), bit varying

    INTEGER со значением битов до 63 бит; дальше цифры в TEXT

    Битовая строка хранится как число, которое составляют ее биты, пока оно помещается в знаковое целое.

  • oid, xid, cid

    INTEGER с CHECK на неотрицательность

    64-битные целые SQLite вмещают любое значение.

  • citext and nondeterministic collations

    точное сравнение

    SQLite сравнивает текст точно, если не указано иное, а его NOCASE приводит к одному регистру только буквы ASCII.

    Строка отчета: case_insensitive_collation

  • serial, identity

    INTEGER PRIMARY KEY AUTOINCREMENT, продолжается после наибольшего id

    SQLite нумерует первичный ключ из одного целого столбца, а AUTOINCREMENT не дает повторно использовать id, как и последовательность.

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

    INTEGER без счетчика

    SQLite нумерует только столбец, который составляет весь первичный ключ, поэтому столбец сохраняет свои значения, а новым строкам нужны свои.

    Строка отчета: counter_dropped

  • sequences not owned by a column

    не создается

    В SQLite нет последовательностей.

    Строка отчета: sequence_not_converted

  • generated columns

    GENERATED ALWAYS AS, STORED или VIRTUAL, как в источнике

    SQLite 3.31 и новее вычисляет генерируемые столбцы теми же двумя способами.

  • generated columns with functions SQLite lacks

    обычный столбец со значениями

    Формула, которую нельзя записать для SQLite, оставляет обычный столбец со значениями из дампа и строку в отчете.

    Строка отчета: generated_not_translated

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

    без значения по умолчанию

    Значение по умолчанию, которое нельзя записать для SQLite, опускается и попадает в отчет.

    Строка отчета: default_not_translated

  • CHECK constraints

    переводится, внутри CREATE TABLE

    SQLite принимает проверки только в CREATE TABLE.

  • CHECK constraints with functions SQLite lacks

    не создается

    Проверка, которую нельзя записать для SQLite, опускается и попадает в отчет.

    Строка отчета: check_skipped

  • CHECK ... NOT VALID

    не создается

    PostgreSQL не проверял строки, которые были до нее, а SQLite проверял бы их при загрузке.

    Строка отчета: check_not_valid

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

    не создается

    IntoSQL пишет для SQLite индексы b-tree по столбцам; остальные создайте заново после загрузки.

    Строка отчета: index_skipped

  • foreign keys

    в CREATE TABLE, загрузка без проверки, затем список через PRAGMA foreign_key_check

    SQLite принимает внешние ключи только в CREATE TABLE и проверяет их только при включенном PRAGMA foreign_keys. Строки загружаются без проверки, а в конце скрипт перечисляет все строки без родителя.

  • foreign keys to tables the dump doesn't create

    не создается

    Ключ не может ссылаться на таблицу, которой нет.

    Строка отчета: foreign_key_skipped

  • partitioned tables

    одна таблица со строками всех секций

    Строки те же.

    Строка отчета: partitions_dropped

  • schemas

    один файл, имя таблицы начинается с имени ее схемы

    Файл SQLite - это одна база данных, поэтому имя схемы различает таблицы с одинаковыми именами; таблицы из public сохраняют свои имена.

    Строка отчета: schemas_merged

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

    перечисляются в отчете

    Их код написан на языке PostgreSQL, поэтому они перечислены, чтобы вы создали их заново.

    Строка отчета: not_converted_objects

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

    типы определяются по значениям

    Дамп только с данными содержит лишь строки, поэтому типы берутся из значений.

    Строка отчета: no_schema

  • expressions in INSERT values

    NULL

    Конвертер, который не запускает базу данных, не может их вычислить.

    Строка отчета: expression_value

  • types IntoSQL doesn't know

    TEXT

    Тип text вмещает любое значение; измените тип после загрузки.

    Строка отчета: unknown_type

  • text that isn't valid in its encoding

    неверные байты заменяются символом замены

    Текст в SQLite - это UTF-8.

    Строка отчета: invalid_utf8_replaced

  • text decoded twice (ñ)

    копируется как есть

    Дамп содержит именно эти символы, поэтому они копируются; отчет на них указывает.

    Строка отчета: mojibake_suspected

В PostgreSQLВ SQLiteСтрока отчета
booleanINTEGER 0 или 1 с CHECKВ SQLite нет логического типа; его собственные true и false - это 1 и 0.
varchar(n), char(n), textVARCHAR(n) и TEXT, без ограниченияSQLite сохраняет объявленный тип для инструментов, но не ограничивает длину.
numeric(p,s) past 15 digits and numeric without a precisionTEXTSQLite хранит в числе около 15 значащих цифр. Более широкие числа хранятся как текст, чтобы каждая цифра осталась точной.decimal_as_text
moneyNUMERICВ SQLite нет типа money. Сумма хранится как число, без символа валюты, добавленного локалью сервера.type_replaced
intervalTEXT с текстом PostgreSQLВ SQLite нет типа interval; текст сохраняет каждую часть.type_replaced
arrays (integer[], text[]...)TEXT с массивом JSONВ SQLite нет массивов. Массив JSON сохраняет каждый элемент и NULL, а функции JSON в SQLite его читают.type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesTEXT с текстом PostgreSQLВ SQLite нет равнозначного типа, поэтому каждое значение сохраняет текст, записанный PostgreSQL.type_replaced
json, jsonbTEXTФункции JSON в SQLite читают JSON из текста.
timestampDATETIME как текст ISO 8601SQLite хранит даты как текст, который читают его функции дат.
timestamp with time zoneTIMESTAMP как текст ISO 8601 в UTCВ SQLite нет типа, который сохраняет смещение, поэтому каждый момент записывается в UTC: тот же момент, какое бы смещение ни записал дамп.moments_as_utc
timeTIME как текстSQLite хранит время как текст, включая 24:00:00.
infinity, -infinity and BC datesNULLФункции дат в SQLite читают годы с 0 по 9999 без бесконечности. Такие значения становятся NULL, а отчет их подсчитывает.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLSQLite хранит NaN как NULL, а его бесконечность переносит не каждый инструмент, поэтому такие значения становятся NULL, а отчет их подсчитывает.invalid_value_null
NOT NULL columns with values that become NULLNOT NULL снимаетсяСтолбец, значения которого пришлось заменить на NULL, не может сохранить NOT NULL, иначе загрузка остановится.not_null_relaxed
enum typesTEXT с CHECK его метокТекст с проверкой хранит те же значения.
enum columns holding values outside their labelsTEXT без проверкиЗначения, которых нет среди меток, не прошли бы проверку, поэтому она не создается.enum_check_skipped
uuid, inet, cidr, macaddrTEXTВ SQLite нет таких типов; текст сохраняет каждое значение.
byteaBLOBБайты остаются байтами.
bit(n), bit varyingINTEGER со значением битов до 63 бит; дальше цифры в TEXTБитовая строка хранится как число, которое составляют ее биты, пока оно помещается в знаковое целое.
oid, xid, cidINTEGER с CHECK на неотрицательность64-битные целые SQLite вмещают любое значение.
citext and nondeterministic collationsточное сравнениеSQLite сравнивает текст точно, если не указано иное, а его NOCASE приводит к одному регистру только буквы ASCII.case_insensitive_collation
serial, identityINTEGER PRIMARY KEY AUTOINCREMENT, продолжается после наибольшего idSQLite нумерует первичный ключ из одного целого столбца, а AUTOINCREMENT не дает повторно использовать id, как и последовательность.
serial and identity columns that aren't the whole primary keyINTEGER без счетчикаSQLite нумерует только столбец, который составляет весь первичный ключ, поэтому столбец сохраняет свои значения, а новым строкам нужны свои.counter_dropped
sequences not owned by a columnне создаетсяВ SQLite нет последовательностей.sequence_not_converted
generated columnsGENERATED ALWAYS AS, STORED или VIRTUAL, как в источникеSQLite 3.31 и новее вычисляет генерируемые столбцы теми же двумя способами.
generated columns with functions SQLite lacksобычный столбец со значениямиФормула, которую нельзя записать для SQLite, оставляет обычный столбец со значениями из дампа и строку в отчете.generated_not_translated
defaults with functions SQLite lacks, and defaults from a sequenceбез значения по умолчаниюЗначение по умолчанию, которое нельзя записать для SQLite, опускается и попадает в отчет.default_not_translated
CHECK constraintsпереводится, внутри CREATE TABLESQLite принимает проверки только в CREATE TABLE.
CHECK constraints with functions SQLite lacksне создаетсяПроверка, которую нельзя записать для SQLite, опускается и попадает в отчет.check_skipped
CHECK ... NOT VALIDне создаетсяPostgreSQL не проверял строки, которые были до нее, а SQLite проверял бы их при загрузке.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexesне создаетсяIntoSQL пишет для SQLite индексы b-tree по столбцам; остальные создайте заново после загрузки.index_skipped
foreign keysв CREATE TABLE, загрузка без проверки, затем список через PRAGMA foreign_key_checkSQLite принимает внешние ключи только в CREATE TABLE и проверяет их только при включенном PRAGMA foreign_keys. Строки загружаются без проверки, а в конце скрипт перечисляет все строки без родителя.
foreign keys to tables the dump doesn't createне создаетсяКлюч не может ссылаться на таблицу, которой нет.foreign_key_skipped
partitioned tablesодна таблица со строками всех секцийСтроки те же.partitions_dropped
schemasодин файл, имя таблицы начинается с имени ее схемыФайл SQLite - это одна база данных, поэтому имя схемы различает таблицы с одинаковыми именами; таблицы из public сохраняют свои имена.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typesперечисляются в отчетеИх код написан на языке PostgreSQL, поэтому они перечислены, чтобы вы создали их заново.not_converted_objects
dumps without CREATE TABLE (--data-only)типы определяются по значениямДамп только с данными содержит лишь строки, поэтому типы берутся из значений.no_schema
expressions in INSERT valuesNULLКонвертер, который не запускает базу данных, не может их вычислить.expression_value
types IntoSQL doesn't knowTEXTТип text вмещает любое значение; измените тип после загрузки.unknown_type
text that isn't valid in its encodingневерные байты заменяются символом заменыТекст в SQLite - это UTF-8.invalid_utf8_replaced
text decoded twice (ñ)копируется как естьДамп содержит именно эти символы, поэтому они копируются; отчет на них указывает.mojibake_suspected

Загрузите скрипт в SQLite

Скрипт создает таблицы, копирует строки, затем добавляет ключи, индексы и внешние ключи, поэтому загрузка идет быстро и останавливается на первой ошибке.

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

Внешние ключи объявляются в каждой таблице, а строки загружаются с отключенной проверкой внешних ключей. Затем скрипт перечисляет все строки, которые ссылаются на несуществующие строки, а не прерывается на полпути.

Большой дамп загружайте в новый файл на локальном диске. Скрипт загружает все в одной транзакции с отключенной синхронизацией, поэтому работает со скоростью диска, а прерванная загрузка не оставляет неполных таблиц.

Командная строка загружает файл прямо в базу SQLite, без написания скрипта. Это бесплатно.

Как создать дамп PostgreSQL для лучшего результата

Конвертер читает то, что есть в дампе. Эти параметры сохраняют в нем больше ваших данных:

  • --format=plain, формат pg_dump по умолчанию, пишет SQL. Архив custom или directory (-Fc, -Fd) превращается в SQL командой pg_restore -f dump.sql, без сервера баз данных.
  • --no-owner --no-privileges исключают роли и права, которые конвертер все равно пропускает, поэтому дамп получается меньше.
  • pg_dumpall сохраняет все базы данных в один файл; имена таблиц каждой базы начинаются с ее имени, поэтому ничего не конфликтует.

Что не конвертируется

Представления, материализованные представления, функции, процедуры, триггеры, правила, политики защиты строк, расширения и типы написаны на собственном языке PostgreSQL. Они перечислены в отчете по имени и никогда не удаляются молча, чтобы вы могли переписать их для SQLite.

Вопросы о PostgreSQL в SQLite

Нет ответа на ваш вопрос? Напишите нам через страницу контактов, и вам ответит человек. Страница контактов

Мой дамп загружается на сервер?

Нет. Конвертер работает в вашем браузере и читает дамп с диска по частям, поэтому он никогда не покидает ваш компьютер. Приложение для компьютера и командная строка тоже конвертируют на вашем компьютере.

Насколько большим может быть дамп?

Конвертер никогда не держит весь дамп в памяти: он читает файл дважды, по диапазонам, и пишет скрипт по ходу чтения. Дампы в несколько гигабайт конвертируются в браузере, в приложении для компьютера и в командной строке.

Читает ли он архивы pg_dump -Fc?

Не напрямую: архив custom - это двоичный формат. pg_restore -f dump.sql dump.backup превращает его в обычный SQL, который читает конвертер, без подключения к серверу. Получив архив, конвертер так и сообщает.

Из каких версий PostgreSQL может быть дамп?

Дампы, записанные pg_dump и pg_dumpall из PostgreSQL 10 и новее, со строками COPY или INSERT. Каждый тестовый дамп создан в PostgreSQL 13 и 18 и сверен с источником ячейка за ячейкой.

Сохраняются ли значения serial и identity?

Столбец serial или identity, который составляет весь первичный ключ таблицы, становится INTEGER PRIMARY KEY AUTOINCREMENT, каждая строка сохраняет свой id, а следующий id идет после наибольшего. Любой другой сохраняет значения без счетчика, и отчет это отмечает.

Что происходит с массивами, enum и другими типами PostgreSQL?

Массивы становятся массивами JSON, логические значения - 0 и 1, enum - текстом с проверкой меток, а timestamp с часовым поясом - текстом в UTC. Широкие numeric остаются точными в виде текста. Диапазоны, геометрические и составные типы сохраняют текст PostgreSQL.

А функции, триггеры и представления?

Они перечислены в отчете по имени и не конвертируются, потому что каждая база данных пишет их на своем языке.

На каких версиях SQLite загружается скрипт?

SQLite 3.31 и новее. Каждый тестовый дамп загружается на 3.31 и 3.54 и останавливается на первой ошибке, если что-то пойдет не так.