是否可以将 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 中的变量中的主要内容,如果未能解决你的问题,请参考以下文章
EXECUTE IMMEDIATE 中的 SQL 语句是不是在运行时解析?
Oracle 的 EXECUTE IMMEDIATE 与存储过程中的 LIKE 子句