質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

3085閲覧

mysqlでのcsvの掃き出し

HidenoriYamano

総合スコア60

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/03/30 07:20

mysqlにてcsvのエクスポートを行いました。以下のコマンドを叩くとエラーが出ます。

SELECT * from finance_data INTO OUTFILE "/var/www/html/tmp/data.csv" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'; ERROR 1 (HY000): Can't create/write to file '/var/www/html/tmp/data.csv' (Errcode: 13)

なお、tmpの権限は777で、また、上のパスではなく”var/tmp/”の中には掃き出せます。なぜでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下を思い出して下さい。
https://teratail.com/questions/17988


コメント欄にあるとおり
https://teratail.com/questions/29934
を実現したいとのことですので、上記の

  1. pythonでmysql→csvを生成し、アクセスしたPCのローカルへ保存させる

に沿った回答をさせていただきます。

ただし、申し訳ありませんが、
Pythonは不勉強なのと、手元にまともな環境が無くほとんど動作確認できていないため、
うまく動かないかもしれません。

まずは以下のコードをそのままサーバに配置し、htmlから実行してみてください。
コメント行があるとうまく動かないかもしれません。
その際はコメント行を削除して再試行してみてください。
(私が手元のMacで実行したときは、そうでした)

python

1import csv 2import tempfile 3import os.path 4import sys 5 6# この変数に、DBから取得したデータを 7# 1つの要素が1レコードに対応する2次元配列として格納する 8result = [ 9 [0, 'hoge'], 10 [1, 'fuga'], 11 [2, 'piyo'] 12] 13 14# 一時ファイルにCSVデータを出力 15f = tempfile.NamedTemporaryFile() 16writer = csv.writer(f) 17writer.writerows(result) 18 19# ポインタを戻さないと、os.path.getsizeに失敗する 20f.seek(0, 0) 21 22# HTTPヘッダを出力 23sys.stdout.write("Content-Type: application/octet-stream\n") 24sys.stdout.write("Content-Disposition: attachment; filename=\"sample.csv\"\n") 25sys.stdout.write("Content-Length: " + str(os.path.getsize(f.name)) + "\n") 26sys.stdout.write("Expires: 0\n") 27sys.stdout.write("Cache-Control: must-revalidate, post-check=0,pre-check=0\n") 28sys.stdout.write("Pragma: private\n") 29sys.stdout.write("\n") 30 31# 参考サイトからコピペ 32# 必要なのかどうか不明 33if sys.platform == "win32": 34 import msvcrt 35 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 36 37# HTTPボディににCSVデータを出力 38stdout = csv.writer(sys.stdout) 39reader = csv.reader(f) 40for row in reader: 41 print stdout.writerow(row) 42 43f.close()

上記コードでうまく"sample.csv"をダウンロードできたら、変数resultに格納する値をMySQLから取得したデータに置き換えてください。

MySQLへの接続に何のライブラリを使用しているのか不明でしたので、その部分は割愛させていただきましたが、

実は、htmlからpostでpythonへ値を渡し、それをもとにmysqlからcsvをエクスポートしています。

ということなので、PythonからMySQLへの接続は問題なく実装できているかと思います。

※参考ページ
http://docs.python.jp/2/library/tempfile.html
http://docs.python.jp/2/library/csv.html
http://winter-tail.sakura.ne.jp/pukiwiki/index.php?Python%A4%A2%A4%EC%A4%B3%A4%EC%2F%A5%D5%A5%A1%A5%A4%A5%EB%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9

投稿2016/03/30 08:12

編集2016/04/04 16:37
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HidenoriYamano

2016/03/30 08:17

申し訳ありません。質問の際に足りていなかった所を補足しますと、親ディレクトリもパーミッションは777です。
KiyoshiMotoki

2016/03/30 08:32 編集

返信ありがとうございます。 > 親ディレクトリもパーミッションは777です。 以下のディレクトリ全てに、MySQLからの書き込み権限がありますか? /var/www/html/tmp/ /var/www/html/ /var/www/ /var/
HidenoriYamano

2016/03/30 08:57

返信ありがとうございます。 すべてのディレクトリに権限を与えています。MySQLもrootユーザーなので書き込み権限はあるはずなのですが。。。
KiyoshiMotoki

2016/03/30 09:07

> MySQLもrootユーザーなので 一般的な方法でインストール・設定する限り、MySQLはmysqlユーザーで起動するはずです。 rootで起動しているのはmysqld_safeではありませんか? https://dev.mysql.com/doc/refman/5.6/ja/mysqld-safe.html ps aux | grep mysqld と実行して、(mysqld_safeではなく)"mysqld"というプロセスの実行ユーザーを、もう一度 確認してみて下さい。
HidenoriYamano

2016/03/30 11:02

すいません。実行結果の解釈がよくわからないので載せさせていただきます。何かお気づきの点があれば返信よろしくお願いいたします。 [root@*** html]# ps aux | grep mysqld root 21015 0.0 0.0 108204 1444 ? S 14:54 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql mysql 21144 0.0 0.2 443300 35892 ? Sl 14:54 0:02 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock root 23033 0.0 0.0 107472 928 pts/0 S+ 19:54 0:00 grep mysqld
KiyoshiMotoki

2016/03/30 11:09 編集

ありがとうございます。 「mysql 21144 0.0 0.2 〜」で始まる1行が、MySQLサーバのプロセスです。 で、頭の"mysql"が、実行ユーザーを表します。 やはり、mysqlユーザーで起動していますね。
HidenoriYamano

2016/03/30 11:34

ありがとうございます。結局の所どう対処すれば良いのでしょうか。 お手数ですがよろしくお願い致します。
KiyoshiMotoki

2016/03/30 13:18 編集

1コマンドで生成する特段の理由がないのであれば、 いったん"/var/tmp/"とかに出力してから  mv /var/tmp/data.csv /var/www/html/tmp/ とやれば良いのではないでしょうか? 原則、Linuxではサブディレクトリの権限は親ディレクトリのそれに制限されます。 つまり、mysqlユーザーから /var/www/html/tmp/ にファイルを作成できるようにするためには、 以下全てのパスにmysqlユーザーからのアクセス権限を追加する必要があります。  /var/www/html/tmp/  /var/www/html/  /var/www/  /var/ しかし、察するに、"/var/www/html/"はApacheのドキュメントルートではないでしょうか? であれば、安易にこれらのディレクトリの権限を変更することはお勧めできません。
HidenoriYamano

2016/03/31 01:58

なるほどファイル移動するというのは思いつきませんでした。それで試してみようと思います。 仰るとおりドキュメントルートです。推奨されない方法なんですね。上の方法で試してみます。
HidenoriYamano

2016/04/02 23:48

何度もすみません。上の方法で試してみましたが、今度はmvの際に /var/tmpへのアクセス権がないと怒られてしまいました。(実は、htmlからpostでpythonへ値を渡し、それをもとにmysqlからcsvをエクスポートしています。その際に、userがNoneとなってしまいます。)ですので、後者のやり方でやらざるを得ないと思うのですが、mysqlユーザーからのアクセス権限の追加の方法がわかりません。 /etc/passwd の結果のなかに mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash がありましたので、mysqlユーザーはすでに存在するかと思います。アクセス権限の追加方法を教えていただけますでしょうか。
HidenoriYamano

2016/04/03 09:27

ちなみに、仮想サーバ(vagrant)ではbar/www/harml/tmp 内に作成でき、上のURLでの質問は解決しましたが、研究室のサーバではうまくいきません。。 どちらもOSはcentos 6 です。
KiyoshiMotoki

2016/04/04 08:23

ようやく理解しましたw 内容まとめて回答しますので、少々お待ちください。 恐らく、今日の深夜になると思います。
HidenoriYamano

2016/04/04 23:57

よろしくお願いします!返信お待ちしております!
KiyoshiMotoki

2016/04/05 00:53

解答欄に追記させていただきました。 ご確認ください。
HidenoriYamano

2016/04/05 05:56

ブラウザで表示しますと、 Content-Type: application/octet-stream Content-Disposition: attachment; filename="sample.csv" Content-Length: 24 Expires: 0 Cache-Control: must-revalidate, post-check=0,pre-check=0 Pragma: private 0,hoge None 1,fuga None 2,piyo None このように表示されました。 ダウンロードできなったのですがなぜでしょうか。。
KiyoshiMotoki

2016/04/05 09:17

ご報告ありがとうございます。 動きませんでしたか。。 大変申し訳ありませんが、私がお力になれるのはここまでです。 ご質問の内容が私の守備範囲外に及んでいるためです。 まずはご自分で調べてみていただきたいところですが、どうしてもわからないようであれば、新たにご質問を投稿されることをお勧めします。 その方が、より多くの詳しい方に見ていただけるかと思いますので。 その際は、以下を記載しておくと、より具体的な回答を得やすくなると思います。 ・PythonのWebフレームワークなどを使っているか? ・PythonからMySQLに接続する際に使用しているライブラリ ・このページと "https://teratail.com/questions/29934" へのリンク
HidenoriYamano

2016/04/05 14:14

ご丁寧な回答何度も頂いたのに申し訳ありません。vagrant上ではcsvうまくダウンロードできました。研究室のサーバでは何故かうまく行きません。またいろいろ試してみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問