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

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

解決済

2回答

6786閲覧

BigQuery上、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/29 04:04

編集2020/08/29 04:23

現在以下のことを実行したく、トライアンドエラーを繰り返してます。
1、GETパラメーターから取得するluid:Uxxxxxxの値を変数に格納
2、その変数をSQLのwhere区で使用して、その動的に取得したluidと一致するデータをDBから取得する

調べてはみた所、変数に静的に値を指定して、それを使う方法はあるようなのですが、リクエストURLにあるパラメーターの値を使ってのSQLの書き方などがあればご教授頂きたいです。よろしくお願いします。

request_luidの中身はreturn request_luidでリクエストパラメーターの値が入っていることを確認できています。
また、BigQueryのコンソール画面からこちらのファイルから投げられたSQLの履歴を見ると
where区以下の動的変数で扱いたいrequest_luidがそのまま静的な文字として伝わっていました。

query = """SELECT EXISTS(SELECT 1 FROM `test-266778.conversion_log.conversion_log_2020*` as p WHERE request_luid = p.luid AND orderid != '' limit 1000)""" ↑     ここが静的な変数名で伝わっている

【参照】
Google BigQuery ドキュメント

/home/user/api_dev/main.py from flask import Flask, request, jsonify from google.cloud import bigquery app = Flask(__name__) @app.route('/') def get_request(): request_luid = request.args.get('luid') or '' client = bigquery.Client() query = """SELECT EXISTS(SELECT 1 FROM `test-266778.conversion_log.conversion_log_2020*` as p WHERE @request_luid = p.luid AND orderid != '' limit 1000)""" job_config = bigquery.QueryJobConfig( query_parameters=[ bigquery.ScalarQueryParameter("request_luid", "STRING", request_luid) ] ) query_job = client.query(query) query_res = query_job.result() for row in query_res: return jsonify({request_luid:query_res.total_rows}) if __name__ == "__main__": app.run()

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

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

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

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

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

amaturePy

2020/08/29 04:23

失礼しました。 修正しました。
guest

回答2

0

いまさらですが、

query_job = client.query(query)

query_job = client.query(query, job_config=job_config)

ではないでしょうか (試しておりません)。

投稿2021/01/25 19:04

68user

総合スコア2005

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

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

0

ベストアンサー

クエリパラメータを外部的に使えるのはツールの機能な気がします。
Google データポータルのBigQuery Connecterでクエリパラメータが使えるようになったので触ってみる

質問のような使い方をする場合は動的SQLで、EXECUTE IMMEDIATEでのusingだと思います。

投稿2020/08/29 05:07

sazi

総合スコア25173

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

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

amaturePy

2020/08/29 09:29

ありがとうございます!全く気付きませんでした。何度か使おうと試しているのですが、 [ 400 Syntax error: Unclosed string literal at [2:1]]のエラーが出てしまい。 上で記載しているSQLとの組み合わせ方がうまく掴めず、、、こちら分かる範囲でお教え頂きたいのですが、現状以下の書き方で試し他のですが、アドバイスなどあれば頂きたいです。 query ="""EXECUTE IMMEDIATE "SELECT EXISTS(SELECT 1 FROM `test-266778.conversion_log.conversion_log_2020*` as p WHERE p.luid = @request_luid AND orderid != '' limit 1000)" USING request_luid as request_luid"""
sazi

2020/08/29 10:18

”のエスケープが逆じゃないでしょうか。 query ="EXECUTE IMMEDIATE ""SELECT EXISTS(SELECT 1 FROM `test-266778.conversion_log.conversion_log_2020*` as p WHERE p.luid = @request_luid AND orderid != '' limit 1000)"" USING request_luid as request_luid"
amaturePy

2020/08/29 14:45

ありがとうございます!頂いた物も試したのですが以下のエラーが出てしまい。再度ドキュメントなどを読みながら頂いたSQLを編集しながら試そうと思います。 google.api_core.exceptions.BadRequest: 400 Syntax error: Unexpected keyword SELECT at [1:19]
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問