首页 > 解决方案 > 是否可以将 EXECUTE IMMEDIATE 和 USING 放入 Python 中的变量中

问题描述

这是上一篇文章的延续。 如何根据用户输入参数从 BigQuery 获取结果。正如这些文章所说,我尝试使用 EXECUTE IMMEDIATE 和 USING 。 https://cloud.google.com/bigquery/docs/parameterized-queries https://towardsdatascience.com/how-to-use-dynamic-sql-in-bigquery-8c04dcc0f0de 但是当我运行 sql 时,我得到了语法错误 。我想让我的 sql 检查。我猜这个错误是由换行引起的,但我想这样做是为了可读性。对不起我糟糕的编码技巧。能给我建议吗??我有点担心 BigQuery 不支持 Python 中的动态参数。因为上面的文章似乎在 Console 而不是 Python 中使用了这些语句。

The error 

 File "/srv/main.py", line 14      SELECT EXISTS(SELECT 1
 SyntaxError: invalid syntax

SQL

query = """EXECUTE IMMEDIATE format("""
    SELECT EXISTS(SELECT 1
    FROM `test-266778.conversion_log.conversion_log_2020*` as p
    WHERE p.luid = @request_luid AND orderid != '' limit 1000)""")"""
    USING "request_luid" as request_luid;
/home/user/api_dev/main.py

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


app = Flask(__name__)


@app.route('/')
def get_request():
    request_luid = request.args.get('luid') or ''
    client = bigquery.Client()

    query = """EXECUTE IMMEDIATE format("""
    SELECT EXISTS(SELECT 1
    FROM `test-266778.conversion_log.conversion_log_2020*` as p
    WHERE p.luid = @request_luid AND orderid != '' limit 1000)""")"""
    USING "request_luid" as request_luid;

    job_config = bigquery.QueryJobConfig(
    query_parameters=[
        bigquery.ScalarQueryParameter("request_luid", "STRING", request_luid)
    ]
    )

    query_job = client.query(query, job_config=job_config)
    query_res = query_job.result()
    first_row = next(iter(query_job.result()))
    for row in query_res:
        return str(row)
        #return jsonify({request_luid:query_res.total_rows})


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

标签: sqlpython-3.xflaskgoogle-bigquery

解决方案


你可以试试这个:

def get_request():
    request_luid = request.args.get("luid") or ""
    client = bigquery.Client()

    query = """SELECT EXISTS(
                    SELECT 1
                    FROM `test-266778.conversion_log.conversion_log_2020*` as p
                    WHERE p.luid = {} 
                    AND p.orderid is not null limit 1000)""".format(request_luid)

    query_job = client.query(query)
    query_res = query_job.result()
    first_row = next(iter(query_job.result()))
    for row in query_res:
        return str(row)

注意:如果luid是非数字,则使用“{}”。


推荐阅读