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

回答編集履歴

1

回答を追記

2016/04/04 16:37

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

answer CHANGED
@@ -1,2 +1,77 @@
1
1
  以下を思い出して下さい。
2
- [https://teratail.com/questions/17988](https://teratail.com/questions/17988)
2
+ [https://teratail.com/questions/17988](https://teratail.com/questions/17988)
3
+
4
+ ---
5
+ コメント欄にあるとおり
6
+ [https://teratail.com/questions/29934](https://teratail.com/questions/29934)
7
+ を実現したいとのことですので、上記の
8
+ > 2. pythonでmysql→csvを生成し、アクセスしたPCのローカルへ保存させる
9
+
10
+ に沿った回答をさせていただきます。
11
+
12
+ ただし、申し訳ありませんが、
13
+ Pythonは不勉強なのと、手元にまともな環境が無くほとんど動作確認できていないため、
14
+ うまく動かないかもしれません。
15
+
16
+ まずは以下のコードをそのままサーバに配置し、htmlから実行してみてください。
17
+ コメント行があるとうまく動かないかもしれません。
18
+ その際はコメント行を削除して再試行してみてください。
19
+ (私が手元のMacで実行したときは、そうでした)
20
+
21
+ ```python
22
+ import csv
23
+ import tempfile
24
+ import os.path
25
+ import sys
26
+
27
+ # この変数に、DBから取得したデータを
28
+ # 1つの要素が1レコードに対応する2次元配列として格納する
29
+ result = [
30
+ [0, 'hoge'],
31
+ [1, 'fuga'],
32
+ [2, 'piyo']
33
+ ]
34
+
35
+ # 一時ファイルにCSVデータを出力
36
+ f = tempfile.NamedTemporaryFile()
37
+ writer = csv.writer(f)
38
+ writer.writerows(result)
39
+
40
+ # ポインタを戻さないと、os.path.getsizeに失敗する
41
+ f.seek(0, 0)
42
+
43
+ # HTTPヘッダを出力
44
+ sys.stdout.write("Content-Type: application/octet-stream\n")
45
+ sys.stdout.write("Content-Disposition: attachment; filename=\"sample.csv\"\n")
46
+ sys.stdout.write("Content-Length: " + str(os.path.getsize(f.name)) + "\n")
47
+ sys.stdout.write("Expires: 0\n")
48
+ sys.stdout.write("Cache-Control: must-revalidate, post-check=0,pre-check=0\n")
49
+ sys.stdout.write("Pragma: private\n")
50
+ sys.stdout.write("\n")
51
+
52
+ # 参考サイトからコピペ
53
+ # 必要なのかどうか不明
54
+ if sys.platform == "win32":
55
+ import msvcrt
56
+ msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
57
+
58
+ # HTTPボディににCSVデータを出力
59
+ stdout = csv.writer(sys.stdout)
60
+ reader = csv.reader(f)
61
+ for row in reader:
62
+ print stdout.writerow(row)
63
+
64
+ f.close()
65
+ ```
66
+
67
+ 上記コードでうまく"sample.csv"をダウンロードできたら、変数`result`に格納する値をMySQLから取得したデータに置き換えてください。
68
+
69
+ MySQLへの接続に何のライブラリを使用しているのか不明でしたので、その部分は割愛させていただきましたが、
70
+ > 実は、htmlからpostでpythonへ値を渡し、それをもとにmysqlからcsvをエクスポートしています。
71
+
72
+ ということなので、PythonからMySQLへの接続は問題なく実装できているかと思います。
73
+
74
+ ※参考ページ
75
+ [http://docs.python.jp/2/library/tempfile.html](http://docs.python.jp/2/library/tempfile.html)
76
+ [http://docs.python.jp/2/library/csv.html](http://docs.python.jp/2/library/csv.html)
77
+ [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](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)