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

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

ただいまの
回答率

87.61%

【Python+Flask】mysqlからの複数データ取得が出来ない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 347

score 35

<追加で質問があります。>
御回答を頂いて、大きな部分は解決したのですが、最後で未解決部分があります。
引き続き、教えて頂きたく。コンソール上で複数データ表示するところまでは成功しておりますが、HTML上で複数表示する部分で、スタックしてしまっております。

<背景>
Python Flaskを使用して、DB(mysql)サーバから、データを引っ張ってきて、HTMLに表示すると言うシステム全体を開発しております。
下記の様なシステムです。(Python✛Flaskで開発しております。)
・ユーザーは、HTML(index.html)上で、品目のチェックボックスにチェックを入れて(複数選択も可)、送信ボタンをクリックする。
・選択された品目のスペック情報を、DBから引っ張ってきて、HTML(index1.html)に表示する

<説明>
試行錯誤した結果、下記の様なコードにたどり着きました。(HTMLファイルは本質問とは直接関係ないので、Pythonファイルだけ記載します。)
一つの品目を選択した場合は、キチンと期待したデータを返してきます。(ここはOK)
しかしながら、複数の品目(2つでも3つでも)を選択した場合は、一番最初にチェックされた品目しか、リターンされません。(HTML上は勿論ですが、コンソール上でも同様です。)

<質問>
複数項目を表示(コンソール上に)させる為には、どの様なコードを書けば良いのでしょうか?
for文とWhile文の両方で、丸2日間、色々と試したのですが、どうしても上手くいきません。
よろしくお願いいたします。

<Pythonのコード>

from flask import Flask, render_template,request
import pymysql
app = Flask(__name__)

@app.route('/', methods=['GET'])
def get():
    return render_template('index.html', \
        title = 'Form Sample(get)', \
        message = 'Where do you want to go?')


def getConnection():
    return pymysql.connect(
        host='localhost',
        db='first_db',
        user='root',
        password='password',
        charset='utf8',
        cursorclass=pymysql.cursors.DictCursor
    )


@app.route('/', methods=['POST'])
def select_sql():
    connection = getConnection()
    message = "test"
    names = request.form.getlist('checkbox')

    for name in names:

        cursor = connection.cursor()
        sql = "select Country, Agency, email from tb3 where Country=%s";
        cursor.execute(sql, (name,))

        list1 = cursor.fetchall()
                print(list1) #コンソール上での動作確認用

    cursor.close()  #can110さんのコメント受け、Indent修正
    connection.close() #can110さんのコメント受け、Indent修正

    return render_template( 'index1.html', list1 = list1) #can110さんのコメント受け、Indent修正

if __name__ == '__main__':
    app.run()コード
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

ループ処理の中で最後にreturnしているからです。
ループ処理の中ではデータを取得、リストに追加までをおこない
ループを抜けたあとに各種closeおよびrender_templateする必要があるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/04/28 22:48 編集

    早速のコメントをありがとうございます。

    >ループを抜けたあとに各種closeおよびrender_templateする必要があるかと思います。

    御指摘の通りでした。
    Indentを修正した所、コンソール上でキチンと複数品目がリターンされるのを確認しました。

    ************
    申し訳ないのですが、もう一点、教えてください。

    コンソール上では解決したのですが、HTML上で表示されません。
    HTML(Index1.html)の該当コードは下記の様にしておりますが、複数品目を選んでも、HTML上では、相変わらず、1品目しか表示されません。(ループがHTML上で回りません。)
    下記のHTMLファイルの書き方を教えて頂きたく。
    お願いばかりで申し訳ないのですが、よろしくお願いいたします。

    <現行のIndex1.htmlの該当部分>
    ==============
    {% block content %}
      <tab> {% for listx1 in listx1s %}
    <tab><tab> <p>{{listx1}}</p>
    <tab> {% endfor %}
    {% endblock %}
    ===========

    キャンセル

  • 2021/05/01 15:52

    上記の部分(HTML上での表示)が解決できていないのですが、当初、質問させて頂いたコンソール上での表示問題は解決したので、一旦、解決済とさせて頂きます。
    ありがとうございました。

    HTML上での表示問題は、別の質問(https://teratail.com/questions/336073)を立てさせていただきます。
    引き続き、よろしくお願いいたします。

    キャンセル

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る