amaturePy
amaturePy

Reputation: 67

I've been looking for the way to return multiple SQL results with Json format in Python3

I've been looking for the way to output multiple SQL result with Json format in Python3. My API gets request parameters(luid) and passes them to BigQuery in SQL and return the result to client with Json format. So far , I succeeded in building the api that can handle only one parameter but if you put multiple parameters , this api could return only first parameter's result. I'm guessing this problem is occurred by using return jsonify({request_luid: str(row[0]) }) in outer loop. I have no idea how should I change my code and logic.Could anyone tell me?? I'm welcome to any idea .

output of my code 
{
    "XXXXXXX5e30ab17f6b536879d25555": "True"⬅︎My SQL seems work correctly 
}

ideal otput
{
    "XXXXXXX5e30ab17f6b536879d25555": "True",
    "XXXXXXX8r30ab17f6b536879d25555": "False",
    "XXXXXXX9t30ab17f6b536879d25555": "True",
}
Endpoint

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()

Upvotes: 0

Views: 211

Answers (2)

amaturePy
amaturePy

Reputation: 67

My final code is below . Thank you so much for good advice ! Maryam Abdoli

from flask import Flask, request, jsonify
from google.cloud import bigquery
import json

app = Flask(__name__)

@app.route('/')
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)""".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 = {request_luid: str(row[0])}
            break

        result.update(temp_result)

    return json.dumps(result) 


if __name__ == "__main__":
    app.run()

Upvotes: 0

Maryam
Maryam

Reputation: 720

I think the problem is here:

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

you can use this piece of code:

@app.route('/')
def get_request():
    request_luids = request.args.getlist('luid') or ''
    result = {} # define an empty dictionary for final result

    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()
        # you don't need other rows of result because you return the first element, so break the for loop
        for row in query_res:
            temp_result = jsonify({request_luid: str(row[0]) })
            break

        result.update(temp_result) # add temp_result to the final result 

    # then return the final result
    return result

if __name__ == "__main__":
    app.run()

Upvotes: 1

Related Questions