【问题标题】:Is it possible to put EXECUTE IMMEDIATE and USING into Variable in Python是否可以将 EXECUTE IMMEDIATE 和 USING 放入 Python 中的变量中
【发布时间】:2020-08-29 17:54:04
【问题描述】:

这是上一篇文章的延续。 How to get result from BigQuery based on user input parameters 。 正如这些文章所说,我尝试使用 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()

【问题讨论】:

    标签: sql python-3.x flask google-bigquery


    【解决方案1】:

    你可以试试这个:

    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 不是数字,则使用“{}”。

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      EXECUTE IMMEDIATE
        """SELECT EXISTS(SELECT 1 FROM `test-266778.conversion_log.conversion_log_2020*` WHERE luid = ? AND orderid is not null limit 1000)"""
      USING
        "string-value";
      

      对于数字输入值,不要使用双引号

      【讨论】:

      • 非常感谢。这个 sql 在我的编辑器中似乎没有问题。但我运行它时出错了。 【查询必须用额外的括号括起来,使其成为标量子查询表达式】你有什么想法吗??
      • 非常感谢。我试过了,我更正了缩进,但错误仍然存​​在“400 语法错误:在 [1:19] 出现意外的关键字 SELECT”。我一直认为我们不能在 BigQuery SQL 中使用 Python 中的全局变量,也无法使用“EXECUTE IMMEDIATE SELECT EXISTS”。
      • 我添加了一个新答案!
      • 老师 .... 确实有效!非常感谢 ! !我真的很感激!
      • 如果有帮助,请考虑投票!
      猜你喜欢
      • 2010-11-03
      • 2019-03-14
      • 2022-11-24
      • 2019-03-06
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      相关资源
      最近更新 更多