Конвертация PostgreSQL в SQLite
Перетащите обычный дамп из pg_dump или pg_dumpall в формате .sql или .sql.gz и скачайте скрипт SQLite с теми же таблицами, ключами, индексами и данными. Каждое значение, которое SQLite не может хранить как есть, и каждый объект, который он не переносит, указаны в отчете.
18 строк конвертировано, 3 исправления, ни одна не отклонена
Таблицы в shop_2024_postgres.sqlДамп PostgreSQL 18.6 · создан программой pg_dump · utf8mb4
customers8 строк2
8 столбцов id INTEGER not null name TEXT not null email TEXT not null country VARCHAR(2) not null is_active INTEGER not null tags TEXT not null signed_up DATE created_at TIMESTAMP not null orders10 строк1
10 столбцов id INTEGER not null customer_id INTEGER not null status TEXT not null total DECIMAL(10,2) not null items INTEGER not null ordered_at DATETIME not null shipped_at DATETIME note TEXT details TEXT delivery TEXT
Не конвертировано
- Представление 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;
Исправления
- "created_at" таблицы customers содержит моменты времени с часовым поясом; в SQLite нет типа, который его сохраняет, поэтому они хранятся в UTC как TIMESTAMP.
- "tags" таблицы customers имеет тип text[], которого нет в SQLite, поэтому тип TEXT с теми же значениями.
- "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 | Строка отчета |
|---|---|---|
| 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 | TEXTSQLite хранит в числе около 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 8601SQLite хранит даты как текст, который читают его функции дат. | |
| 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 | NULLSQLite хранит 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, продолжается после наибольшего idSQLite нумерует первичный ключ из одного целого столбца, а 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 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 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 |
Загрузите скрипт в 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 и останавливается на первой ошибке, если что-то пойдет не так.