Come verificare se i dati esistono in una colonna specifica su BigQuery con Flask?

Aug 24 2020

Ho creato api con Flask che riceve una richiesta HTTP con parametri (luid), prende i parametri e li passa a Bigquery all'interno dell'istruzione SQL e se il record di luid ha dati nella colonna cv_date, restituisce True. Tuttavia, quando ho provato a inviare una richiesta per questa API con luid che esiste davvero nella tabella BigQuery e non esiste lì, ho accettato True da entrambi. Voglio che restituisca False, se accetta un parametro luid che non esiste in BigQuery. Sembra che il tentativo e l'eccezione non funzionino bene. Qualcuno potrebbe darmi un'idea ?? Mi dispiace tanto per il mio codice scadente. Se mancano informazioni, fammelo sapere. Grazie mille .

inoltre, ho già impostato export GOOGLE_APPLICATION_CREDENTIALS = Json.file e ho assegnato IAM a questo account di servizio. Sono riuscito a inviare SQL a BigQuery tramite i log dell'applicazione gcloud tail -s test.

I siti a cui ho fatto riferimento sono di seguito https://blog.morizyun.com/python/library-bigquery-google-cloud.html Ricevi richieste HTTP con Variabile, Query BQ e Risposta di ritorno

/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 

Risposte

2 NeoAnderson Aug 25 2020 at 10:01

Quando esegui un SELECT che non corrisponde a nessuna voce nel DB, non viene generato alcun errore, quindi il tuo except:non viene eseguito. Il tuo codice ritorna False, solo se viene generata un'eccezione dalla tua try:sezione.

La tua logica sembra corretta: is_existdeve essere inizializzata con il valore Trueo Falserestituito >=dall'operatore. Devi solo restituire quel valore invece di restituirlo sempre True. Inoltre, puoi mantenere except:e presumere che nessuna voce corrisponda all'istruzione select se viene generata un'eccezione nel processo:

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