---
title: "Migrar SQLite a PostgreSQL en tu navegador"
description: "Migra una base de datos SQLite a PostgreSQL: convierte el archivo .db o su volcado en un script con las mismas tablas, claves y datos, y un informe de cambios."
canonical: https://intosql.com/es/sqlite-a-postgresql
last_updated: 2026-10-15
---

# Migrar SQLite a PostgreSQL en tu navegador

Suelta un archivo de base de datos SQLite (.db, .sqlite, .sqlite3) o el SQL que escribe .dump de sqlite3, y descarga un script de PostgreSQL con las mismas tablas, claves, índices y datos. Cada columna recibe el tipo en el que caben sus valores, y cada valor que PostgreSQL no puede guardar tal cual aparece en el informe.

[Guía de migración de SQLite a PostgreSQL](https://intosql.com/docs/migrations/sqlite-to-postgresql)

[Tipos de datos de SQLite a PostgreSQL](https://intosql.com/docs/types/sqlite-to-postgresql)

## Qué cambia de SQLite a PostgreSQL

Cada fila es una regla que aplica el convertidor, con la línea que escribe en el informe cuando la regla cambia algo en tus datos.

| En SQLite | En PostgreSQL | Línea del informe |
| --- | --- | --- |
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | el tipo en el que caben todos los valores de la columna |  |
| BOOLEAN, BOOL | boolean |  |
| TEXT, VARCHAR(n), CHAR(n), CLOB | varchar(n) cuando cada valor cabe en la longitud declarada, si no text |  |
| DECIMAL(p,s), NUMERIC | el tipo exacto cuando cada valor cabe en él, si no un double |  |
| BLOB, and columns holding bytes | bytea |  |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | date, timestamp |  |
| JSON holding JSON text | jsonb |  |
| Infinity in REAL columns | Infinity, como lo guarda el double de PostgreSQL |  |
| INTEGER PRIMARY KEY, AUTOINCREMENT | GENERATED BY DEFAULT AS IDENTITY, siguiendo después del id más alto o del valor de sqlite_sequence |  |
| COLLATE NOCASE | comparación exacta | `case_insensitive_collation` |
| generated columns | STORED | `virtual_as_stored` |
| generated columns with functions IntoSQL doesn't write, and the || operator | una columna simple | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (strftime, randomblob) | sin valor predeterminado | `default_not_translated` |
| CHECK constraints | traducidos |  |
| CHECK constraints with functions IntoSQL doesn't write | no se crea | `check_skipped` |
| partial and expression indexes | no se crea | `index_skipped` |
| foreign keys (unenforced unless PRAGMA foreign_keys=ON) | claves foráneas, NOT VALID y luego validadas |  |
| foreign keys to tables the dump doesn't create | no se crea | `foreign_key_skipped` |
| primary keys holding NULL, and NOT NULL columns with values that become NULL | sin NOT NULL | `not_null_relaxed` |
| views, triggers and virtual tables (FTS, R*Tree) | listados en el informe | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | tipos leídos de los valores | `no_schema` |
| expressions in INSERT values other than the text functions dumps write | NULL | `expression_value` |
| NUL characters in text | se quita | `nul_removed` |
| text that isn't valid UTF-8 | los bytes incorrectos como carácter de reemplazo | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | se copia tal cual | `mojibake_suspected` |

## Carga el script en PostgreSQL

El script crea las tablas, copia las filas y luego agrega claves, índices y claves foráneas, así que carga rápido y se detiene en el primer error.

```shell
psql -v ON_ERROR_STOP=1 -d mydb -f sqlite.postgresql.sql
```

Las claves foráneas se agregan como NOT VALID y luego se validan. Si una fila apunta a una fila que no existe, el script te dice qué restricción es, en lugar de fallar a medias.

Para un volcado grande, crea primero la base de datos y ejecuta el script con psql desde la misma máquina que el servidor.

IntoSQL Pro carga el archivo directo en PostgreSQL desde la app de escritorio o la línea de comandos, sin escribir un script.

## Haz el volcado de SQLite para el mejor resultado

El convertidor lee lo que contiene el volcado. Estas opciones conservan más de tus datos en él:

- El archivo de la base de datos se convierte tal cual, leído página por página en tu navegador. Cierra primero la app que escribe en él, para que ningún cambio se quede en su archivo -wal.
- sqlite3 app.db .dump > app.sql escribe la misma base de datos como SQL, que también se convierte, en .sql o .sql.gz.
- DB Browser for SQLite escribe ese SQL con File, Export, Database to SQL file, y también lo hace iterdump() de Python.

## Qué no se convierte

Las vistas y los disparadores se escriben en el lenguaje propio de SQLite. Aparecen en el informe por nombre, nunca se descartan en silencio, para que puedas reescribirlos para PostgreSQL. Las tablas virtuales, como FTS5 y R*Tree, también aparecen, y sus tablas internas se dejan fuera.

## Preguntas sobre SQLite a PostgreSQL

### ¿Se sube mi volcado?

No. El convertidor se ejecuta en tu navegador y lee el volcado de tu disco por partes, así que nunca sale de tu computadora. La app de escritorio y la línea de comandos también convierten en tu computadora.

### ¿Qué tan grande puede ser el volcado?

El convertidor nunca tiene todo el volcado en memoria: lee el archivo dos veces, por rangos, y escribe el script sobre la marcha. Los volcados de varios gigabytes se convierten en el navegador, en la app de escritorio y con la línea de comandos.

### ¿Puedo convertir directamente el archivo .db?

Sí. Suelta el archivo .db, .sqlite o .sqlite3: se lee en tu navegador y nunca se sube. El texto con caracteres NUL y cada dígito de un double llegan tal como están guardados, algo que un .dump puede recortar.

### ¿De qué versiones de SQLite puede venir el volcado?

Archivos de base de datos de SQLite 3.0 en adelante, en UTF-8 o UTF-16, y volcados del .dump del shell sqlite3 o de iterdump() de Python. Cada archivo y volcado de prueba viene de sqlite3 3.31 a 3.54, con tablas STRICT y WITHOUT ROWID incluidas, y se compara con su origen celda por celda.

### ¿Cómo se deciden los tipos de columna si SQLite no los aplica?

El tipo declarado es una pista y los valores deciden: una columna se vuelve integer, numeric, double precision, date, timestamp, boolean, bytea o text cuando cada valor cabe en ese tipo. Una columna con valores mezclados conserva su texto, y el informe dice cuáles.

### ¿Se conservan INTEGER PRIMARY KEY y AUTOINCREMENT?

Sí. Una INTEGER PRIMARY KEY se vuelve una columna de identidad, cada fila conserva su id, y el siguiente id sigue después del más alto, o después del valor de sqlite_sequence con AUTOINCREMENT.

### ¿Qué pasa con las vistas y los disparadores?

Aparecen en el informe por nombre y no se convierten, porque cada base de datos los escribe en su propio lenguaje.

### ¿En qué versiones de PostgreSQL carga el script?

PostgreSQL 13 a 18. El mismo script carga en cada una, y se detiene en el primer error si algo sale mal.

## Desde SQLite

- [SQLite a MySQL](https://intosql.com/es/sqlite-a-mysql)
- [SQLite a MariaDB](https://intosql.com/es/sqlite-a-mariadb)
- [SQLite a SQLite](https://intosql.com/es/sqlite-a-sqlite)
- [SQLite a SQL Server](https://intosql.com/es/sqlite-a-sql-server)
- [SQLite a Oracle](https://intosql.com/es/sqlite-a-oracle)

## Hacia PostgreSQL

- [MySQL a PostgreSQL](https://intosql.com/es/mysql-a-postgresql)
- [MariaDB a PostgreSQL](https://intosql.com/es/mariadb-a-postgresql)
- [PostgreSQL a PostgreSQL](https://intosql.com/es/postgresql-a-postgresql)
- [SQL Server a PostgreSQL](https://intosql.com/es/sql-server-a-postgresql)
- [Oracle a PostgreSQL](https://intosql.com/es/oracle-a-postgresql)

## Guía y todos los pares

- [PostgreSQL a SQLite](https://intosql.com/es/postgresql-a-sqlite)
- [Guía de migración de SQLite a PostgreSQL](https://intosql.com/docs/migrations/sqlite-to-postgresql)
- [Tipos de datos de SQLite a PostgreSQL](https://intosql.com/docs/types/sqlite-to-postgresql)
- [Todos los pares de bases de datos](https://intosql.com/es/migracion-de-bases-de-datos)
