

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

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

現状としては上記の機能は真偽値を返す所までは実装できています。  
ですが、返り値をみるとrequest_luidsのリストの中の最初のluidの結果しか表示されて無いです。  
本来の要件としては以下のように取得した全てのluidに対して結果を返したいです。  
最後の結果を出力している`for row in query_res:return jsonify({request_luid: str(row[0])
})`  
を外部ループの中で処理している現行の記述方法では最初のパラメーターしか処理できないと思うのですが、うまくロジックやコードをどう変えればいいかが思いつきません。  
何か、方向性だけでもアドバイス頂ければ幸いです。

そもそもコード全体を変える必要があるのか、それとも別で結果とパラメーターをkey:valueの形で辞書にする関数を作成し、活用するなど考えてはみたのですが、まとまって無い状態です。

* * *

**現状の出力**

[code]

    {
        "XXXXXXX5e30ab17f6b536879d25555": "True"⬅︎結果は真偽値判定は現状問題なく機能してます
    }
    
[/code]

**理想の出力**

[code]

    {
        "XXXXXXX5e30ab17f6b536879d25555": "True",
        "XXXXXXX8r30ab17f6b536879d25555": "False",
        "XXXXXXX9t30ab17f6b536879d25555": "True",
    }
    
[/code]

**エンドポイント**

[code]

    https://test-project-galvanic-ripsaw-281806.df.r.appspot.com?luid=XXXXXXX5e30ab17f6b536879d25555&luid=XXXXXXX8r30ab17f6b536879d25555
    &luid=XXXXXXX9t30ab17f6b536879d25555
    
[/code]

**main.py**

[code]

    @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()
    
[/code]


CC BY-SA 4.0
2020-09-20T01:32:42.197
70549
2020-09-21T06:11:50.693
2020-09-21T06:11:50.693
3060
34463
question
python python3 flask google-bigquery
Google BigQueryの結果をPythonで複数Json形式で返す方法


以下のコードで解決といたします。

[code]

    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()
    
[/code]


CC BY-SA 4.0
2020-09-20T08:14:23.383
70556
2020-09-20T08:14:23.383
34463
70549
answer