SQLite | SQLiteコマンド | データベースのダンプ(.dump)

データベースのスキーマとデータをSQL文として出力することをダンプと呼びます。ここでは.dumpの使い方を説明します。

ダンプからデータベースを再構築するには.readコマンドを使用します。

.dumpの使い方

.dumpでSQLiteデータベースを出力します。構文は次のとおりです。

.dump? TABLE? ...

引数なしならデータベース全体、テーブル名を指定するとそのテーブルだけを出力します。

サンプルのテーブルとデータを作成します。

create table user (name text, old integer, address text);
 
insert into user values ('devkuma', 28, 'Seoul');
insert into user values ('kimkc', 22, 'Busan');
insert into user values ('araikuma', 32, 'Seoul');
insert into user values ('happykuma', 23, 'Seoul');
insert into user values ('mykuma', 23, 'Daejeon');

create index nameindex on user (name);

create table color (id integer, name text);

insert into color values (1, 'Red');
insert into color values (2, 'Blue');
insert into color values (3, 'White');

2つのテーブルと1つのインデックスを持つデータベースで.dumpを実行します。

.dump
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE user (name text, old integer, address text);
INSERT INTO user VALUES('devkuma',28,'Seoul');
INSERT INTO user VALUES('kimkc',22,'Busan');
INSERT INTO user VALUES('araikuma',32,'Seoul');
INSERT INTO user VALUES('happykuma',23,'Seoul');
INSERT INTO user VALUES('mykuma',23,'Daejeon');
CREATE TABLE color (id integer, name text);
INSERT INTO color VALUES(1,'Red');
INSERT INTO color VALUES(2,'Blue');
INSERT INTO color VALUES(3,'White');
CREATE INDEX nameindex on user (name);
COMMIT;
sqlite> 

出力にはスキーマ用のCREATE TABLEとデータ用のINSERTが含まれ、順に実行するとデータベースを再構築できます。

userを指定してそのテーブルだけをダンプします。

.dump user
sqlite> .dump user
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE user (name text, old integer, address text);
INSERT INTO user VALUES('devkuma',28,'Seoul');
INSERT INTO user VALUES('kimkc',22,'Busan');
INSERT INTO user VALUES('araikuma',32,'Seoul');
INSERT INTO user VALUES('happykuma',23,'Seoul');
INSERT INTO user VALUES('mykuma',23,'Daejeon');
CREATE INDEX nameindex on user (name);
COMMIT;
sqlite> 

ダンプをファイルへ出力する

.dumpの前に.outputを使うと、出力をファイルへリダイレクトできます。

現在のディレクトリのdump.txtへ出力します。この設定はクエリ結果にも適用されます。

.output ./dump.txt
sqlite> .output ./dump.txt
sqlite> 

出力先がdump.txtになりました。.dumpを実行します。

.dump
sqlite> .dump
sqlite> 

ダンプはファイルへ書かれるため画面には表示されません。

現在のディレクトリに新しいdump.txtがあります。

$ ls -al
total 5056
drwxr-xr-x@  8 kimkc  staff      272 11  4 01:24 .
drwxr-xr-x   9 kimkc  staff      306 10 17 23:49 ..
drwxr-xr-x  24 kimkc  staff      816 11  4 01:24 bak
-rw-r--r--   1 kimkc  staff    16384 11  4 01:14 dump.sqlite3
-rw-r--r--   1 kimkc  staff      538 11  4 01:21 dump.txt
-rwxr-xr-x@  1 kimkc  staff   691768 10 11 18:31 sqldiff
-rwxr-xr-x@  1 kimkc  staff  1152260 10 11 18:32 sqlite3
-rwxr-xr-x@  1 kimkc  staff   719796 10 11 18:31 sqlite3_analyzer
$ 

テキストファイルを開くとダンプ内容を確認できます。

$ cat dump.txt 
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE user (name text, old integer, address text);
INSERT INTO user VALUES('devkuma',28,'Seoul');
INSERT INTO user VALUES('kimkc',22,'Busan');
INSERT INTO user VALUES('araikuma',32,'Seoul');
INSERT INTO user VALUES('happykuma',23,'Seoul');
INSERT INTO user VALUES('mykuma',23,'Daejeon');
CREATE TABLE color (id integer, name text);
INSERT INTO color VALUES(1,'Red');
INSERT INTO color VALUES(2,'Blue');
INSERT INTO color VALUES(3,'White');
CREATE INDEX nameindex on user (name);
COMMIT;
$ 

.output stdoutで画面出力へ戻します。

.output stdout
sqlite> .output stdout
sqlite> 

出力先を戻すかCLIを終了するまで、ファイルがロックされる場合があります。