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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

MySQL

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1800閲覧

flaskを使って、プログラムで生成した値を渡すには…?

FKM

総合スコア3633

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

MySQL

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/11/25 04:11

編集2019/11/26 08:18

Python3で、flaskを使って値をhtmlテンプレートに返そうとしています。
ですが、pandasを使って取得した値は普通に返せるのに、Mysqlを使って取得した値は返すことができなくて、その原因にずっと悩んでいます。お力添え頂けたら幸いです。

#使用環境

  • CentOS7.4
  • Nginx
  • Python3.7
  • MariaDB

##動作している
xlstest.py

python

1from flask import Flask, render_template 2import pandas as pd 3app = Flask(__name__) 4 5#Excelファイルの取り込み 6filename = "xls/xls_data.xlsx" 7df = pd.read_excel(filename, encoding='utf8', index_col=0) 8#ヘッダの格納 9xlsheaders = [] 10for header in df: 11 xlsheaders.append(header) 12df.fillna("", inplace=True) 13xlsheaders.insert(0,"") 14#データの格納 15xlsrows = [] 16#データフレームをデータ配列に格納 17for row in df.itertuples(): 18 xlsrows.append(row) 19#値の受け渡し準備 20 21#ルーティング 22@app.route('/') 23def xlslist(): 24 print(xlsrows) #値を取得できる 25 return render_template("xlslist.html", title = "flaskのテスト", xlsarray={ "xlsheaders":xlsheaders, "xlsrows":xlsrows} ) #変更 26 27if __name__ == "__main__": 28 app.run(debug=False, host= '0.0.0.0', port=5000)

##動作エラーが起きる
dbquery.py

Python

1#Mysqlに接続 2from flask import Flask, render_template 3import pymysql.cursors 4app = Flask(__name__) 5 6class Db: 7 rows = '' 8 def con(self): 9 conn = pymysql.connect( 10 user='root', 11 passwd='password', 12 host='192.168.xx.xx', 13 db='database' 14 ) 15 c = conn.cursor() 16 self.c = c 17 18 def query(self,sql): 19 c = self.c 20 c.execute(sql) #sql実行 21 rows = c.fetchall() 22 self.rows = rows 23 return self.rows 24 25#dbの実行 26rows = [] 27db = Db() #インスタンス作成 28db.con() #db接続 29sql = 'select * from master' 30rows = db.query(sql) #クエリ取得 31print(rows) #値は取得できている(アクセスエラーにはなっていない) 32#レンダリング 33@app.route('/') 34def dbtest(): 35 print(rows) #何も取得しない 36 return render_template('dbtest.html',rows=rows) 37 38 39if __name__ == "__main__": 40 app.run(debug=False, host= '0.0.0.0', port=5000)

テンプレート

html

1{% extends "layout.html" %} 2{% block content %} 3 <table border= "1" cellspacing="0"> 4 <tr> 5 <th>都市名</th> 6 <th>MLB</th> 7 <th>NBA</th> 8 <th>NFL</th> 9 <th>NHL</th> 10 <th>MLS</th> 11 </tr> 12 <tbody> 13 {% for row in rows %} 14 <tr> 15 <td>{{ row.city_nm }}</td> 16 <td>{{ row[1] }}</td> 17 <td>{{ row[2] }}</td> 18 <td>{{ row[3] }}</td> 19 <td>{{ row[4] }}</td> 20 <td>{{ row[5] }}</td> 21 </tr> 22 {% endfor %} 23 </tbody> 24 </table> 25{% endblock %}

#試したこと

  • dbtest( rows)として引数を入れてみた → エラー
  • オブジェクトから直接値を取得するようself.rowsとしてみた → 何も取得しない
  • dbの実行の部分をdetest()以下に入れてみた。何も取得しない

#疑問点
flaskで用いる任意の引数で、外部から取得したpostやgetについては記述があるのですが、プログラム内で取得した値を渡す方法については探索中です。…が、なかなか答えに届きません。また、なぜpandasで取得した値は値を取得できて、fetchした値は取得できないのか、その理由も知りたいです。

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1#dbの実行 2rows = [] 3db = Db() #インスタンス作成 4db.con() #db接続 5sql = 'select * from master' 6rows = db.query(sql) #クエリ取得 7print(rows) #値は取得できている(アクセスエラーにはなっていない)

上の部分を、下の「ここに入れる」にしたら、print(rows)で何か表示されますか?

python

1@app.route('/') 2def dbtest(): 3 # ここに入れる 4 print(rows) #何も取得しない 5 return render_template('dbtest.html',rows=rows)

ちなみに、dbtest.htmlの記述はどうなっていますか?

投稿2019/11/26 02:27

FiroProchainezo

総合スコア2401

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

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

FKM

2019/11/26 09:14 編集

>上の部分を、下の「ここに入れる」にしたら、print(rows)で何か表示されますか? 何も表示されないです。 >ちなみに、dbtest.htmlの記述はどうなっていますか? そのテンプレートを質問文に追記して貼り付けました。 ちなみにあれから進展があり、テンプレートの方は表示できた(初歩的なミスでextendsの呼び出しが同一ファイルになっていました…)のですが、ルート内の関数に変数を渡す方法が見つかっていません。
FKM

2020/01/09 11:49

一旦の目的は達成しているのでクローズします。回答頂いた方の発言もヒントになったので、BAとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問