何をしたかったの?
いまのお仕事のテスト用に、DBに値をサクッと登録したかった。
そのために使えるCSV生成→DB登録機能は既に実装されていたが、
テスト環境でやっててもそのファイルを使ったらお客さんに通知が飛ぶし、
かといって、通知する部分をコメントアウトしたりってのも少し手間…
なんて思って、【やったことなかったけど】CSVから直接インポートしちゃえばよくね???
という軽い気持ちで試したら存外ハマったので、備忘録としてまとめていく。
この記事で紹介すること
MySQLに、CLIからコマンド打ってCSVをインポートする方法。
ハマったところから紹介するので、答えだけ知りたい方は、最後の章だけ見てもらえれば。
紹介していく。
まず手元にCSVを用意する。
そして、MySQLにログインし、インポート先のDBを選択。
以下のコマンドを打つ。
$ load data local infile "/Users/[userName]/Import.csv" \
into table [tableName] \
fields terminated by ',' \
optionally enclosed by '"';
ちなみに、
terminatedは区切り文字、
optionally enclosedは囲い文字
となっているので、環境次第で変える必要がある。
実行結果は…
ERROR 1148 (42000): The used command is not allowed with this MySQL version
ググった結果、local_infileの設定が変なのではないか?とのことなので、
以下のコマンドを実行。(同じくMySQL内)
mysql> SELECT @@local_infile;
+----------------+
| @@local_infile |
+----------------+
| 1 |
+----------------+
1 row in set (0.00 sec)
このファイルの値が、先程のコマンドの権限?的なところを担っているらしいのだが、
僕はそもそも1だった。
ここが0の場合は、1に変えて再実行してみるのが良いかも。
それでもダメだったら、以下のコマンドを試してみると良いかも。
ではどうするか
MySQLにログインする際に、--local_infile=1
を指定する。
$ mysql -u $userName -p -h $IP -P $port --local_infile=1
これでMySQLのログインパスワードを入力し、MySQLにログインできたら、
インポート先のデータベースを選択し、先程のコマンドをもう一度ためす。
$ load data local infile "/Users/[userName]/Import.csv" \
into table [tableName] \
fields terminated by ',' \
optionally enclosed by '"';
Query OK, 216 rows affected, 216 warnings (0.01 sec)
Records: 216 Deleted: 0 Skipped: 0 Warnings: 216
なんかやたらWarnings出てますが、phpMyAdminで値を確認したところ、
問題なく登録されていた。
こんなしょっぱい経験が、どなたかの役に立つことがもしあれば嬉しいです。