回答編集履歴

1

回答を追記

2016/04/04 16:37

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

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