sql - 是否可以将 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()
解决方案
你可以试试这个:
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
是非数字,则使用“{}”。
推荐阅读
- python - /edit 处的类型错误:edit() 缺少 1 个必需的位置参数:'entry'
- react-native - 查看未找到名称 RNCSafeAreaProvider 的配置
- angular - iot-smart-home-cloud(gcp 项目)注册的设备未出现在 Fluter 应用程序和 Angular/web 中
- java - Leetcode 451. 按频率对字符排序 PriorityQueue 排序问题
- javascript - 如何为成功时打开 JSP 的 AJAX 设置同步
- javascript - 如何检查数组中的多个对象是否为空
- php - 哪一个表现更好?在表格列中搜索或使用 whereHas()
- javascript - 当 axios 中的方法为“GET”时,为什么 Content-Type“appication/json”不起作用?
- java - 引起:org.gradle.process.internal.ExecException:Proceorg.gradle.api.tasks.TaskExecutionException:任务':service:bootRun'执行失败
- fortran - 派生类型数组的Fortran性能