Saltar al contenido
Inicio de IntoSQL

Pasa una base de datos SQLite a un SQLite más antiguo o más nuevo

Suelta un archivo de base de datos SQLite (.db, .sqlite, .sqlite3) o el SQL que escribe .dump de sqlite3, y descarga un script que carga en SQLite 3.31 y posteriores. Cada columna conserva su tipo declarado y su collation, STRICT se omite para que las versiones anteriores acepten las tablas, y cada cambio aparece en el informe.

Tu archivo
sqlshop_2024_sqlite.sqlArchivo de ejemplo, 3,4 kB
Tu base de datos

18 filas convertidas, sin correcciones, ninguna rechazada

Mostrar

Tablas en shop_2024_sqlite.sqlVolcado de SQLite · escrito por sqlite3 · utf-8

  • customers8 filas
    7 columnas
    idINTEGER not null
    nameTEXT not null
    emailTEXT not null
    countryTEXT not null
    is_activeINTEGER not null
    signed_upDATE
    created_atDATETIME not null
  • orders10 filas
    9 columnas
    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
    receiptBLOB

Sin convertir

  • Vista order_totals
  • Disparador orders_shipped

Cada base de datos los escribe en su propio lenguaje. Reescríbelos para SQLite.

-- Written by IntoSQL from a SQLite dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;

CREATE TABLE customers (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT COLLATE NOCASE NOT NULL,
    country TEXT DEFAULT 'US' NOT NULL,
    is_active INTEGER DEFAULT 1 NOT NULL,
    signed_up DATE,
    created_at DATETIME DEFAULT (datetime('now', 'localtime')) NOT NULL,
    CONSTRAINT customers_is_active_check CHECK (is_active IN (0, 1)),
    CONSTRAINT customers_check1 CHECK (length(country) = 2)
);

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,
    receipt BLOB,
    CONSTRAINT orders_check1 CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled')),
    CONSTRAINT orders_fkey FOREIGN KEY (customer_id) REFERENCES customers (id) ON DELETE CASCADE
);

INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(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, receipt) VALUES
(1,1,'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, receipt) VALUES
(2,2,'paid',54,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁',NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, receipt) VALUES
(3,1,'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind',NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, receipt) VALUES
(4,4,'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放',X'25504446');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, receipt) VALUES
(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door;
ring twice',NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, receipt) VALUES
(6,6,'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"',NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, receipt) VALUES
(7,8,'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL,NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, receipt) VALUES
(8,2,'paid',19.99,1,'2024-03-12 08:00:00',NULL,'Paid at the counter',NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, receipt) VALUES
(9,3,'shipped',64,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded',NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, receipt) VALUES
(10,7,'paid',1499,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf',NULL);

-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE UNIQUE INDEX customers_email 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, 8) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 8 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
UPDATE sqlite_sequence SET seq = max(seq, 10) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 10 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;

Correcciones

No hubo nada que corregir.

Para revisar

  • 2 vistas, disparadores, rutinas o eventos no se convierten; el informe lista cada uno. Vuelve a crearlos a mano en SQLite.

Tu archivo se convierte en esta computadora y nunca se sube.

Otros ejemplos:

Qué cambia entre el archivo y el script

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.

  • declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)

    el tipo en el que caben todos los valores de la columna

    Los mismos tipos declarados, así que los valores se cargan como se guardaron.

  • BOOLEAN, BOOL

    INTEGER 0 o 1 con un CHECK

    Cuando cada valor es 0 o 1; una columna que también tiene otros valores los conserva como números o texto.

  • TEXT, VARCHAR(n), CHAR(n), CLOB

    el tipo declarado, tal cual

    SQLite nunca aplica una longitud; una longitud declarada se mantiene solo cuando cada valor cabe en ella.

  • DECIMAL(p,s), NUMERIC

    el tipo exacto cuando cada valor cabe en él, si no un double

    SQLite los guarda como enteros o doubles; una precisión declarada se mantiene solo cuando los valores caben en ella.

  • BLOB, and columns holding bytes

    BLOB

    Los bytes siguen siendo bytes; el texto y los números de la misma columna se conservan como sus bytes.

  • DATE, DATETIME, TIMESTAMP holding ISO 8601 text

    DATE, DATETIME como texto ISO 8601

    Cuando cada valor es una fecha o una fecha con hora; los números epoch y el resto del texto conservan sus valores tal cual.

  • JSON holding JSON text

    TEXT

    Cuando cada valor es un objeto o un arreglo JSON.

  • Infinity in REAL columns

    9e999, el infinito propio de SQLite

    SQLite escribe el infinito como un literal que desborda, que al cargarse vuelve a ser infinito.

  • INTEGER PRIMARY KEY, AUTOINCREMENT

    INTEGER PRIMARY KEY, se conserva AUTOINCREMENT

    Solo una columna declarada exactamente INTEGER PRIMARY KEY es el rowid; cada fila conserva su id, y el contador empieza después del id más alto que se haya asignado.

  • COLLATE NOCASE

    COLLATE NOCASE

    La misma intercalación.

  • generated columns

    columnas generadas, STORED o VIRTUAL como en el origen

    SQLite las calcula de la misma forma.

  • generated columns with functions IntoSQL doesn't write, and the || operator

    una columna simple

    Una fórmula que no se puede escribir deja una columna simple y una línea en el informe; el volcado no tiene valores para las columnas generadas.

    Línea del informe: generated_not_translated

  • defaults with functions IntoSQL doesn't write (strftime, randomblob)

    sin valor predeterminado

    Un valor predeterminado que no se puede escribir se deja fuera y aparece en el informe; CURRENT_TIMESTAMP y datetime('now') sí se escriben.

    Línea del informe: default_not_translated

  • CHECK constraints

    traducidos

    Los mismos CHECK, comprobados al cargar cada fila.

  • CHECK constraints with functions IntoSQL doesn't write

    no se crea

    Un CHECK que no se puede escribir se deja fuera y aparece en el informe.

    Línea del informe: check_skipped

  • partial and expression indexes

    no se crea

    IntoSQL escribe índices sobre columnas completas; vuelve a crear los demás después de cargar.

    Línea del informe: index_skipped

  • foreign keys (unenforced unless PRAGMA foreign_keys=ON)

    las mismas claves foráneas, listadas por PRAGMA foreign_key_check

    SQLite solo comprueba las claves foráneas cuando se le indica, así que las filas sin padre son comunes: se cargan, y la clave queda sin comprobar con una advertencia en lugar de detener la carga.

  • foreign keys to tables the dump doesn't create

    no se crea

    Una clave no puede nombrar una tabla que no existe.

    Línea del informe: foreign_key_skipped

  • primary keys holding NULL, and NOT NULL columns with values that become NULL

    sin NOT NULL

    SQLite deja que una clave primaria distinta del rowid tenga NULL; la columna no puede ser NOT NULL en el destino, o la carga se detendría.

    Línea del informe: not_null_relaxed

  • views, triggers and virtual tables (FTS, R*Tree)

    listados en el informe

    Su código está escrito en el lenguaje propio de SQLite, y las tablas virtuales necesitan los módulos de SQLite; se listan para que los vuelvas a crear. Sus tablas internas no se copian.

    Línea del informe: not_converted_objects

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

    tipos leídos de los valores

    Un volcado solo de datos solo tiene filas, así que los tipos salen de los valores y las columnas se numeran.

    Línea del informe: no_schema

  • expressions in INSERT values other than the text functions dumps write

    NULL

    unistr(), replace(), char() y || se evalúan tal como los escribe el shell; las demás expresiones no se pueden evaluar sin una base de datos.

    Línea del informe: expression_value

  • NUL characters in text

    se conserva

    El shell sqlite3 y Python cortan el texto en un carácter NUL al volcarlo, así que en el volcado solo está lo que lo precede.

  • text that isn't valid UTF-8

    los bytes incorrectos como carácter de reemplazo

    Los volcados escriben ese texto como bytes sin procesar; el script es UTF-8.

    Línea del informe: invalid_utf8_replaced

  • text decoded twice (ñ)

    se copia tal cual

    El volcado contiene exactamente estos caracteres, así que se copian; el informe los señala.

    Línea del informe: mojibake_suspected

En el archivoEn el scriptLí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 columnaLos mismos tipos declarados, así que los valores se cargan como se guardaron.
BOOLEAN, BOOLINTEGER 0 o 1 con un CHECKCuando cada valor es 0 o 1; una columna que también tiene otros valores los conserva como números o texto.
TEXT, VARCHAR(n), CHAR(n), CLOBel tipo declarado, tal cualSQLite nunca aplica una longitud; una longitud declarada se mantiene solo cuando cada valor cabe en ella.
DECIMAL(p,s), NUMERICel tipo exacto cuando cada valor cabe en él, si no un doubleSQLite los guarda como enteros o doubles; una precisión declarada se mantiene solo cuando los valores caben en ella.
BLOB, and columns holding bytesBLOBLos bytes siguen siendo bytes; el texto y los números de la misma columna se conservan como sus bytes.
DATE, DATETIME, TIMESTAMP holding ISO 8601 textDATE, DATETIME como texto ISO 8601Cuando cada valor es una fecha o una fecha con hora; los números epoch y el resto del texto conservan sus valores tal cual.
JSON holding JSON textTEXTCuando cada valor es un objeto o un arreglo JSON.
Infinity in REAL columns9e999, el infinito propio de SQLiteSQLite escribe el infinito como un literal que desborda, que al cargarse vuelve a ser infinito.
INTEGER PRIMARY KEY, AUTOINCREMENTINTEGER PRIMARY KEY, se conserva AUTOINCREMENTSolo una columna declarada exactamente INTEGER PRIMARY KEY es el rowid; cada fila conserva su id, y el contador empieza después del id más alto que se haya asignado.
COLLATE NOCASECOLLATE NOCASELa misma intercalación.
generated columnscolumnas generadas, STORED o VIRTUAL como en el origenSQLite las calcula de la misma forma.
generated columns with functions IntoSQL doesn't write, and the || operatoruna columna simpleUna fórmula que no se puede escribir deja una columna simple y una línea en el informe; el volcado no tiene valores para las columnas generadas.generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)sin valor predeterminadoUn valor predeterminado que no se puede escribir se deja fuera y aparece en el informe; CURRENT_TIMESTAMP y datetime('now') sí se escriben.default_not_translated
CHECK constraintstraducidosLos mismos CHECK, comprobados al cargar cada fila.
CHECK constraints with functions IntoSQL doesn't writeno se creaUn CHECK que no se puede escribir se deja fuera y aparece en el informe.check_skipped
partial and expression indexesno se creaIntoSQL escribe índices sobre columnas completas; vuelve a crear los demás después de cargar.index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)las mismas claves foráneas, listadas por PRAGMA foreign_key_checkSQLite solo comprueba las claves foráneas cuando se le indica, así que las filas sin padre son comunes: se cargan, y la clave queda sin comprobar con una advertencia en lugar de detener la carga.
foreign keys to tables the dump doesn't createno se creaUna clave no puede nombrar una tabla que no existe.foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULLsin NOT NULLSQLite deja que una clave primaria distinta del rowid tenga NULL; la columna no puede ser NOT NULL en el destino, o la carga se detendría.not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)listados en el informeSu código está escrito en el lenguaje propio de SQLite, y las tablas virtuales necesitan los módulos de SQLite; se listan para que los vuelvas a crear. Sus tablas internas no se copian.not_converted_objects
dumps without CREATE TABLE (--data-only)tipos leídos de los valoresUn volcado solo de datos solo tiene filas, así que los tipos salen de los valores y las columnas se numeran.no_schema
expressions in INSERT values other than the text functions dumps writeNULLunistr(), replace(), char() y || se evalúan tal como los escribe el shell; las demás expresiones no se pueden evaluar sin una base de datos.expression_value
NUL characters in textse conservaEl shell sqlite3 y Python cortan el texto en un carácter NUL al volcarlo, así que en el volcado solo está lo que lo precede.
text that isn't valid UTF-8los bytes incorrectos como carácter de reemplazoLos volcados escriben ese texto como bytes sin procesar; el script es UTF-8.invalid_utf8_replaced
text decoded twice (ñ)se copia tal cualEl volcado contiene exactamente estos caracteres, así que se copian; el informe los señala.mojibake_suspected

Carga el script en SQLite

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.

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

Las claves foráneas se declaran en cada tabla y las filas se cargan con la comprobación de claves foráneas desactivada. Luego el script lista cada fila que apunta a una fila que no existe, en lugar de fallar a medias.

Para un volcado grande, carga en un archivo nuevo en un disco local. El script carga todo en una sola transacción con la sincronización desactivada, así que va a la velocidad del disco, y una carga que se detiene a medias no deja tablas incompletas.

La línea de comandos carga el archivo directo en una base de datos SQLite, sin escribir un script. Es gratis.

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, disparadores, procedimientos, funciones y otros objetos escritos en el propio lenguaje de SQLite aparecen en el informe por nombre, nunca se descartan en silencio, para que revises cada uno contra la versión de SQLite en la que cargas antes de recrearlo.

Preguntas sobre pasar SQLite entre versiones

¿No encuentras la respuesta? Escríbenos desde la página de contacto y te responde una persona. Página de contacto

¿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?

Cada columna conserva su tipo declarado, y lo mismo COLLATE NOCASE y RTRIM. STRICT se deja fuera, así que el script carga en todas las versiones desde la 3.31.

¿Se conservan INTEGER PRIMARY KEY y AUTOINCREMENT?

Sí. INTEGER PRIMARY KEY y AUTOINCREMENT se quedan tal cual, y sqlite_sequence sigue donde lo dejó el volcado.

¿Qué pasa con las vistas y los disparadores?

Aparecen en el informe por nombre y no se convierten, para que puedas volver a crearlos una vez cargadas las tablas.

¿En qué versiones de SQLite carga el script?

SQLite 3.31 y posteriores. Cada archivo y volcado de prueba carga en 3.31 y 3.54, y se detiene en el primer error si algo sale mal.