teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2017/12/28 02:26

投稿

miyabi-sun
miyabi-sun

スコア21472

answer CHANGED
@@ -9,4 +9,52 @@
9
9
  > 相手の環境ですぐ実行することができる方法はありますか?
10
10
 
11
11
  相手の環境でまるっと再現出来なければなんの意味もないので、本番環境への反映と同じですね。
12
- Dockerやdocker-composeを使うのが今風です。
12
+ Dockerやdocker-composeを使うのが今風です。
13
+
14
+ ---
15
+
16
+ 【追記】SQLでデータを持ち運ぶ?
17
+
18
+ これを説明する為にはRDBMSの概要をさらっと説明する必要があります。
19
+ 想像しやすいようにExcelで表現すると、
20
+ RDBMSのデータベースに当たるのがExcelの1ファイルに該当します。
21
+ これと同じように、テーブルがExcelのシート、レコードがExcelの1行に該当します。
22
+
23
+ SQLとはRDBMSの操作をお願いする呪文です。
24
+ 例えば`SELECT * FROM table_name`とお願いすれば、
25
+ RDBMSはtable_nameというテーブル名から全てのデータを探して一覧にして返してくれます。
26
+ また、`INSERT INTO table_name (value1, value2, value3 ...)`とお願いすれば、
27
+ RDBMSはtable_nameというテーブルにSQL文に従って作られた1行のデータを挿入してくれます。
28
+
29
+ このようにRDBMSはSQLという文字列で全ての操作を外部から行うわけですね。
30
+ Excelで表形式の一覧を作るには、Excelファイルを作る→シートを作って表組みを整える→1行追加という手順になりますが、
31
+ RDBMSではSQL文を順番通りに次々と読み込ませる事で実現します
32
+ (今回はMySQL用のSQL文なので他のDBでは方言の違いがあります、実際にはリファレンス等を読んでください)
33
+
34
+ ```SQL
35
+ -- 先頭が--の行はコメントアウト
36
+ -- データベースを作成する
37
+ CREATE DATABASE new_app;
38
+
39
+ -- テーブルを作成する
40
+ CREATE TABLE new_app.users (id int, name varchar(20));
41
+
42
+ -- 行を追加
43
+ INSERT INTO new_app.users (id, name) VALUES (1, 'taro');
44
+ INSERT INTO new_app.users (id, name) VALUES (2, 'jiro');
45
+
46
+ -- MySQLではバルクインサートという手法を使って複数行のデータを1文で追加できます、他のDBでも多分可能
47
+ INSERT INTO new_app.users (id, name) VALUES (3, 'saburo'), (4, 'shiro'), (5, 'goro');
48
+ ```
49
+
50
+ 本題の持ち運ぶとは何か?ですが、登録用の操作系SQL文を集めて1ファイルに固めます。
51
+
52
+ ```SQL
53
+ CREATE DATABASE new_app;
54
+ CREATE TABLE new_app.users (id int, name varchar(20));
55
+ INSERT INTO new_app.users (id, name) VALUES (1, 'taro'), (2, 'jiro'), (3, 'saburo'), (4, 'shiro'), (5, 'goro');
56
+ ```
57
+
58
+ これを先方に渡して実行すれば、一瞬でテーブルとデータが再現出来ます。
59
+ MySQLはmysqldump、Oracleではエクスポートという機能があり、
60
+ こういったSQL文の詰まったファイルを稼働中のRDBMSに作らせる事が可能です。