【问题标题】:How to check whether data exists in specific column on BigQuery with Flask?如何使用 Flask 检查 BigQuery 的特定列中是否存在数据?
【发布时间】:2020-12-13 17:34:03
【问题描述】:

我一直在使用 Flask 制作 api,它接收带有参数(luid)的 HTTP 请求,获取参数并将它们传递给 SQL 语句中的 Bigquery,如果 luid 的记录在 cv_date 列中有数据,则返回 True。但是,当我尝试使用实际存在于 BigQuery 表中但不存在于其中的 luid 向此 api 发送请求时,我从他们俩那里接受了 True 。如果它采用 BigQuery 中不存在的 luid 参数,我想让它返回 False 。似乎尝试和异常不能很好地工作。谁能给我个主意??我很抱歉我糟糕的代码。如果缺少任何信息,请告诉我。非常感谢。

此外,我已经设置了 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 Receive HTTP request with Variable, Query BQ and Return Response

/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 

【问题讨论】:

  • @Soumendra Mishra 谢谢。我对其进行了编辑并使其更加清晰。

标签: python-3.x google-app-engine flask google-bigquery


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢。我将 return "True" 替换为 return is_exist ,但出现以下错误。它返回类型必须是字符串、字典、元组、响应实例或 WSGI 可调用的,但它是布尔值。
  • 我正在编辑答案。您可以使用str() 将 True 转换为“True”
  • 它有效。非常感谢您的解释!我理解尝试和例外。我将尝试编辑我的代码以按我的预期工作。
  • 很高兴我能帮上忙。感谢您的反馈!
  • 另一种方式:query_job.result() 有一个名为total_rows 的属性。您可以检查这是否为 0(不存在)
猜你喜欢
  • 2019-03-14
  • 2013-12-14
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2017-03-31
  • 2012-09-07
相关资源
最近更新 更多