本文へスキップ
IntoSQL ホーム

SQLite のデータベースを古いまたは新しい SQLite へ移す

SQLite のデータベースファイル (.db、.sqlite、.sqlite3) か sqlite3 の .dump が書き出す SQL をドロップすると、SQLite 3.31 以降で読み込めるスクリプトをダウンロードできます。各列は宣言された型と照合順序を保ち、古いバージョンでもテーブルを受け付けるよう STRICT は外されます。すべての変更はレポートに記載されます。

ファイル
sqlshop_2024_sqlite.sqlサンプルファイル、3.4 KB
データベース

18 行を変換、修正なし、却下なし

表示

shop_2024_sqlite.sql のテーブルSQLite のダンプ · sqlite3 で作成 · utf-8

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

未変換

  • ビュー order_totals
  • トリガー orders_shipped

これらはデータベースごとに独自の言語で書かれます。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;

修正

修正が必要な箇所はありませんでした。

確認が必要

  • 2 件のビュー、トリガー、ルーチン、イベントは変換されません。レポートにそれぞれ記載しています。 SQLite で手動で作り直してください。

ファイルはこのコンピューター上で変換され、アップロードされることはありません。

その他のサンプル:

ファイルとスクリプトで変わること

各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。

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

    列のすべての値が収まる型

    宣言された型は同じなので、値は保存されていたとおりに読み込まれます。

  • BOOLEAN, BOOL

    CHECK 付きの INTEGER 0 または 1

    すべての値が 0 か 1 の場合です。ほかの値も含む列は、それらを数値またはテキストとして保ちます。

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

    宣言された型をそのまま保持

    SQLite は長さを強制しません。宣言された長さは、すべての値が収まる場合にだけ保ちます。

  • DECIMAL(p,s), NUMERIC

    すべての値が収まれば正確な型、それ以外は double

    SQLite はこれらを整数または double として保存します。宣言された精度は、値が収まる場合にだけ保ちます。

  • BLOB, and columns holding bytes

    BLOB

    バイト列はバイト列のままです。同じ列にあるテキストや数値は、そのバイト列として保ちます。

  • DATE, DATETIME, TIMESTAMP holding ISO 8601 text

    DATE、DATETIME を ISO 8601 のテキストで

    すべての値が日付、または日付と時刻の場合です。エポック形式の数値やほかのテキストは、値をそのまま保ちます。

  • JSON holding JSON text

    TEXT

    すべての値が JSON のオブジェクトまたは配列の場合です。

  • Infinity in REAL columns

    9e999、SQLite 独自の無限大

    SQLite は無限大をオーバーフローするリテラルとして書き出し、読み込むと無限大に戻ります。

  • INTEGER PRIMARY KEY, AUTOINCREMENT

    INTEGER PRIMARY KEY、AUTOINCREMENT も保持

    rowid になるのは、正確に INTEGER PRIMARY KEY と宣言された列だけです。各行は ID を保ち、カウンターはこれまでに割り当てられた最大の ID の後から始まります。

  • COLLATE NOCASE

    COLLATE NOCASE

    同じ照合順序です。

  • generated columns

    生成列、ソースと同じく STORED または VIRTUAL

    SQLite も同じ方法で計算します。

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

    普通の列

    書き換えられない式は、普通の列とレポートの 1 行になります。ダンプには生成列の値が含まれません。

    レポートの行: generated_not_translated

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

    デフォルト値なし

    書き換えられないデフォルト値は含めず、レポートに記載します。CURRENT_TIMESTAMP と datetime('now') は書き出します。

    レポートの行: default_not_translated

  • CHECK constraints

    変換済み

    チェック制約は同じで、各行の読み込み時に検証します。

  • CHECK constraints with functions IntoSQL doesn't write

    作成しない

    書き換えられないチェック制約は含めず、レポートに記載します。

    レポートの行: check_skipped

  • partial and expression indexes

    作成しない

    IntoSQL が書き出すのは列全体に対するインデックスです。その他は読み込み後に作り直してください。

    レポートの行: index_skipped

  • foreign keys (unenforced unless PRAGMA foreign_keys=ON)

    同じ外部キー、PRAGMA foreign_key_check で一覧表示

    SQLite は指示されたときにしか外部キーをチェックしないため、親のない行はよくあります。それらの行も読み込み、読み込みを止めずにキーを未チェックのまま残して警告します。

  • foreign keys to tables the dump doesn't create

    作成しない

    キーは存在しないテーブルを参照できません。

    レポートの行: foreign_key_skipped

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

    NOT NULL を削除

    SQLite では rowid 以外の主キーが NULL を持てます。変換先ではその列を NOT NULL にできません。そうすると読み込みが止まります。

    レポートの行: not_null_relaxed

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

    レポートに記載

    コードは SQLite 独自の言語で書かれており、仮想テーブルには SQLite のモジュールが必要です。作り直せるよう一覧にします。内部テーブルはコピーしません。

    レポートの行: not_converted_objects

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

    値から読み取った型

    データのみのダンプには行しかないため、型は値から決まり、列には番号が付きます。

    レポートの行: no_schema

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

    NULL

    unistr()、replace()、char()、|| はシェルが書き出すとおりに評価します。その他の式はデータベースなしでは評価できません。

    レポートの行: expression_value

  • NUL characters in text

    保持

    sqlite3 シェルと Python はダンプ時に NUL 文字でテキストを切り詰めるため、ダンプにはその前の部分しか含まれません。

  • text that isn't valid UTF-8

    不正なバイトを置換文字に

    ダンプはこうしたテキストを生のバイトとして書き出します。スクリプトは UTF-8 です。

    レポートの行: invalid_utf8_replaced

  • text decoded twice (ñ)

    そのままコピー

    ダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。

    レポートの行: mojibake_suspected

ファイルではスクリプトではレポートの行
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)列のすべての値が収まる型宣言された型は同じなので、値は保存されていたとおりに読み込まれます。
BOOLEAN, BOOLCHECK 付きの INTEGER 0 または 1すべての値が 0 か 1 の場合です。ほかの値も含む列は、それらを数値またはテキストとして保ちます。
TEXT, VARCHAR(n), CHAR(n), CLOB宣言された型をそのまま保持SQLite は長さを強制しません。宣言された長さは、すべての値が収まる場合にだけ保ちます。
DECIMAL(p,s), NUMERICすべての値が収まれば正確な型、それ以外は doubleSQLite はこれらを整数または double として保存します。宣言された精度は、値が収まる場合にだけ保ちます。
BLOB, and columns holding bytesBLOBバイト列はバイト列のままです。同じ列にあるテキストや数値は、そのバイト列として保ちます。
DATE, DATETIME, TIMESTAMP holding ISO 8601 textDATE、DATETIME を ISO 8601 のテキストですべての値が日付、または日付と時刻の場合です。エポック形式の数値やほかのテキストは、値をそのまま保ちます。
JSON holding JSON textTEXTすべての値が JSON のオブジェクトまたは配列の場合です。
Infinity in REAL columns9e999、SQLite 独自の無限大SQLite は無限大をオーバーフローするリテラルとして書き出し、読み込むと無限大に戻ります。
INTEGER PRIMARY KEY, AUTOINCREMENTINTEGER PRIMARY KEY、AUTOINCREMENT も保持rowid になるのは、正確に INTEGER PRIMARY KEY と宣言された列だけです。各行は ID を保ち、カウンターはこれまでに割り当てられた最大の ID の後から始まります。
COLLATE NOCASECOLLATE NOCASE同じ照合順序です。
generated columns生成列、ソースと同じく STORED または VIRTUALSQLite も同じ方法で計算します。
generated columns with functions IntoSQL doesn't write, and the || operator普通の列書き換えられない式は、普通の列とレポートの 1 行になります。ダンプには生成列の値が含まれません。generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)デフォルト値なし書き換えられないデフォルト値は含めず、レポートに記載します。CURRENT_TIMESTAMP と datetime('now') は書き出します。default_not_translated
CHECK constraints変換済みチェック制約は同じで、各行の読み込み時に検証します。
CHECK constraints with functions IntoSQL doesn't write作成しない書き換えられないチェック制約は含めず、レポートに記載します。check_skipped
partial and expression indexes作成しないIntoSQL が書き出すのは列全体に対するインデックスです。その他は読み込み後に作り直してください。index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)同じ外部キー、PRAGMA foreign_key_check で一覧表示SQLite は指示されたときにしか外部キーをチェックしないため、親のない行はよくあります。それらの行も読み込み、読み込みを止めずにキーを未チェックのまま残して警告します。
foreign keys to tables the dump doesn't create作成しないキーは存在しないテーブルを参照できません。foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULLNOT NULL を削除SQLite では rowid 以外の主キーが NULL を持てます。変換先ではその列を NOT NULL にできません。そうすると読み込みが止まります。not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)レポートに記載コードは SQLite 独自の言語で書かれており、仮想テーブルには SQLite のモジュールが必要です。作り直せるよう一覧にします。内部テーブルはコピーしません。not_converted_objects
dumps without CREATE TABLE (--data-only)値から読み取った型データのみのダンプには行しかないため、型は値から決まり、列には番号が付きます。no_schema
expressions in INSERT values other than the text functions dumps writeNULLunistr()、replace()、char()、|| はシェルが書き出すとおりに評価します。その他の式はデータベースなしでは評価できません。expression_value
NUL characters in text保持sqlite3 シェルと Python はダンプ時に NUL 文字でテキストを切り詰めるため、ダンプにはその前の部分しか含まれません。
text that isn't valid UTF-8不正なバイトを置換文字にダンプはこうしたテキストを生のバイトとして書き出します。スクリプトは UTF-8 です。invalid_utf8_replaced
text decoded twice (ñ)そのままコピーダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。mojibake_suspected

スクリプトを SQLite に読み込む

スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。

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

外部キーは各テーブル内で宣言し、行は外部キーのチェックをオフにして読み込みます。その後、途中で失敗する代わりに、存在しない行を参照している行をスクリプトが一覧にします。

大きなダンプは、ローカルディスク上の新しいファイルに読み込んでください。スクリプトは同期をオフにした 1 つのトランザクションですべてを読み込むため、ディスクの速度で動き、途中で止まっても中途半端なテーブルは残りません。

コマンドラインなら、ファイルを SQLite データベースに直接読み込めます。スクリプトを書き出す必要はなく、無料です。

SQLite を最適な方法でダンプする

コンバーターはダンプの内容を読み取ります。次のオプションを使うと、より多くのデータがダンプに残ります。

  • データベースファイル自体をそのまま変換し、ブラウザでページ単位で読み込みます。変更が -wal ファイルに残らないよう、先に書き込み中のアプリを閉じてください。
  • sqlite3 app.db .dump > app.sql で同じデータベースを SQL として書き出せます。これも .sql または .sql.gz として変換できます。
  • DB Browser for SQLite では File、Export、Database to SQL file の順に選ぶとその SQL を書き出せます。Python の iterdump() も同様です。

変換されないもの

ビュー、トリガー、プロシージャ、関数など SQLite 独自の言語で書かれたオブジェクトは、黙って削除されることなくレポートに名前で記載されます。読み込む先の SQLite のバージョンで確認してから作り直せます。

SQLite のバージョン間の移行に関する質問

ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ

ダンプはアップロードされますか?

いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。

ダンプはどのくらいの大きさまで扱えますか?

コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 2 回読み、読みながらスクリプトを書き出します。数 GB のダンプも、ブラウザ、デスクトップアプリ、コマンドラインで変換できます。

.db ファイル自体を変換できますか?

はい。.db、.sqlite、.sqlite3 ファイルをドロップしてください。ブラウザで読み込まれ、アップロードされることはありません。NUL 文字を含むテキストや double のすべての桁も保存されたとおりに届きます。.dump ではこれらが欠けることがあります。

どの SQLite バージョンのダンプに対応していますか?

SQLite 3.0 以降の UTF-8 または UTF-16 のデータベースファイルと、sqlite3 シェルの .dump または Python の iterdump() で作成したダンプです。すべてのテスト用ファイルとダンプは sqlite3 3.31 から 3.54 で作成し、STRICT と WITHOUT ROWID のテーブルも含め、ソースとセル単位で比較しています。

SQLite が型を強制しない場合、列の型はどう決まりますか?

各列は宣言された型を保ち、COLLATE NOCASE と RTRIM もそのままです。STRICT は外すため、スクリプトは 3.31 以降のどのバージョンでも読み込めます。

INTEGER PRIMARY KEY と AUTOINCREMENT は保持されますか?

はい。INTEGER PRIMARY KEY と AUTOINCREMENT はそのままで、sqlite_sequence はダンプ時点の値から続きます。

ビューとトリガーはどうなりますか?

変換はせず、レポートに名前で一覧するので、テーブルを読み込んだ後に作り直せます。

スクリプトはどの SQLite バージョンで読み込めますか?

SQLite 3.31 以降です。すべてのテスト用ファイルとダンプを 3.31 と 3.54 で読み込み、問題があれば最初のエラーで止まります。