Pular para o conteúdo
Início do IntoSQL

Converta PostgreSQL para SQLite

Solte um dump simples do pg_dump ou pg_dumpall, em .sql ou .sql.gz, e baixe um script do SQLite com as mesmas tabelas, chaves, índices e dados. Cada valor que o SQLite não aceita como está, e cada objeto que ele não traz, aparece no relatório.

Seu arquivo
sqlshop_2024_postgres.sqlArquivo de exemplo, 6,2 kB
Seu banco de dados

18 linhas convertidas, 3 correções, nenhuma rejeitada

Mostrar

Tabelas em shop_2024_postgres.sqlDump do PostgreSQL 18.6 · gerado por pg_dump · utf8mb4

  • customers8 linhas2
    8 colunas
    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 linhas1
    10 colunas
    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

Não convertidos

  • Visão paid_orders

Cada banco de dados escreve estes objetos na sua própria linguagem. Reescreva-os para o 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;

Correções

  1. "created_at" de customers contém instantes com fuso horário; o SQLite não tem um tipo que o mantenha, então eles são guardados em UTC como TIMESTAMP.
  2. "tags" de customers é text[], que o SQLite não tem, então vira TEXT com os mesmos valores.
  3. "delivery" de orders é interval, que o SQLite não tem, então vira TEXT com os mesmos valores.

Para revisar

  • 1 visão, gatilho, rotina ou evento não foi convertido; o relatório lista cada um. Recrie-os manualmente no SQLite.
  • O valor padrão de "tags" em customers não pode ser escrito para o SQLite (a value its type can't hold), então a coluna fica sem valor padrão. Adicione o valor padrão manualmente se novas linhas precisarem dele.
  • O índice idx_orders_details de orders usa uma expressão que não pode ser escrita para o SQLite (a gin index), então não é criado. Crie o índice manualmente se as consultas precisarem dele.
  • 1 valor em "shipped_at" de orders é uma data que o SQLite não consegue guardar, como infinity, então ficou NULL. O SQLite guarda os anos de 1 a 9999 sem infinito; substitua essas datas na origem se elas forem importantes.

Seu arquivo é convertido neste computador e nunca é enviado.

Outros exemplos:

O que muda do PostgreSQL para o SQLite

Cada linha é uma regra que o conversor aplica, com a linha do relatório que ele escreve quando a regra muda algo nos seus dados.

  • boolean

    INTEGER 0 ou 1 com um CHECK

    O SQLite não tem tipo booleano; seus próprios true e false são 1 e 0.

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

    VARCHAR(n) e TEXT, sem limite aplicado

    O SQLite mantém o tipo declarado para as ferramentas lerem, mas não limita o tamanho.

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

    TEXT

    O SQLite guarda cerca de 15 dígitos significativos em um número. Números mais largos ficam como texto, para que cada dígito continue exato.

    Linha do relatório: decimal_as_text

  • money

    NUMERIC

    O SQLite não tem tipo money. O valor fica como número, sem o símbolo de moeda que a localidade do servidor adicionou.

    Linha do relatório: type_replaced

  • interval

    TEXT com o texto do PostgreSQL

    O SQLite não tem tipo interval; o texto mantém cada parte.

    Linha do relatório: type_replaced

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

    TEXT com um array JSON

    O SQLite não tem arrays. Um array JSON mantém cada item e NULL, e as funções JSON do SQLite o leem.

    Linha do relatório: type_replaced

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

    TEXT com o texto do PostgreSQL

    O SQLite não tem um tipo equivalente, então cada valor mantém o texto que o PostgreSQL escreveu.

    Linha do relatório: type_replaced

  • json, jsonb

    TEXT

    As funções JSON do SQLite leem JSON a partir de texto.

  • timestamp

    DATETIME como texto ISO 8601

    O SQLite guarda datas como texto que suas funções de data leem.

  • timestamp with time zone

    TIMESTAMP como texto ISO 8601 em UTC

    O SQLite não tem um tipo que mantenha o fuso, então cada instante é escrito em UTC: o mesmo instante qualquer que seja o fuso que o dump escreveu.

    Linha do relatório: moments_as_utc

  • time

    TIME como texto

    O SQLite guarda horas como texto, incluindo 24:00:00.

  • infinity, -infinity and BC dates

    NULL

    As funções de data do SQLite leem os anos de 0 a 9999 sem infinito. Esses valores viram NULL e o relatório os conta.

    Linha do relatório: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    O SQLite guarda NaN como NULL e seu infinito não sobrevive em todas as ferramentas, então esses valores viram NULL e o relatório os conta.

    Linha do relatório: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL removido

    Uma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.

    Linha do relatório: not_null_relaxed

  • enum types

    TEXT com um CHECK dos rótulos

    Texto com um CHECK mantém os mesmos valores.

  • enum columns holding values outside their labels

    TEXT sem CHECK

    Valores que os rótulos não nomeiam violariam o CHECK, então ele não é criado.

    Linha do relatório: enum_check_skipped

  • uuid, inet, cidr, macaddr

    TEXT

    O SQLite não tem esses tipos; o texto mantém cada valor.

  • bytea

    BLOB

    Bytes continuam bytes.

  • bit(n), bit varying

    INTEGER com o valor dos bits até 63 bits; dígitos em TEXT acima disso

    Uma string de bits é guardada como o número que seus bits formam enquanto cabe em um inteiro com sinal.

  • oid, xid, cid

    INTEGER com um CHECK de que não é negativo

    Os inteiros de 64 bits do SQLite comportam todo valor.

  • citext and nondeterministic collations

    comparação exata

    O SQLite compara texto de forma exata, a menos que se indique outra coisa, e seu NOCASE só trata letras ASCII.

    Linha do relatório: case_insensitive_collation

  • serial, identity

    INTEGER PRIMARY KEY AUTOINCREMENT, continuando depois do maior id

    O SQLite conta uma chave primária inteira que é só um inteiro, e AUTOINCREMENT impede que ids sejam reutilizados, como faz uma sequência.

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

    INTEGER sem contador

    O SQLite só conta uma coluna que é toda a chave primária, então a coluna mantém seus valores e as linhas novas precisam dos seus.

    Linha do relatório: counter_dropped

  • sequences not owned by a column

    não criada

    O SQLite não tem sequências.

    Linha do relatório: sequence_not_converted

  • generated columns

    GENERATED ALWAYS AS, STORED ou VIRTUAL como na origem

    O SQLite 3.31 e posteriores calculam colunas geradas dos mesmos dois jeitos.

  • generated columns with functions SQLite lacks

    uma coluna simples com os valores

    Uma fórmula que não pode ser escrita para o SQLite deixa uma coluna simples com os valores do dump e uma linha no relatório.

    Linha do relatório: generated_not_translated

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

    sem valor padrão

    Um valor padrão que não pode ser escrito para o SQLite fica de fora e é informado.

    Linha do relatório: default_not_translated

  • CHECK constraints

    traduzido, dentro do CREATE TABLE

    O SQLite só aceita CHECKs no CREATE TABLE.

  • CHECK constraints with functions SQLite lacks

    não criado

    Um CHECK que não pode ser escrito para o SQLite fica de fora e é informado.

    Linha do relatório: check_skipped

  • CHECK ... NOT VALID

    não criado

    O PostgreSQL nunca verificou as linhas que já existiam, e o SQLite as verificaria durante a carga.

    Linha do relatório: check_not_valid

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

    não criado

    O IntoSQL escreve índices b-tree sobre colunas para o SQLite; crie os outros de novo depois da carga.

    Linha do relatório: index_skipped

  • foreign keys

    no CREATE TABLE, carregadas sem verificação, depois listadas por PRAGMA foreign_key_check

    O SQLite só aceita chaves estrangeiras no CREATE TABLE e só as verifica com PRAGMA foreign_keys ligado. As linhas carregam sem verificação e o script termina listando cada linha sem pai.

  • foreign keys to tables the dump doesn't create

    não criada

    Uma chave não pode apontar para uma tabela que não existe.

    Linha do relatório: foreign_key_skipped

  • partitioned tables

    uma tabela com as linhas de todas as partições

    As linhas são as mesmas.

    Linha do relatório: partitions_dropped

  • schemas

    um arquivo, tabelas com o nome do schema na frente

    Um arquivo SQLite é um banco de dados, então o nome do schema separa tabelas com o mesmo nome; as tabelas de public mantêm seus nomes.

    Linha do relatório: schemas_merged

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

    listados no relatório

    O código deles é escrito na linguagem do PostgreSQL, então eles são listados para você recriá-los.

    Linha do relatório: not_converted_objects

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

    tipos lidos dos valores

    Um dump só de dados tem apenas linhas, então os tipos vêm dos valores.

    Linha do relatório: no_schema

  • expressions in INSERT values

    NULL

    Um conversor que não executa um banco de dados não consegue avaliá-las.

    Linha do relatório: expression_value

  • types IntoSQL doesn't know

    TEXT

    O texto aceita qualquer valor; mude o tipo depois da carga.

    Linha do relatório: unknown_type

  • text that isn't valid in its encoding

    os bytes inválidos como o caractere de substituição

    O texto do SQLite é UTF-8.

    Linha do relatório: invalid_utf8_replaced

  • text decoded twice (ñ)

    copiado como está

    O dump contém exatamente esses caracteres, então eles são copiados; o relatório os aponta.

    Linha do relatório: mojibake_suspected

No PostgreSQLNo SQLiteLinha do relatório
booleanINTEGER 0 ou 1 com um CHECKO SQLite não tem tipo booleano; seus próprios true e false são 1 e 0.
varchar(n), char(n), textVARCHAR(n) e TEXT, sem limite aplicadoO SQLite mantém o tipo declarado para as ferramentas lerem, mas não limita o tamanho.
numeric(p,s) past 15 digits and numeric without a precisionTEXTO SQLite guarda cerca de 15 dígitos significativos em um número. Números mais largos ficam como texto, para que cada dígito continue exato.decimal_as_text
moneyNUMERICO SQLite não tem tipo money. O valor fica como número, sem o símbolo de moeda que a localidade do servidor adicionou.type_replaced
intervalTEXT com o texto do PostgreSQLO SQLite não tem tipo interval; o texto mantém cada parte.type_replaced
arrays (integer[], text[]...)TEXT com um array JSONO SQLite não tem arrays. Um array JSON mantém cada item e NULL, e as funções JSON do SQLite o leem.type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesTEXT com o texto do PostgreSQLO SQLite não tem um tipo equivalente, então cada valor mantém o texto que o PostgreSQL escreveu.type_replaced
json, jsonbTEXTAs funções JSON do SQLite leem JSON a partir de texto.
timestampDATETIME como texto ISO 8601O SQLite guarda datas como texto que suas funções de data leem.
timestamp with time zoneTIMESTAMP como texto ISO 8601 em UTCO SQLite não tem um tipo que mantenha o fuso, então cada instante é escrito em UTC: o mesmo instante qualquer que seja o fuso que o dump escreveu.moments_as_utc
timeTIME como textoO SQLite guarda horas como texto, incluindo 24:00:00.
infinity, -infinity and BC datesNULLAs funções de data do SQLite leem os anos de 0 a 9999 sem infinito. Esses valores viram NULL e o relatório os conta.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLO SQLite guarda NaN como NULL e seu infinito não sobrevive em todas as ferramentas, então esses valores viram NULL e o relatório os conta.invalid_value_null
NOT NULL columns with values that become NULLNOT NULL removidoUma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.not_null_relaxed
enum typesTEXT com um CHECK dos rótulosTexto com um CHECK mantém os mesmos valores.
enum columns holding values outside their labelsTEXT sem CHECKValores que os rótulos não nomeiam violariam o CHECK, então ele não é criado.enum_check_skipped
uuid, inet, cidr, macaddrTEXTO SQLite não tem esses tipos; o texto mantém cada valor.
byteaBLOBBytes continuam bytes.
bit(n), bit varyingINTEGER com o valor dos bits até 63 bits; dígitos em TEXT acima dissoUma string de bits é guardada como o número que seus bits formam enquanto cabe em um inteiro com sinal.
oid, xid, cidINTEGER com um CHECK de que não é negativoOs inteiros de 64 bits do SQLite comportam todo valor.
citext and nondeterministic collationscomparação exataO SQLite compara texto de forma exata, a menos que se indique outra coisa, e seu NOCASE só trata letras ASCII.case_insensitive_collation
serial, identityINTEGER PRIMARY KEY AUTOINCREMENT, continuando depois do maior idO SQLite conta uma chave primária inteira que é só um inteiro, e AUTOINCREMENT impede que ids sejam reutilizados, como faz uma sequência.
serial and identity columns that aren't the whole primary keyINTEGER sem contadorO SQLite só conta uma coluna que é toda a chave primária, então a coluna mantém seus valores e as linhas novas precisam dos seus.counter_dropped
sequences not owned by a columnnão criadaO SQLite não tem sequências.sequence_not_converted
generated columnsGENERATED ALWAYS AS, STORED ou VIRTUAL como na origemO SQLite 3.31 e posteriores calculam colunas geradas dos mesmos dois jeitos.
generated columns with functions SQLite lacksuma coluna simples com os valoresUma fórmula que não pode ser escrita para o SQLite deixa uma coluna simples com os valores do dump e uma linha no relatório.generated_not_translated
defaults with functions SQLite lacks, and defaults from a sequencesem valor padrãoUm valor padrão que não pode ser escrito para o SQLite fica de fora e é informado.default_not_translated
CHECK constraintstraduzido, dentro do CREATE TABLEO SQLite só aceita CHECKs no CREATE TABLE.
CHECK constraints with functions SQLite lacksnão criadoUm CHECK que não pode ser escrito para o SQLite fica de fora e é informado.check_skipped
CHECK ... NOT VALIDnão criadoO PostgreSQL nunca verificou as linhas que já existiam, e o SQLite as verificaria durante a carga.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexesnão criadoO IntoSQL escreve índices b-tree sobre colunas para o SQLite; crie os outros de novo depois da carga.index_skipped
foreign keysno CREATE TABLE, carregadas sem verificação, depois listadas por PRAGMA foreign_key_checkO SQLite só aceita chaves estrangeiras no CREATE TABLE e só as verifica com PRAGMA foreign_keys ligado. As linhas carregam sem verificação e o script termina listando cada linha sem pai.
foreign keys to tables the dump doesn't createnão criadaUma chave não pode apontar para uma tabela que não existe.foreign_key_skipped
partitioned tablesuma tabela com as linhas de todas as partiçõesAs linhas são as mesmas.partitions_dropped
schemasum arquivo, tabelas com o nome do schema na frenteUm arquivo SQLite é um banco de dados, então o nome do schema separa tabelas com o mesmo nome; as tabelas de public mantêm seus nomes.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typeslistados no relatórioO código deles é escrito na linguagem do PostgreSQL, então eles são listados para você recriá-los.not_converted_objects
dumps without CREATE TABLE (--data-only)tipos lidos dos valoresUm dump só de dados tem apenas linhas, então os tipos vêm dos valores.no_schema
expressions in INSERT valuesNULLUm conversor que não executa um banco de dados não consegue avaliá-las.expression_value
types IntoSQL doesn't knowTEXTO texto aceita qualquer valor; mude o tipo depois da carga.unknown_type
text that isn't valid in its encodingos bytes inválidos como o caractere de substituiçãoO texto do SQLite é UTF-8.invalid_utf8_replaced
text decoded twice (ñ)copiado como estáO dump contém exatamente esses caracteres, então eles são copiados; o relatório os aponta.mojibake_suspected

Carregue o script no SQLite

O script cria as tabelas, copia as linhas e depois adiciona chaves, índices e chaves estrangeiras, então carrega rápido e para no primeiro erro.

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

As chaves estrangeiras são declaradas em cada tabela e as linhas carregam com a verificação de chaves estrangeiras desligada. Depois o script lista cada linha que aponta para uma linha que não existe, em vez de falhar no meio do caminho.

Para um dump grande, carregue em um arquivo novo em um disco local. O script carrega tudo em uma transação com a sincronização desligada, então roda na velocidade do disco, e uma carga interrompida no meio não deixa tabelas incompletas.

A linha de comando carrega o arquivo direto em um banco SQLite, sem escrever um script. É grátis.

Gere o dump do PostgreSQL para o melhor resultado

O conversor lê o que o dump contém. Estas opções mantêm mais dos seus dados nele:

  • --format=plain, o padrão do pg_dump, escreve SQL. Um arquivo custom ou de diretório (-Fc, -Fd) vira SQL com pg_restore -f dump.sql, sem servidor de banco de dados.
  • --no-owner --no-privileges deixam de fora papéis e permissões, que o conversor ignora de qualquer forma, então o dump fica menor.
  • O pg_dumpall gera o dump de todos os bancos de dados em um arquivo; as tabelas de cada um recebem o nome dele, então nada colide.

O que não é convertido

Visões, visões materializadas, funções, procedimentos, gatilhos, regras, políticas de segurança de linha, extensões e tipos são escritos na linguagem própria do PostgreSQL. Eles aparecem no relatório pelo nome, nunca são descartados em silêncio, para que você possa reescrevê-los para o SQLite.

Perguntas sobre PostgreSQL para SQLite

Não encontrou a resposta? Escreva para nós pela página de contato e uma pessoa responde. Página de contato

Meu dump é enviado?

Não. O conversor roda no seu navegador e lê o dump do seu disco em partes, então ele nunca sai do seu computador. O app para desktop e a linha de comando também convertem no seu computador.

Qual o tamanho máximo do dump?

O conversor nunca guarda o dump inteiro na memória: ele lê o arquivo duas vezes, por intervalos, e escreve o script à medida que avança. Dumps de vários gigabytes são convertidos no navegador, no app para desktop e com a linha de comando.

Ele lê arquivos do pg_dump -Fc?

Não diretamente: um arquivo custom é um formato binário. pg_restore -f dump.sql dump.backup o transforma no SQL simples que o conversor lê, sem se conectar a um servidor. O conversor avisa quando recebe um arquivo desses.

De quais versões do PostgreSQL o dump pode vir?

Dumps escritos pelo pg_dump e pg_dumpall do PostgreSQL 10 em diante, com linhas em COPY ou INSERT. Cada dump de teste vem do PostgreSQL 13 e 18 e é comparado com a origem célula por célula.

Os valores serial e identity são mantidos?

Uma coluna serial ou identity que é toda a chave primária da tabela vira INTEGER PRIMARY KEY AUTOINCREMENT, cada linha mantém seu id, e o próximo id continua depois do maior. Qualquer outra mantém seus valores sem contador, e o relatório avisa.

O que acontece com arrays, enums e outros tipos do PostgreSQL?

Arrays viram arrays JSON, booleanos 0 e 1, enums texto com um CHECK dos rótulos, e timestamps com fuso horário texto em UTC. Numerics largos continuam exatos como texto. Ranges, tipos geométricos e tipos compostos mantêm o texto do PostgreSQL.

E as funções, gatilhos e visões?

Eles aparecem no relatório pelo nome e não são convertidos, porque cada banco de dados os escreve na sua própria linguagem.

Em quais versões do SQLite o script carrega?

SQLite 3.31 e posteriores. Cada dump de teste carrega no 3.31 e no 3.54 e para no primeiro erro se algo der errado.