Pindahkan database SQLite ke SQLite versi lebih lama atau lebih baru
Letakkan file database SQLite (.db, .sqlite, .sqlite3) atau SQL yang ditulis .dump di sqlite3, lalu unduh skrip yang dimuat di SQLite 3.31 dan yang lebih baru. Setiap kolom mempertahankan tipe dan collation yang dideklarasikan, STRICT dihilangkan agar versi lama menerima tabelnya, dan setiap perubahan dicantumkan di laporan.
18 baris dikonversi, tanpa perbaikan, tidak ada yang ditolak
Tabel di shop_2024_sqlite.sqlDump SQLite · ditulis oleh sqlite3 · utf-8
customers8 baris
7 kolom id INTEGER not null name TEXT not null email TEXT not null country TEXT not null is_active INTEGER not null signed_up DATE created_at DATETIME not null orders10 baris
9 kolom 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 receipt BLOB
Tidak dikonversi
- View order_totals
- Trigger orders_shipped
Setiap database menulis objek ini dalam bahasanya sendiri. Tulis ulang untuk 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;
Perbaikan
Tidak ada yang perlu diperbaiki.
Perlu diperiksa
- 2 view, trigger, rutin, atau event tidak dikonversi; laporan mencantumkan masing-masing. Buat ulang secara manual di SQLite.
File Anda dikonversi di komputer ini dan tidak pernah diunggah.
Contoh lain:
Apa yang berubah antara file dan skrip
Setiap baris adalah aturan yang diterapkan konverter, beserta baris laporan yang ditulisnya saat aturan itu mengubah sesuatu di data Anda.
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)
tipe yang memuat setiap nilai di kolom
Tipe yang dideklarasikan sama, jadi nilai dimuat sebagaimana disimpan.
BOOLEAN, BOOL
INTEGER 0 atau 1 dengan CHECK
Jika setiap nilai adalah 0 atau 1; kolom yang juga berisi nilai lain mempertahankannya sebagai angka atau teks.
TEXT, VARCHAR(n), CHAR(n), CLOB
tipe yang dideklarasikan, dipertahankan apa adanya
SQLite tidak pernah menerapkan panjang; panjang yang dideklarasikan hanya berlaku jika setiap nilai muat di dalamnya.
DECIMAL(p,s), NUMERIC
tipe eksak jika setiap nilai muat di dalamnya, selain itu double
SQLite menyimpannya sebagai bilangan bulat atau double; presisi yang dideklarasikan hanya berlaku jika nilainya muat.
BLOB, and columns holding bytes
BLOB
Byte tetap byte; teks dan angka di kolom yang sama disimpan sebagai byte-nya.
DATE, DATETIME, TIMESTAMP holding ISO 8601 text
DATE, DATETIME sebagai teks ISO 8601
Jika setiap nilai adalah tanggal atau tanggal dan waktu; angka epoch dan teks lain mempertahankan nilainya apa adanya.
JSON holding JSON text
TEXT
Jika setiap nilai adalah objek atau array JSON.
Infinity in REAL columns
9e999, infinity milik SQLite
SQLite menulis infinity sebagai literal yang melampaui batas, yang dimuat kembali sebagai infinity.
INTEGER PRIMARY KEY, AUTOINCREMENT
INTEGER PRIMARY KEY, AUTOINCREMENT dipertahankan
Hanya kolom yang dideklarasikan persis INTEGER PRIMARY KEY yang menjadi rowid; setiap baris mempertahankan id-nya, dan penghitung mulai setelah id tertinggi yang pernah diberikan.
COLLATE NOCASE
COLLATE NOCASE
Collation yang sama.
generated columns
kolom generated, STORED atau VIRTUAL seperti di sumber
SQLite menghitungnya dengan cara yang sama.
generated columns with functions IntoSQL doesn't write, and the || operator
kolom biasa
Rumus yang tidak bisa ditulis menyisakan kolom biasa dan satu baris laporan; dump tidak berisi nilai untuk kolom generated.
Baris laporan: generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)
tanpa default
Default yang tidak bisa ditulis dihilangkan dan dilaporkan; CURRENT_TIMESTAMP dan datetime('now') tetap ditulis.
Baris laporan: default_not_translated
CHECK constraints
diterjemahkan
CHECK yang sama, diuji saat setiap baris dimuat.
CHECK constraints with functions IntoSQL doesn't write
tidak dibuat
CHECK yang tidak bisa ditulis dihilangkan dan dilaporkan.
Baris laporan: check_skipped
partial and expression indexes
tidak dibuat
IntoSQL menulis indeks pada kolom utuh; buat ulang indeks lainnya setelah pemuatan.
Baris laporan: index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)
foreign key yang sama, dicantumkan oleh PRAGMA foreign_key_check
SQLite hanya memeriksa foreign key jika diminta, jadi baris tanpa induk sering ada: baris itu dimuat, dan key dibiarkan tidak diperiksa dengan peringatan, bukan menghentikan pemuatan.
foreign keys to tables the dump doesn't create
tidak dibuat
Key tidak bisa merujuk ke tabel yang tidak ada.
Baris laporan: foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULL
NOT NULL dihapus
SQLite membolehkan primary key selain rowid berisi NULL; kolom itu tidak bisa NOT NULL di tujuan, atau pemuatan akan berhenti.
Baris laporan: not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)
dicantumkan di laporan
Kodenya ditulis dalam bahasa SQLite sendiri, dan tabel virtual membutuhkan modul SQLite; semuanya dicantumkan agar Anda bisa membuatnya ulang. Tabel internalnya tidak disalin.
Baris laporan: not_converted_objects
dumps without CREATE TABLE (--data-only)
tipe dibaca dari nilai
Dump yang hanya berisi data hanya punya baris, jadi tipenya diambil dari nilai dan kolomnya diberi nomor.
Baris laporan: no_schema
expressions in INSERT values other than the text functions dumps write
NULL
unistr(), replace(), char(), dan || dievaluasi sebagaimana shell menulisnya; ekspresi lain tidak bisa dievaluasi tanpa database.
Baris laporan: expression_value
NUL characters in text
dipertahankan
Shell sqlite3 dan Python memotong teks di karakter NUL saat membuat dump, jadi hanya bagian sebelumnya yang ada di dump.
text that isn't valid UTF-8
byte yang rusak menjadi karakter pengganti
Dump menulis teks seperti itu sebagai byte mentah; skripnya berupa UTF-8.
Baris laporan: invalid_utf8_replaced
text decoded twice (ñ)
disalin apa adanya
Dump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.
Baris laporan: mojibake_suspected
| Di file | Di skrip | Baris laporan |
|---|---|---|
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | tipe yang memuat setiap nilai di kolomTipe yang dideklarasikan sama, jadi nilai dimuat sebagaimana disimpan. | |
| BOOLEAN, BOOL | INTEGER 0 atau 1 dengan CHECKJika setiap nilai adalah 0 atau 1; kolom yang juga berisi nilai lain mempertahankannya sebagai angka atau teks. | |
| TEXT, VARCHAR(n), CHAR(n), CLOB | tipe yang dideklarasikan, dipertahankan apa adanyaSQLite tidak pernah menerapkan panjang; panjang yang dideklarasikan hanya berlaku jika setiap nilai muat di dalamnya. | |
| DECIMAL(p,s), NUMERIC | tipe eksak jika setiap nilai muat di dalamnya, selain itu doubleSQLite menyimpannya sebagai bilangan bulat atau double; presisi yang dideklarasikan hanya berlaku jika nilainya muat. | |
| BLOB, and columns holding bytes | BLOBByte tetap byte; teks dan angka di kolom yang sama disimpan sebagai byte-nya. | |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | DATE, DATETIME sebagai teks ISO 8601Jika setiap nilai adalah tanggal atau tanggal dan waktu; angka epoch dan teks lain mempertahankan nilainya apa adanya. | |
| JSON holding JSON text | TEXTJika setiap nilai adalah objek atau array JSON. | |
| Infinity in REAL columns | 9e999, infinity milik SQLiteSQLite menulis infinity sebagai literal yang melampaui batas, yang dimuat kembali sebagai infinity. | |
| INTEGER PRIMARY KEY, AUTOINCREMENT | INTEGER PRIMARY KEY, AUTOINCREMENT dipertahankanHanya kolom yang dideklarasikan persis INTEGER PRIMARY KEY yang menjadi rowid; setiap baris mempertahankan id-nya, dan penghitung mulai setelah id tertinggi yang pernah diberikan. | |
| COLLATE NOCASE | COLLATE NOCASECollation yang sama. | |
| generated columns | kolom generated, STORED atau VIRTUAL seperti di sumberSQLite menghitungnya dengan cara yang sama. | |
| generated columns with functions IntoSQL doesn't write, and the || operator | kolom biasaRumus yang tidak bisa ditulis menyisakan kolom biasa dan satu baris laporan; dump tidak berisi nilai untuk kolom generated. | generated_not_translated |
| defaults with functions IntoSQL doesn't write (strftime, randomblob) | tanpa defaultDefault yang tidak bisa ditulis dihilangkan dan dilaporkan; CURRENT_TIMESTAMP dan datetime('now') tetap ditulis. | default_not_translated |
| CHECK constraints | diterjemahkanCHECK yang sama, diuji saat setiap baris dimuat. | |
| CHECK constraints with functions IntoSQL doesn't write | tidak dibuatCHECK yang tidak bisa ditulis dihilangkan dan dilaporkan. | check_skipped |
| partial and expression indexes | tidak dibuatIntoSQL menulis indeks pada kolom utuh; buat ulang indeks lainnya setelah pemuatan. | index_skipped |
| foreign keys (unenforced unless PRAGMA foreign_keys=ON) | foreign key yang sama, dicantumkan oleh PRAGMA foreign_key_checkSQLite hanya memeriksa foreign key jika diminta, jadi baris tanpa induk sering ada: baris itu dimuat, dan key dibiarkan tidak diperiksa dengan peringatan, bukan menghentikan pemuatan. | |
| foreign keys to tables the dump doesn't create | tidak dibuatKey tidak bisa merujuk ke tabel yang tidak ada. | foreign_key_skipped |
| primary keys holding NULL, and NOT NULL columns with values that become NULL | NOT NULL dihapusSQLite membolehkan primary key selain rowid berisi NULL; kolom itu tidak bisa NOT NULL di tujuan, atau pemuatan akan berhenti. | not_null_relaxed |
| views, triggers and virtual tables (FTS, R*Tree) | dicantumkan di laporanKodenya ditulis dalam bahasa SQLite sendiri, dan tabel virtual membutuhkan modul SQLite; semuanya dicantumkan agar Anda bisa membuatnya ulang. Tabel internalnya tidak disalin. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | tipe dibaca dari nilaiDump yang hanya berisi data hanya punya baris, jadi tipenya diambil dari nilai dan kolomnya diberi nomor. | no_schema |
| expressions in INSERT values other than the text functions dumps write | NULLunistr(), replace(), char(), dan || dievaluasi sebagaimana shell menulisnya; ekspresi lain tidak bisa dievaluasi tanpa database. | expression_value |
| NUL characters in text | dipertahankanShell sqlite3 dan Python memotong teks di karakter NUL saat membuat dump, jadi hanya bagian sebelumnya yang ada di dump. | |
| text that isn't valid UTF-8 | byte yang rusak menjadi karakter penggantiDump menulis teks seperti itu sebagai byte mentah; skripnya berupa UTF-8. | invalid_utf8_replaced |
| text decoded twice (ñ) | disalin apa adanyaDump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya. | mojibake_suspected |
Muat skrip ke SQLite
Skrip membuat tabel, menyalin baris, lalu menambahkan kunci, indeks, dan foreign key, jadi pemuatan berjalan cepat dan berhenti di galat pertama.
sqlite3 -bail mydb.sqlite < sqlite.sqlite.sqlForeign key dideklarasikan di setiap tabel dan baris dimuat dengan pemeriksaan foreign key nonaktif. Lalu skrip mencantumkan setiap baris yang merujuk ke baris yang tidak ada, bukan gagal di tengah jalan.
Untuk dump yang besar, muat ke file baru di disk lokal. Skrip memuat semuanya dalam satu transaksi dengan sinkronisasi nonaktif, jadi berjalan secepat disk, dan pemuatan yang berhenti di tengah jalan tidak meninggalkan tabel setengah jadi.
Command line memuat file langsung ke database SQLite, tanpa menulis skrip. Gratis.
Buat dump SQLite untuk hasil terbaik
Konverter membaca apa yang ada di dump. Opsi berikut membuat lebih banyak data Anda tetap ada di dalamnya:
- File database itu sendiri dikonversi apa adanya, dibaca halaman demi halaman di browser Anda. Tutup dulu aplikasi yang menulis ke file itu, agar tidak ada perubahan yang tertinggal di file -wal-nya.
- sqlite3 app.db .dump > app.sql menulis database yang sama sebagai SQL, yang juga bisa dikonversi, sebagai .sql atau .sql.gz.
- DB Browser for SQLite menulis SQL itu lewat File, Export, Database to SQL file, begitu juga iterdump() di Python.
Yang tidak dikonversi
View, trigger, procedure, fungsi, dan objek lain yang ditulis dalam bahasa SQLite sendiri dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, jadi Anda bisa memeriksa masing-masing dengan versi SQLite tujuan pemuatan sebelum membuatnya ulang.
Pertanyaan tentang memindahkan SQLite antarversi
Tidak terjawab di sini? Tulis ke kami dari halaman kontak, dan seseorang akan membalas. Halaman kontak
Apakah dump saya diunggah?
Tidak. Konverter berjalan di browser Anda dan membaca dump dari disk Anda sepotong demi sepotong, jadi dump tidak pernah meninggalkan komputer Anda. Aplikasi desktop dan command line juga mengonversi di komputer Anda.
Seberapa besar dump yang bisa dipakai?
Konverter tidak pernah menyimpan seluruh dump di memori: file dibaca dua kali, per rentang, dan skrip ditulis sambil berjalan. Dump berukuran beberapa gigabyte bisa dikonversi di browser, di aplikasi desktop, dan dengan command line.
Bisakah saya mengonversi file .db secara langsung?
Ya. Letakkan file .db, .sqlite, atau .sqlite3: file dibaca di browser Anda dan tidak pernah diunggah. Teks dengan karakter NUL dan setiap digit nilai double tiba persis seperti tersimpan, sesuatu yang bisa terpotong oleh .dump.
Dump dari versi SQLite mana yang bisa dipakai?
File database dari SQLite 3.0 ke atas, dalam UTF-8 atau UTF-16, serta dump dari .dump di shell sqlite3 atau dari iterdump() di Python. Setiap file dan dump uji berasal dari sqlite3 3.31 sampai 3.54, termasuk tabel STRICT dan WITHOUT ROWID, dan dibandingkan dengan sumbernya sel demi sel.
Bagaimana tipe kolom ditentukan jika SQLite tidak menerapkannya?
Setiap kolom mempertahankan tipe yang dideklarasikan, begitu juga COLLATE NOCASE dan RTRIM. STRICT tidak disertakan, sehingga skrip dimuat di setiap versi sejak 3.31.
Apakah INTEGER PRIMARY KEY dan AUTOINCREMENT dipertahankan?
Ya. INTEGER PRIMARY KEY dan AUTOINCREMENT tetap apa adanya, dan sqlite_sequence berlanjut dari posisi terakhir di dump.
Bagaimana dengan view dan trigger?
Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, sehingga Anda bisa membuatnya ulang setelah tabel dimuat.
Di versi SQLite mana skrip bisa dimuat?
SQLite 3.31 dan yang lebih baru. Setiap file dan dump uji dimuat di 3.31 dan 3.54, dan berhenti di galat pertama jika ada yang salah.