Przejdź do treści
Strona główna IntoSQL

Przenieś bazę SQLite do starszej lub nowszej wersji SQLite

Upuść plik bazy danych SQLite (.db, .sqlite, .sqlite3) albo SQL zapisany przez .dump w sqlite3 i pobierz skrypt, który ładuje się na SQLite 3.31 i nowszych. Każda kolumna zachowuje zadeklarowany typ i collation, STRICT jest pomijane, żeby starsze wersje akceptowały tabele, a każda zmiana jest wymieniona w raporcie.

Twój plik
sqlshop_2024_sqlite.sqlPlik przykładowy, 3,4 kB
Twoja baza danych

18 wierszy przekonwertowanych, bez poprawek, brak odrzuconych

Pokaż

Tabele w pliku shop_2024_sqlite.sqlZrzut SQLite · zapisany przez sqlite3 · utf-8

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

Nieprzekonwertowane

  • Widok order_totals
  • Wyzwalacz orders_shipped

Każda baza danych zapisuje je we własnym języku. Przepisz je dla 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;

Poprawki

Nic nie wymagało poprawek.

Do sprawdzenia

  • Widoki, wyzwalacze, procedury i zdarzenia nie są konwertowane: 2 obiekty, każdy wymieniony w raporcie. Utwórz je ręcznie w SQLite.

Plik jest konwertowany na tym komputerze i nigdy nie jest wysyłany.

Inne przykłady:

Co się zmienia między plikiem a skryptem

Każdy wiersz to reguła stosowana przez konwerter, z wpisem, który dodaje do raportu, gdy reguła coś zmienia w twoich danych.

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

    typ, w którym mieści się każda wartość kolumny

    Te same zadeklarowane typy, więc wartości ładują się tak, jak były zapisane.

  • BOOLEAN, BOOL

    INTEGER 0 lub 1 z CHECK

    Gdy każda wartość to 0 lub 1; kolumna, która zawiera też inne wartości, zachowuje je jako liczby lub tekst.

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

    zadeklarowany typ, bez zmian

    SQLite nigdy nie wymusza długości; zadeklarowana długość obowiązuje tylko wtedy, gdy mieści się w niej każda wartość.

  • DECIMAL(p,s), NUMERIC

    dokładny typ, gdy mieści się w nim każda wartość, w przeciwnym razie double

    SQLite przechowuje je jako liczby całkowite lub double; zadeklarowana precyzja obowiązuje tylko wtedy, gdy wartości się w niej mieszczą.

  • BLOB, and columns holding bytes

    BLOB

    Bajty pozostają bajtami; tekst i liczby w tej samej kolumnie są zachowywane jako ich bajty.

  • DATE, DATETIME, TIMESTAMP holding ISO 8601 text

    DATE, DATETIME jako tekst ISO 8601

    Gdy każda wartość to data lub data z godziną; liczby epoch i inny tekst zachowują swoje wartości bez zmian.

  • JSON holding JSON text

    TEXT

    Gdy każda wartość to obiekt lub tablica JSON.

  • Infinity in REAL columns

    9e999, własna nieskończoność SQLite

    SQLite zapisuje nieskończoność jako przepełniający się literał, który ładuje się z powrotem jako nieskończoność.

  • INTEGER PRIMARY KEY, AUTOINCREMENT

    INTEGER PRIMARY KEY, AUTOINCREMENT zachowane

    Tylko kolumna zadeklarowana dokładnie jako INTEGER PRIMARY KEY jest rowid; każdy wiersz zachowuje swoje id, a licznik zaczyna po najwyższym kiedykolwiek wydanym id.

  • COLLATE NOCASE

    COLLATE NOCASE

    Ta sama reguła porównywania.

  • generated columns

    kolumny generowane, STORED lub VIRTUAL jak w źródle

    SQLite oblicza je tak samo.

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

    zwykła kolumna

    Formuła, której nie da się zapisać, zostawia zwykłą kolumnę i wpis w raporcie; zrzut nie zawiera wartości kolumn generowanych.

    Wpis w raporcie: generated_not_translated

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

    brak wartości domyślnej

    Wartość domyślna, której nie da się zapisać, jest pomijana i zgłaszana w raporcie; CURRENT_TIMESTAMP i datetime('now') są zapisywane.

    Wpis w raporcie: default_not_translated

  • CHECK constraints

    przetłumaczone

    Te same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza.

  • CHECK constraints with functions IntoSQL doesn't write

    nie jest tworzone

    Ograniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie.

    Wpis w raporcie: check_skipped

  • partial and expression indexes

    nie jest tworzone

    IntoSQL zapisuje indeksy na całych kolumnach; pozostałe utwórz ponownie po załadowaniu.

    Wpis w raporcie: index_skipped

  • foreign keys (unenforced unless PRAGMA foreign_keys=ON)

    te same klucze obce, wypisywane przez PRAGMA foreign_key_check

    SQLite sprawdza klucze obce tylko na żądanie, więc wiersze bez rodzica są częste: ładują się, a klucz zostaje niesprawdzony z ostrzeżeniem, zamiast zatrzymać ładowanie.

  • foreign keys to tables the dump doesn't create

    nie jest tworzone

    Klucz nie może wskazywać tabeli, której nie ma.

    Wpis w raporcie: foreign_key_skipped

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

    NOT NULL usunięte

    SQLite pozwala, by klucz główny inny niż rowid zawierał NULL; kolumna nie może być NOT NULL w bazie docelowej, bo ładowanie by się zatrzymało.

    Wpis w raporcie: not_null_relaxed

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

    wymienione w raporcie

    Ich kod jest napisany we własnym języku SQLite, a tabele wirtualne wymagają modułów SQLite; trafiają na listę do ręcznego odtworzenia. Ich wewnętrzne tabele nie są kopiowane.

    Wpis w raporcie: not_converted_objects

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

    typy odczytane z wartości

    Zrzut samych danych zawiera tylko wiersze, więc typy pochodzą z wartości, a kolumny są numerowane.

    Wpis w raporcie: no_schema

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

    NULL

    unistr(), replace(), char() i || są obliczane tak, jak zapisuje je powłoka; innych wyrażeń nie da się obliczyć bez bazy danych.

    Wpis w raporcie: expression_value

  • NUL characters in text

    zachowane

    Powłoka sqlite3 i Python obcinają tekst na znaku NUL podczas zrzutu, więc w zrzucie jest tylko to, co go poprzedza.

  • text that isn't valid UTF-8

    błędne bajty jako znak zastępczy

    Zrzuty zapisują taki tekst jako surowe bajty; skrypt jest w UTF-8.

    Wpis w raporcie: invalid_utf8_replaced

  • text decoded twice (ñ)

    skopiowane bez zmian

    Zrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.

    Wpis w raporcie: mojibake_suspected

W plikuW skrypcieWpis w raporcie
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)typ, w którym mieści się każda wartość kolumnyTe same zadeklarowane typy, więc wartości ładują się tak, jak były zapisane.
BOOLEAN, BOOLINTEGER 0 lub 1 z CHECKGdy każda wartość to 0 lub 1; kolumna, która zawiera też inne wartości, zachowuje je jako liczby lub tekst.
TEXT, VARCHAR(n), CHAR(n), CLOBzadeklarowany typ, bez zmianSQLite nigdy nie wymusza długości; zadeklarowana długość obowiązuje tylko wtedy, gdy mieści się w niej każda wartość.
DECIMAL(p,s), NUMERICdokładny typ, gdy mieści się w nim każda wartość, w przeciwnym razie doubleSQLite przechowuje je jako liczby całkowite lub double; zadeklarowana precyzja obowiązuje tylko wtedy, gdy wartości się w niej mieszczą.
BLOB, and columns holding bytesBLOBBajty pozostają bajtami; tekst i liczby w tej samej kolumnie są zachowywane jako ich bajty.
DATE, DATETIME, TIMESTAMP holding ISO 8601 textDATE, DATETIME jako tekst ISO 8601Gdy każda wartość to data lub data z godziną; liczby epoch i inny tekst zachowują swoje wartości bez zmian.
JSON holding JSON textTEXTGdy każda wartość to obiekt lub tablica JSON.
Infinity in REAL columns9e999, własna nieskończoność SQLiteSQLite zapisuje nieskończoność jako przepełniający się literał, który ładuje się z powrotem jako nieskończoność.
INTEGER PRIMARY KEY, AUTOINCREMENTINTEGER PRIMARY KEY, AUTOINCREMENT zachowaneTylko kolumna zadeklarowana dokładnie jako INTEGER PRIMARY KEY jest rowid; każdy wiersz zachowuje swoje id, a licznik zaczyna po najwyższym kiedykolwiek wydanym id.
COLLATE NOCASECOLLATE NOCASETa sama reguła porównywania.
generated columnskolumny generowane, STORED lub VIRTUAL jak w źródleSQLite oblicza je tak samo.
generated columns with functions IntoSQL doesn't write, and the || operatorzwykła kolumnaFormuła, której nie da się zapisać, zostawia zwykłą kolumnę i wpis w raporcie; zrzut nie zawiera wartości kolumn generowanych.generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)brak wartości domyślnejWartość domyślna, której nie da się zapisać, jest pomijana i zgłaszana w raporcie; CURRENT_TIMESTAMP i datetime('now') są zapisywane.default_not_translated
CHECK constraintsprzetłumaczoneTe same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza.
CHECK constraints with functions IntoSQL doesn't writenie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie.check_skipped
partial and expression indexesnie jest tworzoneIntoSQL zapisuje indeksy na całych kolumnach; pozostałe utwórz ponownie po załadowaniu.index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)te same klucze obce, wypisywane przez PRAGMA foreign_key_checkSQLite sprawdza klucze obce tylko na żądanie, więc wiersze bez rodzica są częste: ładują się, a klucz zostaje niesprawdzony z ostrzeżeniem, zamiast zatrzymać ładowanie.
foreign keys to tables the dump doesn't createnie jest tworzoneKlucz nie może wskazywać tabeli, której nie ma.foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULLNOT NULL usunięteSQLite pozwala, by klucz główny inny niż rowid zawierał NULL; kolumna nie może być NOT NULL w bazie docelowej, bo ładowanie by się zatrzymało.not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)wymienione w raporcieIch kod jest napisany we własnym języku SQLite, a tabele wirtualne wymagają modułów SQLite; trafiają na listę do ręcznego odtworzenia. Ich wewnętrzne tabele nie są kopiowane.not_converted_objects
dumps without CREATE TABLE (--data-only)typy odczytane z wartościZrzut samych danych zawiera tylko wiersze, więc typy pochodzą z wartości, a kolumny są numerowane.no_schema
expressions in INSERT values other than the text functions dumps writeNULLunistr(), replace(), char() i || są obliczane tak, jak zapisuje je powłoka; innych wyrażeń nie da się obliczyć bez bazy danych.expression_value
NUL characters in textzachowanePowłoka sqlite3 i Python obcinają tekst na znaku NUL podczas zrzutu, więc w zrzucie jest tylko to, co go poprzedza.
text that isn't valid UTF-8błędne bajty jako znak zastępczyZrzuty zapisują taki tekst jako surowe bajty; skrypt jest w UTF-8.invalid_utf8_replaced
text decoded twice (ñ)skopiowane bez zmianZrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.mojibake_suspected

Załaduj skrypt do SQLite

Skrypt tworzy tabele, kopiuje wiersze, a potem dodaje klucze, indeksy i klucze obce, więc ładuje się szybko i zatrzymuje przy pierwszym błędzie.

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

Klucze obce są deklarowane w każdej tabeli, a wiersze ładują się z wyłączonym sprawdzaniem kluczy obcych. Potem skrypt wypisuje każdy wiersz, który wskazuje na nieistniejący wiersz, zamiast przerwać w połowie.

Duży zrzut ładuj do nowego pliku na dysku lokalnym. Skrypt ładuje wszystko w jednej transakcji z wyłączoną synchronizacją, więc działa z szybkością dysku, a przerwane ładowanie nie zostawia niepełnych tabel.

Wiersz poleceń ładuje plik prosto do bazy SQLite, bez pisania skryptu. To nic nie kosztuje.

Jak zrobić zrzut SQLite dla najlepszego wyniku

Konwerter odczytuje to, co zawiera zrzut. Te opcje zachowują w nim więcej twoich danych:

  • Sam plik bazy danych konwertuje się bez zmian, odczytywany strona po stronie w przeglądarce. Najpierw zamknij aplikację, która do niego zapisuje, żeby żadna zmiana nie została w jego pliku -wal.
  • sqlite3 app.db .dump > app.sql zapisuje tę samą bazę danych jako SQL, który też się konwertuje, jako .sql lub .sql.gz.
  • DB Browser for SQLite zapisuje ten SQL przez File, Export, Database to SQL file, podobnie jak iterdump() w Pythonie.

Co nie jest konwertowane

Widoki, wyzwalacze, procedury, funkcje i inne obiekty napisane we własnym języku SQLite są wymienione w raporcie z nazwy i nigdy nie są pomijane po cichu, więc możesz sprawdzić każdy z nich w wersji SQLite, do której ładujesz, zanim go odtworzysz.

Pytania o przenoszenie SQLite między wersjami

Nie ma tu odpowiedzi? Napisz do nas przez stronę kontaktu, a odpowie człowiek. Strona kontaktu

Czy mój zrzut jest wysyłany?

Nie. Konwerter działa w przeglądarce i odczytuje zrzut z dysku po kawałku, więc nigdy nie opuszcza on twojego komputera. Aplikacja na komputer i wiersz poleceń też konwertują na twoim komputerze.

Jak duży może być zrzut?

Konwerter nigdy nie trzyma całego zrzutu w pamięci: czyta plik dwa razy, fragmentami, i zapisuje skrypt na bieżąco. Zrzuty wielogigabajtowe konwertują się w przeglądarce, w aplikacji na komputer i w wierszu poleceń.

Czy mogę przekonwertować sam plik .db?

Tak. Upuść plik .db, .sqlite lub .sqlite3: jest odczytywany w przeglądarce i nigdy nie jest wysyłany. Tekst ze znakami NUL i każda cyfra wartości double docierają tak, jak zostały zapisane, a .dump może je obciąć.

Z jakich wersji SQLite może pochodzić zrzut?

Pliki bazy danych od SQLite 3.0, w UTF-8 lub UTF-16, oraz zrzuty z .dump powłoki sqlite3 lub z iterdump() w Pythonie. Każdy testowy plik i zrzut pochodzi z sqlite3 od 3.31 do 3.54, łącznie z tabelami STRICT i WITHOUT ROWID, i jest porównywany ze źródłem komórka po komórce.

Jak ustalane są typy kolumn, skoro SQLite ich nie wymusza?

Każda kolumna zachowuje zadeklarowany typ, podobnie jak COLLATE NOCASE i RTRIM. STRICT jest pomijane, więc skrypt ładuje się na każdej wersji od 3.31.

Czy INTEGER PRIMARY KEY i AUTOINCREMENT są zachowywane?

Tak. INTEGER PRIMARY KEY i AUTOINCREMENT pozostają bez zmian, a sqlite_sequence kontynuuje od miejsca, w którym skończył zrzut.

A widoki i wyzwalacze?

Raport wymienia je z nazwy, ale nie są konwertowane, więc możesz je odtworzyć, gdy tabele będą już na miejscu.

Na jakich wersjach SQLite ładuje się skrypt?

SQLite 3.31 i nowsze. Każdy testowy plik i zrzut ładuje się na 3.31 i 3.54 i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.