CUBE SUGAR CONTAINER

技術系のこと書きます。

ファイルから SQL を読み込む (MySQL, PostgreSQL, SQLite3)

色々な RDBMS で SQL の書かれたファイルを読み込む方法について調べた。

まずはSQL の書かれたテキストファイルを用意しておく。

$ cat << 'EOF' > sample.sql
DROP TABLE IF EXISTS users;
CREATE TABLE users (
  id integer,
  name varchar(255),
  age integer
);
INSERT INTO users
VALUES
  (1, 'Alice', 20),
  (2, 'Bob', 30),
  (3, 'Carol', 40);
EOF

こんな感じ。 users テーブルを作って、そこにレコードを追加している。

$ cat sample.sql
DROP TABLE IF EXISTS users;
CREATE TABLE users (
  id integer,
  name varchar(255),
  age integer
);
INSERT INTO users
VALUES
  (1, 'Alice', 20),
  (2, 'Bob', 30),
  (3, 'Carol', 40);

TL;DR

早見表

RDBMS コマンドライン インタラクティブシェル
MySQL mysql -D [database] < [filepath] source [filepath]
PostgreSQL psql -d [database] -f [filepath] \i [filepath]
SQLite3 sqlite3 [database] < [filepath] .read [filepath]

MySQL

まずは MySQL から。 使ったバージョンは次の通り。

$ mysqld --version
mysqld  Ver 5.7.18 for osx10.12 on x86_64 (Homebrew)

最初に、読み込む先となる sample データベースを用意しておく。

$ mysql -u root -e "CREATE DATABASE IF NOT EXISTS sample"

コマンドラインから読み込む

まずは通常のシェルから mysql コマンドを使って読み込む方法について。

mysql コマンドを使って読みこむにはリダイレクトを使うだけで良い。

$ mysql -u root -D sample < sample.sql

これだけでテーブルができてレコードが追加されている。

$ mysql -u root -D sample -e "SELECT * FROM users"
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | Alice |   20 |
|    2 | Bob   |   30 |
|    3 | Carol |   40 |
+------+-------+------+

シェルから読み込む

次に mysql コマンドのインタラクティブシェルに落ちて読み込む方法について。

$ mysql -u root -D sample

ひとまず、先ほど読み込んだ内容は一旦削除しておく。

mysql> DROP TABLE users;

mysql コマンドのシェルから SQL の書かれたファイルを読み込むには source コマンドを使う。

mysql> source sample.sql

これでファイルに書かれた SQL が読み込まれる。

mysql> SELECT * FROM users;
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | Alice |   20 |
|    2 | Bob   |   30 |
|    3 | Carol |   40 |
+------+-------+------+
3 rows in set (0.00 sec)

あるいは上記の代わりに \. を使っても構わない。

mysql> \. sample.sql

PostgreSQL

次に PostgreSQL の場合。 使ったバージョンは次の通り。

$ psql --version
psql (PostgreSQL) 9.6.3

まずは読み込む先のデータベースを用意しておく。

$ psql -c "DROP DATABASE sample"
$ psql -c "CREATE DATABASE sample"

コマンドラインから読み込む

psql コマンドで読み込む場合には、読ませたいファイルを -f オプションで指定する。

$ psql -d sample -f sample.sql

これで内容が読み込まれた。

$ psql -d sample -c "SELECT * FROM users"
 id | name  | age
----+-------+-----
  1 | Alice |  20
  2 | Bob   |  30
  3 | Carol |  40
(3 rows)

シェルから読み込む

次は psql コマンドのシェルに入って読み込む方法について。

まずはデータベースを指定してインタラクティブシェルに落ちる。

$ psql -d sample

先ほど作ったテーブルは一旦削除しておこう。

sample=# DROP TABLE users;

SQL の書かれたファイルを読み込むには \i を使う。

sample=# \i sample.sql

これで内容が読み込まれた。

sample=# SELECT * FROM users;
 id | name  | age
----+-------+-----
  1 | Alice |  20
  2 | Bob   |  30
  3 | Carol |  40
(3 rows)

SQLite3

次は SQLite3 の場合。 使ったバージョンは次の通り。

$ sqlite3 --version
3.16.0 2016-11-04 19:09:39 0e5ffd9123d6d2d2b8f3701e8a73cc98a3a7ff5f

コマンドラインから読み込む

SQLite3 でコマンドラインから読み込むにはデータベースのファイルを指定しながら MySQL と同様にリダイレクトを使うだけで良い。

$ sqlite3 sample.db < sample.sql

これで読み込まれた。

$ sqlite3 sample.db "SELECT * FROM users"
1|Alice|20
2|Bob|30
3|Carol|40

シェルから読み込む

次にインタラクティブシェルから読み込む方法について。 まずはデータベースのファイルを指定して sqlite3 コマンドを実行することでシェルに落ちる。

$ sqlite3 sample.db

先ほど作ったテーブルは一旦削除しておこう。

sqlite> DROP TABLE users;

SQLite3 のシェルでファイルを読み込むには .read を使う。

sqlite> .read sample.sql

これで内容が読み込まれた。

sqlite> SELECT * FROM users;
1|Alice|20
2|Bob|30
3|Carol|40

いじょう。