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

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

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

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Flask

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

Python 3.x

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

Q&A

解決済

2回答

2354閲覧

FlaskでSQLの複数結果をまとめてJson形式で返す方法

amaturePy

総合スコア131

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Flask

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

Python 3.x

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

0グッド

0クリップ

投稿2020/09/19 06:26

編集2020/09/19 07:52

以下のことを実行できるAPIをPythonのフレームワークのFlaskで作成しております。
SQLを実行する先のDBはGoogle BigQueryを使用しております。

①複数のレクエストパラメーター(luid)をリストで取得し、ループ処理でそれぞれを変数に格納 ②①の変数をWhere区の条件に使用しSQLを実行する *SQLの内容はリクエストされたluidのcv_dateカラムに値があればTrueを返す ③結果をパラメーター値:真偽値のJson形式でクライアントに返す

現状としては上記の機能は真偽値を返す所までは実装できています。
ですが、返り値をみるとrequest_luidsのリストの中の最初のluidの結果しか表示されて無いです。
本来の要件としては以下のように取得した全てのluidに対して結果を返したいです。
request_luidsの中身をデバックするとリストでluidを取得できていると確認しております。
最後の結果を出力している

for row in query_res: return jsonify({request_luid: str(row[0]) })

この記述をfor文の中で処理しているなど、実装したい内容に対して何か自分の中で間違った書き方や認識などがあればご教授頂きたいです。
また、読みにくい記述も多々あるかとは思いますが、よろしくお願いします。

現状の出力 { "XXXXXXX5e30ab17f6b536879d25555": "True"⬅︎結果は真偽値判定は現状問題なく機能してます } 理想の出力 { "XXXXXXX5e30ab17f6b536879d25555": "True", "XXXXXXX8r30ab17f6b536879d25555": "False", "XXXXXXX9t30ab17f6b536879d25555": "True", }
エンドポイント https://test-project-galvanic-ripsaw-281806.df.r.appspot.com?luid=XXXXXXX5e30ab17f6b536879d25555&luid=XXXXXXX8r30ab17f6b536879d25555 &luid=XXXXXXX9t30ab17f6b536879d25555
main.py @app.route('/') def get_request(): request_luids = request.args.getlist('luid') or '' for i in range(len(request_luids)): request_luid = request_luids[i] client = bigquery.Client() query = """SELECT EXISTS( SELECT 1 FROM `test-project-281806.hitobito_test.test3` as p WHERE p.luid = '{}' AND p.cv_date IS NOT NULL limit 1000)""".format(request_luid) job_config = bigquery.QueryJobConfig( query_parameters=[ bigquery.ScalarQueryParameter("request_luid", "STRING", request_luid) ] ) query_job = client.query(query) query_res = query_job.result() for row in query_res: return jsonify({request_luid: str(row[0]) }) if __name__ == "__main__": app.run()

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

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

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

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

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

guest

回答2

0

一旦以下のコードの方向性で進めています。
result.updateの箇所で
TypeError: 'Response' object is not iterable
とエラーは出ておりますが、処理の方向性としては問題ないかと思っています。

def get_request(): request_luids = request.args.getlist('luid') or '' result = {} for i in range(len(request_luids)): request_luid = str(request_luids[i]) client = bigquery.Client() query = """SELECT EXISTS( SELECT 1 FROM `test-project-281806.hitobito_test.test3` as p WHERE p.luid = '{}' AND p.cv_date IS NOT NULL limit 1000)""".format(request_luid) job_config = bigquery.QueryJobConfig( query_parameters=[ bigquery.ScalarQueryParameter("request_luid", "STRING", request_luid) ] ) query_job = client.query(query) query_res = query_job.result() for row in query_res: temp_result = jsonify({request_luid: str(row[0]) }) break result.update(temp_result) return result if __name__ == "__main__": app.run()

投稿2020/09/20 08:17

amaturePy

総合スコア131

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

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

0

ベストアンサー

ご自分でも書いているとおり、一番外側のループ

python

1for i in range(len(request_luids)):

python

1return jsonify({request_luid: str(row[0]) })

このようにreturnしてしまうと、一番始めのrequest_luidだけ処理して、query_resの最初の値だけ返すことになってしまいます。

このままflaskの中でやっていても先が見えなさそうなので、まずは、通常の関数として、luidのリストを受け取って目的とするjsonファイルと同じ構造のpython配列もしくは辞書(dict)を返す/表示する処理を作ってみてはいかがでしょう。

投稿2020/09/19 07:35

TakaiY

総合スコア13790

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

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

amaturePy

2020/09/19 08:48

アドバイスありがとうございます! 自分でもFlaskでやるのは少し限界があるかと考えておりました。 自分の技術力の問題で今すぐに解決案が思いつかないので、再度どう処理していくか考え直そうと思います。 ざっくり思い付いているのは、仰って頂いた通りのまずはluidのリストを要件通りの形で返す関数を作成してみようと思います。 今の作成した物とは全然違うものを再度作成する必要がありそうなので少し心配ではありますが、挑戦してみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問