SQLite veritabanını daha eski veya daha yeni bir SQLite sürümüne taşıyın
Bir SQLite veritabanı dosyasını (.db, .sqlite, .sqlite3) ya da sqlite3 .dump komutunun yazdığı SQL'i bırakın ve SQLite 3.31 ve sonrasında yüklenen bir betik indirin. Her sütun bildirilen türünü ve collation'ını korur, eski sürümler tabloları kabul etsin diye STRICT çıkarılır ve her değişiklik raporda listelenir.
18 satır dönüştürüldü, düzeltme yok, reddedilen yok
shop_2024_sqlite.sql içindeki tablolarSQLite dökümü · sqlite3 ile yazıldı · utf-8
customers8 satır
7 sütun 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 satır
9 sütun 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
Dönüştürülmedi
- Görünüm order_totals
- Tetikleyici orders_shipped
Her veritabanı bunları kendi dilinde yazar. Bunları SQLite için yeniden yazın.
-- 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;
Düzeltmeler
Düzeltilecek bir şey yoktu.
Kontrol edilmeli
- 2 görünüm, tetikleyici, rutin veya olay dönüştürülmedi; rapor her birini listeliyor. Bunları SQLite'de elle yeniden oluşturun.
Dosyan bu bilgisayarda dönüştürülür ve asla yüklenmez.
Diğer örnekler:
Dosya ile betik arasında neler değişir
Her satır, dönüştürücünün uyguladığı bir kuraldır; yanında, kural verilerinizde bir şeyi değiştirdiğinde yazılan rapor satırı yer alır.
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)
sütundaki her değerin sığdığı tür
Aynı tanımlanan türler, bu yüzden değerler saklandıkları gibi yüklenir.
BOOLEAN, BOOL
CHECK ile 0 veya 1 INTEGER
Her değer 0 veya 1 olduğunda; başka değerler de içeren bir sütun bunları sayı veya metin olarak korur.
TEXT, VARCHAR(n), CHAR(n), CLOB
tanımlanan tür, olduğu gibi
SQLite uzunluğu hiçbir zaman zorunlu tutmaz; tanımlanan uzunluk yalnızca her değer ona sığıyorsa korunur.
DECIMAL(p,s), NUMERIC
her değer sığıyorsa tam tür, değilse double
SQLite bunları tam sayı veya double olarak saklar; tanımlanan duyarlılık yalnızca değerler ona sığıyorsa korunur.
BLOB, and columns holding bytes
BLOB
Baytlar bayt olarak kalır; aynı sütundaki metin ve sayılar baytları olarak korunur.
DATE, DATETIME, TIMESTAMP holding ISO 8601 text
ISO 8601 metni olarak DATE, DATETIME
Her değer bir tarih veya tarih ve saat olduğunda; epoch sayıları ve diğer metinler değerlerini olduğu gibi korur.
JSON holding JSON text
TEXT
Her değer bir JSON nesnesi veya dizisi olduğunda.
Infinity in REAL columns
9e999, SQLite'ın kendi sonsuzluğu
SQLite sonsuzluğu taşan bir sabit olarak yazar; bu sabit yeniden yüklendiğinde sonsuzluk olur.
INTEGER PRIMARY KEY, AUTOINCREMENT
INTEGER PRIMARY KEY, AUTOINCREMENT korunur
Yalnızca tam olarak INTEGER PRIMARY KEY olarak tanımlanan sütun rowid'dir; her satır kendi id'sini korur ve sayaç, şimdiye kadar verilmiş en yüksek id'den sonra başlar.
COLLATE NOCASE
COLLATE NOCASE
Aynı harmanlama.
generated columns
üretilen sütunlar, kaynaktaki gibi STORED veya VIRTUAL
SQLite bunları aynı şekilde hesaplar.
generated columns with functions IntoSQL doesn't write, and the || operator
düz bir sütun
Yazılamayan bir formül düz bir sütun ve raporda bir satır bırakır; dökümde üretilen sütunlar için değer yoktur.
Rapor satırı: generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)
varsayılan değer yok
Yazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır; CURRENT_TIMESTAMP ve datetime('now') yazılır.
Rapor satırı: default_not_translated
CHECK constraints
çevrilir
Aynı CHECK kısıtları, her satır yüklenirken denetlenir.
CHECK constraints with functions IntoSQL doesn't write
oluşturulmaz
Yazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır.
Rapor satırı: check_skipped
partial and expression indexes
oluşturulmaz
IntoSQL tüm sütunlar üzerinde indeks yazar; diğerlerini yüklemeden sonra yeniden oluşturun.
Rapor satırı: index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)
aynı yabancı anahtarlar, PRAGMA foreign_key_check ile listelenir
SQLite yabancı anahtarları yalnızca istendiğinde denetler, bu yüzden üst satırı olmayan satırlar yaygındır: yüklenirler ve anahtar, yüklemeyi durdurmak yerine bir uyarıyla denetlenmeden bırakılır.
foreign keys to tables the dump doesn't create
oluşturulmaz
Bir anahtar, var olmayan bir tabloya başvuramaz.
Rapor satırı: foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULL
NOT NULL kaldırılır
SQLite, rowid dışındaki bir birincil anahtarın NULL tutmasına izin verir; sütun hedefte NOT NULL olamaz, yoksa yükleme durur.
Rapor satırı: not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)
raporda listelenir
Kodları SQLite'ın kendi dilinde yazılır ve sanal tablolar SQLite'ın modüllerine ihtiyaç duyar; yeniden oluşturabilmeniz için listelenirler. İç tabloları kopyalanmaz.
Rapor satırı: not_converted_objects
dumps without CREATE TABLE (--data-only)
değerlerden okunan türler
Yalnızca veri içeren bir dökümde yalnızca satırlar vardır, bu yüzden türler değerlerden gelir ve sütunlar numaralandırılır.
Rapor satırı: no_schema
expressions in INSERT values other than the text functions dumps write
NULL
unistr(), replace(), char() ve || kabuğun yazdığı biçimde hesaplanır; diğer ifadeler veritabanı olmadan hesaplanamaz.
Rapor satırı: expression_value
NUL characters in text
korunur
sqlite3 kabuğu ve Python, döküm alırken metni bir NUL karakterinde keser, bu yüzden dökümde yalnızca ondan önceki kısım bulunur.
text that isn't valid UTF-8
hatalı baytlar yerine koyma karakteri olarak
Dökümler bu tür metni ham bayt olarak yazar; betik UTF-8'dir.
Rapor satırı: invalid_utf8_replaced
text decoded twice (ñ)
olduğu gibi kopyalanır
Döküm tam olarak bu karakterleri içerir, bu yüzden kopyalanırlar; rapor onları gösterir.
Rapor satırı: mojibake_suspected
| Dosyada | Betikte | Rapor satırı |
|---|---|---|
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | sütundaki her değerin sığdığı türAynı tanımlanan türler, bu yüzden değerler saklandıkları gibi yüklenir. | |
| BOOLEAN, BOOL | CHECK ile 0 veya 1 INTEGERHer değer 0 veya 1 olduğunda; başka değerler de içeren bir sütun bunları sayı veya metin olarak korur. | |
| TEXT, VARCHAR(n), CHAR(n), CLOB | tanımlanan tür, olduğu gibiSQLite uzunluğu hiçbir zaman zorunlu tutmaz; tanımlanan uzunluk yalnızca her değer ona sığıyorsa korunur. | |
| DECIMAL(p,s), NUMERIC | her değer sığıyorsa tam tür, değilse doubleSQLite bunları tam sayı veya double olarak saklar; tanımlanan duyarlılık yalnızca değerler ona sığıyorsa korunur. | |
| BLOB, and columns holding bytes | BLOBBaytlar bayt olarak kalır; aynı sütundaki metin ve sayılar baytları olarak korunur. | |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | ISO 8601 metni olarak DATE, DATETIMEHer değer bir tarih veya tarih ve saat olduğunda; epoch sayıları ve diğer metinler değerlerini olduğu gibi korur. | |
| JSON holding JSON text | TEXTHer değer bir JSON nesnesi veya dizisi olduğunda. | |
| Infinity in REAL columns | 9e999, SQLite'ın kendi sonsuzluğuSQLite sonsuzluğu taşan bir sabit olarak yazar; bu sabit yeniden yüklendiğinde sonsuzluk olur. | |
| INTEGER PRIMARY KEY, AUTOINCREMENT | INTEGER PRIMARY KEY, AUTOINCREMENT korunurYalnızca tam olarak INTEGER PRIMARY KEY olarak tanımlanan sütun rowid'dir; her satır kendi id'sini korur ve sayaç, şimdiye kadar verilmiş en yüksek id'den sonra başlar. | |
| COLLATE NOCASE | COLLATE NOCASEAynı harmanlama. | |
| generated columns | üretilen sütunlar, kaynaktaki gibi STORED veya VIRTUALSQLite bunları aynı şekilde hesaplar. | |
| generated columns with functions IntoSQL doesn't write, and the || operator | düz bir sütunYazılamayan bir formül düz bir sütun ve raporda bir satır bırakır; dökümde üretilen sütunlar için değer yoktur. | generated_not_translated |
| defaults with functions IntoSQL doesn't write (strftime, randomblob) | varsayılan değer yokYazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır; CURRENT_TIMESTAMP ve datetime('now') yazılır. | default_not_translated |
| CHECK constraints | çevrilirAynı CHECK kısıtları, her satır yüklenirken denetlenir. | |
| CHECK constraints with functions IntoSQL doesn't write | oluşturulmazYazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır. | check_skipped |
| partial and expression indexes | oluşturulmazIntoSQL tüm sütunlar üzerinde indeks yazar; diğerlerini yüklemeden sonra yeniden oluşturun. | index_skipped |
| foreign keys (unenforced unless PRAGMA foreign_keys=ON) | aynı yabancı anahtarlar, PRAGMA foreign_key_check ile listelenirSQLite yabancı anahtarları yalnızca istendiğinde denetler, bu yüzden üst satırı olmayan satırlar yaygındır: yüklenirler ve anahtar, yüklemeyi durdurmak yerine bir uyarıyla denetlenmeden bırakılır. | |
| foreign keys to tables the dump doesn't create | oluşturulmazBir anahtar, var olmayan bir tabloya başvuramaz. | foreign_key_skipped |
| primary keys holding NULL, and NOT NULL columns with values that become NULL | NOT NULL kaldırılırSQLite, rowid dışındaki bir birincil anahtarın NULL tutmasına izin verir; sütun hedefte NOT NULL olamaz, yoksa yükleme durur. | not_null_relaxed |
| views, triggers and virtual tables (FTS, R*Tree) | raporda listelenirKodları SQLite'ın kendi dilinde yazılır ve sanal tablolar SQLite'ın modüllerine ihtiyaç duyar; yeniden oluşturabilmeniz için listelenirler. İç tabloları kopyalanmaz. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | değerlerden okunan türlerYalnızca veri içeren bir dökümde yalnızca satırlar vardır, bu yüzden türler değerlerden gelir ve sütunlar numaralandırılır. | no_schema |
| expressions in INSERT values other than the text functions dumps write | NULLunistr(), replace(), char() ve || kabuğun yazdığı biçimde hesaplanır; diğer ifadeler veritabanı olmadan hesaplanamaz. | expression_value |
| NUL characters in text | korunursqlite3 kabuğu ve Python, döküm alırken metni bir NUL karakterinde keser, bu yüzden dökümde yalnızca ondan önceki kısım bulunur. | |
| text that isn't valid UTF-8 | hatalı baytlar yerine koyma karakteri olarakDökümler bu tür metni ham bayt olarak yazar; betik UTF-8'dir. | invalid_utf8_replaced |
| text decoded twice (ñ) | olduğu gibi kopyalanırDöküm tam olarak bu karakterleri içerir, bu yüzden kopyalanırlar; rapor onları gösterir. | mojibake_suspected |
Betiği SQLite veritabanına yükleyin
Betik tabloları oluşturur, satırları kopyalar, ardından anahtarları, indeksleri ve yabancı anahtarları ekler; böylece hızlı yüklenir ve ilk hatada durur.
sqlite3 -bail mydb.sqlite < sqlite.sqlite.sqlYabancı anahtarlar her tabloda tanımlanır ve satırlar yabancı anahtar denetimleri kapalıyken yüklenir. Betik ardından, yarı yolda başarısız olmak yerine, var olmayan bir satıra işaret eden her satırı listeler.
Büyük bir döküm için yerel bir diskte yeni bir dosyaya yükleyin. Betik her şeyi senkronizasyon kapalı tek bir işlemde yükler; böylece disk hızında çalışır ve yarı yolda duran bir yükleme yarım tablo bırakmaz.
Komut satırı dosyayı doğrudan bir SQLite veritabanına yükler; betik yazmanız gerekmez. Ücretsizdir.
En iyi sonuç için SQLite dökümü nasıl alınır
Dönüştürücü, dökümün içerdiğini okur. Bu seçenekler verilerinizin daha fazlasını dökümde tutar:
- Veritabanı dosyasının kendisi olduğu gibi dönüştürülür ve tarayıcınızda sayfa sayfa okunur. Hiçbir değişiklik -wal dosyasında kalmasın diye önce ona yazan uygulamayı kapatın.
- sqlite3 app.db .dump > app.sql aynı veritabanını SQL olarak yazar; bu da .sql veya .sql.gz olarak dönüştürülür.
- DB Browser for SQLite bu SQL'i File, Export, Database to SQL file ile yazar; Python'ın iterdump() fonksiyonu da öyle.
Neler dönüştürülmez
SQLite kendi dilinde yazılmış görünümler, tetikleyiciler, yordamlar, fonksiyonlar ve diğer nesneler raporda adlarıyla listelenir, asla sessizce atlanmaz; böylece yeniden oluşturmadan önce her birini yüklediğiniz SQLite sürümüyle karşılaştırabilirsiniz.
SQLite sürümleri arasında taşıma hakkında sorular
Yanıtınızı bulamadınız mı? İletişim sayfasından bize yazın, bir kişi yanıt verir. İletişim sayfası
Dökümüm yükleniyor mu?
Hayır. Dönüştürücü tarayıcınızda çalışır ve dökümü diskinizden parça parça okur; böylece döküm bilgisayarınızdan hiç çıkmaz. Masaüstü uygulaması ve komut satırı da bilgisayarınızda dönüştürür.
Döküm ne kadar büyük olabilir?
Dönüştürücü dökümün tamamını asla bellekte tutmaz: dosyayı aralıklar halinde iki kez okur ve betiği ilerledikçe yazar. Birkaç gigabaytlık dökümler tarayıcıda, masaüstü uygulamasında ve komut satırıyla dönüştürülür.
.db dosyasının kendisini dönüştürebilir miyim?
Evet. .db, .sqlite veya .sqlite3 dosyasını bırakın: tarayıcınızda okunur ve asla yüklenmez. NUL karakterli metinler ve bir double değerin her basamağı saklandığı gibi gelir; bir .dump bunları kesebilir.
Döküm hangi SQLite sürümlerinden gelebilir?
SQLite 3.0 ve sonrasından UTF-8 veya UTF-16 veritabanı dosyaları ile sqlite3 kabuğunun .dump komutundan veya Python'ın iterdump() fonksiyonundan alınan dökümler. Her test dosyası ve dökümü, STRICT ve WITHOUT ROWID tabloları dahil, sqlite3 3.31 ile 3.54 arasından gelir ve kaynağıyla hücre hücre karşılaştırılır.
SQLite sütun türlerini zorunlu tutmadığında türler nasıl belirlenir?
Her sütun tanımlanan türünü korur; COLLATE NOCASE ve RTRIM de öyle. STRICT dışarıda bırakılır, böylece betik 3.31'den itibaren her sürümde yüklenir.
INTEGER PRIMARY KEY ve AUTOINCREMENT korunuyor mu?
Evet. INTEGER PRIMARY KEY ve AUTOINCREMENT olduğu gibi kalır ve sqlite_sequence, dökümün bıraktığı yerden devam eder.
Görünümler ve tetikleyiciler ne olur?
Raporda adlarıyla listelenirler ve dönüştürülmezler; böylece tablolar yüklendikten sonra onları yeniden oluşturabilirsiniz.
Betik hangi SQLite sürümlerinde yüklenir?
SQLite 3.31 ve sonrası. Her test dosyası ve dökümü 3.31 ve 3.54 üzerinde yüklenir ve bir sorun çıkarsa ilk hatada durur.