質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

419閲覧

リクエストクエリによるSQLでデータの有無を判定し、処理結果を返す方法

amaturePy

総合スコア131

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/08/25 06:15

GAE上でFlaskでapiを開発しております。機能としては
①httpリクエストを取得
②リクエストの中からluidパラメータを取得
③そのluidを使いSQL(Google BigQuery)を実行し、そのluidと同じレコードにあるcv_dateカラムにデータがあればTrue、なければFalseを返す。
④その結果をクライアントに返すといった物です。

そこで、現行のコードをPostman(API開発用アプリ)を使いリクエストを送るとDB上にあるluidとDBに存在しないluidの両方のパラメータでTrueが返ってきます。Try分で条件分岐をさせているつもりなのですが、DBに存在しないluidのパラメーターの際にFalseを返すにはどのように変更するべきかアドバイスを頂きたいです。
基本的なrest_apiの開発だとは思うのですが、思った以上に躓いてしまい、ご質問させて頂いてます。

gcloud app logs tail -s test 結果 "GET /?luidU667xxxxxxxxx HTTP/1.1" 200 2020-08-25 06:09:03 test[20200825t060740] [2020-08-25 06:09:03 +0000] [8] [INFO] Starting gunicorn 20.0.4 2020-08-25 06:09:03 test[20200825t060740] [2020-08-25 06:09:03 +0000] [8] [INFO] Listening at: http://0.0.0.0:8081 (8) 2020-08-25 06:09:03 test[20200825t060740] [2020-08-25 06:09:03 +0000] [8] [INFO] Using worker: sync 2020-08-25 06:09:03 test[20200825t060740] [2020-08-25 06:09:03 +0000] [14] [INFO] Booting worker with pid: 14
/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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

try-exceptの使い方を根本的に勘違いしていませんか?

やりたいことはlen(list(query_job.result()))が1以上ならreturnとしてTrueを、それ以外ならFalseを返すなのでは?

amaturePyさんが行っているのは、len(list(query_job.result())) >= 1の値をis_existに入れ、何も判定しないでTrueを返すの様に見えます。

is_existには真偽値(True / False)が入っているはずです。想定通りの動きでしょうか?
また、is_exitstの値を見ないでTrueを返しているのも想定通りの動きでしょうか?
(client.query()の実行に失敗しないとexceptには行きません)

投稿2020/08/26 00:51

FiroProchainezo

総合スコア2401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaturePy

2020/08/26 01:13

はい。大変お恥ずかしい限りです。私もこちら掲載時にtry and exceptionを勘違いしておりました。 おっしゃる通りこちらtry部分でエラーが発生しないとexception以降の処理が実行されないですよね。 なので、現在if文で処理結果の分岐をさせようとしている所でございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問