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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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回答

8163閲覧

Python3で#0 has length 1; 2 is requiredのエラーを解決したいです。

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/09/20 09:13

編集2020/09/20 09:15

前回の投稿の続きになります。
前回投稿
現在開発しているAPIの機能は以下になります。
SQLの実行先のDBはGoogle BigQueryを使用しております。

①複数のレクエストパラメーター(luid)をリストで取得し、ループ処理でそれぞれを変数に格納 ②①の変数をWhere区の条件に使用しSQLを実行する *SQLの内容はリクエストされたluidのcv_dateカラムに値があればTrueを返す ③結果をパラメーター値:真偽値のJson形式でクライアントに返す

そこで、以下のSQLの結果とリクエストパラメーターをリスト化する処理の中で以下のエラーが出ています。
連続した要素はupdateできないよというエラーだと思うのですが、
本来rowをreturn row[0]で返すとTrue又はFalseで結果を取得できているので、何かupdateもしくはjson.dumpの使い方を間違っているのでしょうか??
何かアドバイスがあれば頂ければ幸いです。
よろしくお願いします。
稚拙なコードで理解しにくい所などありましたら申し訳ありません。
又、そもそものロジックなどで修正した方がいい点などがありましたらご教授頂きたいです。

for row in query_res: temp_result = json.dumps({request_luid: str(row[0]) }) break result.update(temp_result) ⇩ ValueError: dictionary update sequence element #0 has length 1; 2 is required
main.py def get_request(): request_luids = request.args.getlist('luid') or '' result = {} for i in range(len(request_luids)): request_luid = str(request_luids[i]) client = bigquery.Client() query = """SELECT EXISTS( SELECT 1 FROM `test-project-281806.hitobito_test.test3` as p WHERE p.luid = '{}' AND p.cv_date IS NOT NULL limit 1000)""".format(request_luid) 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: temp_result = json.dumps({request_luid: str(row[0]) }) break result.update(temp_result) return result if __name__ == "__main__": app.run()

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

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

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

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

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

guest

回答1

0

ベストアンサー

json.dumpsの使用タイミングが早すぎに見えます。

json.dumpsはPythonのオブジェクトをJSONフォーマットの文字列に変換する関数です。
そのため、この処理ではtemp_resultが文字列になってしまい、dict型のresultに突っ込めません。

元のコードにコメント:

main.py

1 2def get_request(): 3 request_luids = request.args.getlist('luid') or '' 4 result = {} 5 for i in range(len(request_luids)): 6 request_luid = str(request_luids[i]) 7 ## 中略 8 for row in query_res: 9 ## この時点で文字列になってる 10 temp_result = json.dumps({request_luid: str(row[0]) }) 11 break 12 13 ## dictに単純な文字列でのupdateは出来ない ValueError 14 result.update(temp_result) 15 return result

基本的にプログラムの外に渡すために必要となる処理(今回ではJSONシリアライズ)は、
極力処理終了の直前まで行わずにPythonオブジェクトのまま処理するほうが良いです。

例:

main.py

1 2def get_request(): 3 request_luids = request.args.getlist('luid') or '' 4 result = {} 5 for i in range(len(request_luids)): 6 request_luid = str(request_luids[i]) 7 ## 中略 8 for row in query_res: 9 # temp_resultはdict型として扱う 10 temp_result = {request_luid: str(row[0])} 11 break 12 13 ## dictをdictでupdateする 14 result.update(temp_result) 15 # この関数内でJSON文字列にしたいなら、このタイミングまで変換は遅らせる。 16 return json.dumps(result)

投稿2020/09/20 10:43

attakei

総合スコア2740

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

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

amaturePy

2020/09/20 11:27

ありがとうございます!! なるほど、、、とても勉強になりました! すごい調べてちょっと使えそうだから、使ってみただけで、その関数の本体の意味を理解していませんでした。luidに対するSQLの結果も正しく判定されており、リストの中もluid:判定値の形で理想の形になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問