如何使用 Flask 检查 BigQuery 的特定列中是否存在数据?

How to check whether data exists in specific column on BigQuery with Flask?

我一直在使用 Flask 制作 api,它接收带有参数 (luid) 的 HTTP 请求,获取参数并在 SQL 语句中将它们传递给 Bigquery,如果 luid 的记录有cv_date 列中的数据,它 return 是正确的。但是,当我尝试使用 BigQuery table 中确实存在但不存在的 luids 发送请求以便 api 时,我从他们两个那里接受了 True 。如果它采用 BigQuery 中不存在的 luid 参数,我想将其设置为 return False 。似乎 try 和 exception 效果不佳。谁能给我主意??我为我糟糕的代码感到抱歉。如果缺少任何信息,请告诉我。非常感谢。

此外,我已经设置了export GOOGLE_APPLICATION_CREDENTIALS = Json.file 并为这个服务账户分配了IAM。我成功地通过 gcloud app logs tail -s test 将 SQL 发送到 BigQuery。

我提到的网站如下https://blog.morizyun.com/python/library-bigquery-google-cloud.html

/home/user/api_dev/main.py

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


app = Flask(__name__)


@app.route('/')
def get_request():
    # luid = request.args.get('luid') or ''
    client = bigquery.Client()
    query = """SELECT EXISTS(SELECT cv_date
FROM `test-266110.conversion_log.conversion_log_2020*`
WHERE luid = `test-266110.conversion_log.conversion_log_2020*`.luid limit 1000)"""

    try:
        query_job = client.query(query)
        is_exist = len(list(query_job.result())) >= 1
        return "True"
    except:
        return "False"


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

luid | pgid | cv_date | orderid 
Uxxxx| 1111 | 2020-08-01| 2222 if this luid, it returns True 
Uxxxx| 2222 |      |        if this luid, it returns False 

当您执行与数据库中的任何条目都不匹配的 SELECT 时,不会抛出任何错误,因此不会执行您的 except:。您的代码 returns False,仅当您的 try: 部分抛出异常时。

您的逻辑似乎是正确的:is_exist 应使用 TrueFalse 值 return 由 >= 运算符初始化。您只需要 return 该值而不是总是 returning True。此外,如果在过程中抛出异常,您可以保留 except: 并假设没有条目匹配 select 语句:

[...]
    try:
        query_job = client.query(query)
        is_exist = len(list(query_job.result())) >= 1
        return str(is_exist)
    except:
        return False
[...]