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

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

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

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

Python 3.x

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Q&A

解決済

1回答

1000閲覧

FlaskのFlask-SQLAlchemyによるデータベースの、特定のカラムの抽出が思うようにできない

lilliveon

総合スコア9

Flask

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

Python 3.x

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

0グッド

0クリップ

投稿2023/05/13 07:26

編集2023/05/13 07:51

実現したいこと

FlaskのFlask-SQLAlchemyによるデータベースの特定のカラムの抽出。

前提

イメージ説明
上の画像のquiz.dbにあるQuizsetテーブルの「Quizsetname」のカラムの中身を抽出したいです。僕の理想としては抽出して作られたリストは

[ポケモンクイズ,麻雀クイズ,ポケモンクイズ,麻雀クイズ]

となって欲しいのですが。質問に貼ってあるソースコードで実行すると結果がなぜか

[('ポケモンクイズ',), ('麻雀クイズ',), ('ポケモンクイズ',), ('麻雀クイズ',)]

というように、余計な「()」「' '」「,」が付いてしまいます。アドバイスいただけると嬉しいです。

発生している問題・エラーメッセージ

エラー文ではありませんが、結果を表示させていただきます。

* Serving Flask app 'test' * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 130-793-479 [('ポケモンクイズ',), ('麻雀クイズ',), ('ポケモンクイズ',), ('麻雀クイズ',)] 127.0.0.1 - - [13/May/2023 16:15:15] "GET / HTTP/1.1" 200 -

該当のソースコード

test.py

1from flask import Flask 2from flask import render_template 3from flask_sqlalchemy import SQLAlchemy 4 5app = Flask(__name__) 6app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///quiz.db" 7db = SQLAlchemy(app) 8 9class Quizset(db.Model): 10 Quizsetname = db.Column(db.String) 11 id = db.Column(db.Integer, primary_key=True) 12 problem = db.Column(db.String(100),nullable=False) 13 answer = db.Column(db.String(20), nullable=False) 14 reading = db.Column(db.String(20), nullable=False) 15 16@app.route("/") 17def top(): 18 quizsetname = Quizset.query.with_entities(Quizset.Quizsetname).all() 19 print(quizsetname) 20 return

試したこと

top関数の中身を変更して

test.py

1def top(): 2 quizsetname = Quizset.query.with_entities(Quizset.Quizsetname).all() 3 for i in quizsetname: 4 i = i[2:] 5 i = i[:4] 6 print(i) 7 return render_template("test.html", quizsetname=quizsetname)

にしてリストの中身をいじろうとしてみたのですが、結果は

イメージ説明

となり、なぜか「()」以外の文字が全て消えてしまいました。

補足情報(FW/ツールのバージョンなど)

Flask==2.3.2
Jinja2==3.1.2
Flask-SQLAlchemy==3.0.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

余計な「()」「' '」「,」が付いてしまいます。アドバイスいただけると嬉しいです。

これは余計なデータではありません。

tupleを要素として持つlistが帰ってきているだけです。

[ポケモンクイズ,麻雀クイズ,ポケモンクイズ,麻雀クイズ]

表示ではこうできますが、変数に入っている値としては、この形式にできません。


これだけだと分からないと思うので、もうちょっと説明します。

質問文にあるクエリを実行すると以下が取得できます。

python

1quizsetname = Quizset.query.with_entities(Quizset.Quizsetname).all()

python

1[('麻雀クイズ',), ('麻雀クイズ',), ('ポケモンクイズ',), ('ポケモンクイズ',)]

これは質問文にある通りです。

これは、上に書いた通りtupleのlistなので、以下の様な感じです。

[]

('麻雀クイズ', )

というtupleが4個入っている。

Quizset.Quizsetnameを指定していて、1カラムしか取ってこないですが、戻り値はtupleに入ります。

1個しか要素を持っていないtupleですね。

これを例えば、複数のカラムを指定して取得すると(idを追加)、

python

1quizsetname = Quizset.query.with_entities(Quizset.Quizsetname, Quizset.id).all()

以下の様に要素が増えたtupleが取得できます。

python

1quizsetname = {list: 4} [('麻雀クイズ', 1), ('麻雀クイズ', 2), ('ポケモンクイズ', 3), ('ポケモンクイズ', 4)] 2 0 = {Row: 2} ('麻雀クイズ', 1) 3 1 = {Row: 2} ('麻雀クイズ', 2) 4 2 = {Row: 2} ('ポケモンクイズ', 3) 5 3 = {Row: 2} ('ポケモンクイズ', 4)

というわけで、1個でも2個でもtupleが帰ってきているだけで、余計な物が入っているわけではありません。

[ポケモンクイズ,麻雀クイズ,ポケモンクイズ,麻雀クイズ]という形式で表示したい場合は、例えば以下の様な事をすれば可能です。(jinja2側で表示する場合は以下ではありませんのであしからず。)

python

1print('[', end="") 2for i, n in enumerate(quizsetname): 3 if i == len(quizsetname) - 1: 4 print(f'{n[0]}', end="") 5 else: 6 print(f'{n[0]}, ', end="") 7print(']', end="") 8 9# [麻雀クイズ, 麻雀クイズ, ポケモンクイズ, ポケモンクイズ] 10

そもそも上にリストっぽいのは下記間違いで、単にlistにしたい場合は以下のようにもできます。

python

1my_list = [n[0] for n in ret] 2# ['麻雀クイズ', '麻雀クイズ', 'ポケモンクイズ', 'ポケモンクイズ'] 3

質問とは関係が無いですが、Quizsetname は、別のテーブルにした方が自然な気がしました。
「麻雀クイズ」というのが2行に入っていますし、同じのが入る可能性があるなら別テーブルにした方があとあと面倒がなさそうです。

さらに、こちらはもっと関係ないですが、「answer」に対する問題なら「question」じゃないですかね?
question, problem, trouble, issue, matter (問題)の違い

投稿2023/05/15 03:54

FiroProchainezo

総合スコア2401

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

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

lilliveon

2023/05/15 08:06

例を交えて丁寧にご説明いただいたおかげで、とても分かりやすくてすぐに理解できました。 加えてテーブルや変数名に関するアドバイスまでしていただき本当にありがとうございました🙇
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問