Flaskを使用してBigQueryの特定の列にデータが存在するかどうかを確認するにはどうすればよいですか?

Aug 24 2020

私は、parameters(luid)を含むHTTPリクエストを受信し、パラメーターを取得してSQLステートメント内でBigqueryに渡すFlaskを使用してAPIを作成してきました。また、luidのレコードのcv_date列にデータがある場合は、Trueを返します。ただし、BigQueryテーブルに実際に存在し、そこに存在しないluidを使用してこのAPIにリクエストを送信しようとすると、両方からTrueを受け入れました。BigQueryに存在しないluidパラメーターを受け取る場合は、Falseを返すようにします。試行と例外がうまく機能しないようです。誰かが私にアイデアを与えることができますか?貧弱なコードでごめんなさい。情報が不足している場合は、お知らせください。どうもありがとうございます 。

その上、私はすでにexport GOOGLE_APPLICATION_CREDENTIALS = Json.fileを設定し、IAMをこのサービスアカウントに割り当てています。gcloud app logs tail -stestによってSQLをBigQueryに送信することに成功しました。

私が参照したサイトは以下のとおりです https://blog.morizyun.com/python/library-bigquery-google-cloud.html 変数、クエリBQ、および応答を含むHTTP要求を受信します

/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 

回答

2 NeoAnderson Aug 25 2020 at 10:01

DB内のどのエントリとも一致しないSELECTを実行しても、エラーはスローexcept:されないため、実行されません。セクションFalseから例外がスローされた場合にのみ、コードはを返しますtry:

あなたの論理は正しいようです:演算子によって返されるor値でis_exist初期化されなければなりません。常にを返すのではなく、その値を返す必要があります。さらに、プロセスで例外がスローされた場合、を保持し、selectステートメントに一致するエントリがないと想定できます。TrueFalse>=Trueexcept:

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