是否可以将 EXECUTE IMMEDIATE 和 USING 放入 Python 中的变量中

Posted

技术标签:

【中文标题】是否可以将 EXECUTE IMMEDIATE 和 USING 放入 Python 中的变量中【英文标题】:Is it possible to put EXECUTE IMMEDIATE and USING into Variable in 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()

【问题讨论】:

【参考方案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”。 我添加了一个新答案! 老师 .... 确实有效!非常感谢 ! !我真的很感激! 如果有帮助,请考虑投票!

以上是关于是否可以将 EXECUTE IMMEDIATE 和 USING 放入 Python 中的变量中的主要内容,如果未能解决你的问题,请参考以下文章

oracle 中execute immediate作用

EXECUTE IMMEDIATE 插入多行列

EXECUTE IMMEDIATE 中的 SQL 语句是不是在运行时解析?

Oracle 的 EXECUTE IMMEDIATE 与存储过程中的 LIKE 子句

在 Oracle 中使用 Execute Immediate 将数据插入表中

如何在此代码中正确使用 oracle EXECUTE IMMEDIATE