0

我一直在寻找在 Python3 中以 Json 格式输出多个 SQL 结果的方法。我的 API 获取请求参数(luid)并将它们传递给 SQL 中的 BigQuery,并将结果以 Json 格式返回给客户端。到目前为止,我成功构建了只能处理一个参数的 api,但是如果你放置多个参数,这个 api 只能返回第一个参数的结果。我猜这个问题是通过return jsonify({request_luid: str(row[0]) })在外循环中使用而发生的。我不知道我应该如何更改我的代码和逻辑。有人可以告诉我吗?我欢迎任何想法。

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

2 回答 2

2

我认为问题出在这里:

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

你可以使用这段代码:

@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()
于 2020-09-20T07:38:37.880 回答
0

我的最终代码如下。非常感谢你的好建议!玛丽亚姆·阿卜杜里

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()
于 2020-09-20T11:36:14.670 回答