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

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

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

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

Python 3.x

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

SQLAlchemy

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3230閲覧

SQLAlchemyで値が取得できない。

ogiogimaru

総合スコア39

Flask

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

Python 3.x

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

SQLAlchemy

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/20 08:34

編集2021/06/21 09:08

FlaskでWebアプリの制作を勉強中に以下の問題にぶち当たりました。

# 任意のURLをurlとしてフィルターを掛けている from .models import * from . import db source_list = db.session.query(Link.source).filter_by(target=url).all()

model.pyで定義したLinkクラスの「特定のtargetのsourceだけを抜き取りたい」と考えて上記の処理を記述したのですが、source_listになにも格納されません。
以下のようにLinkにはデータが格納されています。

links = Link.query.all() ↓出力 [<Link algorithm.html, data.html>, <Link algorithm.html, search.html>, <Link algorithm.html, sort.html>, <Link data.html, graph.html>, <Link graph.html, data.html>, <Link graph.html, search.html>, <Link search.html, data.html>, <Link search.html, sort.html>, <Link sort.html, data.html>, <Link sort.html, search.html>]

例えば、target(右の値)==data.htmlを持っているLinkのsourceだけのリストを作りたいです。

targetの値に絞ると以下のように出力されます。

links = db.session.query(Link.source).filter_by(target="data.html").all() ↓出力 [('algorithm.html',), ('graph.html',), ('search.html',), ('sort.html',)] しかし、以下だとできないです。 url_list = ['algorithm.html', 'data.html', 'graph.html', 'search.html', 'sort.html'] for url in url_list: print(url) print(type(url)) source_list = db.session.query(Link.source).filter_by(target= f"{url}").all() # (target=url)もだめでした。 ↓出力 algorithm.html <class 'str'> []

モデルは以下のとおりです。

#models.py class Link(db.Model): source = db.Column(db.String(150), primary_key=True) target = db.Column(db.String(150), primary_key=True)

また、格納は以下のコードで行いました。

link_items = list() url_list = ['algorithm.html', 'data.html', 'graph.html', 'search.html', 'sort.html'] for url in url_list: for link in link_list: # linklistには外側のループ毎にいくつかのurlがランダムに格納されています。 new_link = Link(source=url, target=link) link_items.append(new_link) db.session.add_all(link_items) db.session.commit()

行き詰まっています。何卒ご教授よろしくお願いいたします。

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

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

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

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

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

quickquip

2021/06/21 02:51 編集

> Linkのsourceとtargetにそれぞれ値が入っているのは確認しています。 ここが具体的でない(何をして、何を観測したのかが分からない)ことで、回答が難しくなっている気がします。
ogiogimaru

2021/06/21 08:15

承知いたしました。加筆修正いたします。
quickquip

2021/06/21 08:29 編集

すでに回答も付いていまし、再度の話になりますが、コードに不思議なところはないので「何を」「どうやって」確認したのか? という点にかかっていると思います。 データベースをSQLで確認した、とかそういうことではないのですか? source_listになにも格納されません もFlaskを起動してブラウザからアクセスして確認しているのか? どうかすらわかりません。 「SQLite3を使っていてファイルが別のところにある」が可能性高いとは思ってますが……
ogiogimaru

2021/06/21 08:29

「aaa.htmlに条件を絞ると同じ行のddd.htmlが取得できる」といったようにしたいと考えていました。
quickquip

2021/06/21 08:31

こうやってデータを格納しました、は分かったのですが、それがデータベースに「入っていること」は確認してないということですか?
quickquip

2021/06/21 08:31

「例えば、以下のようにデータが格納されています。 」はどういう意味ですか???
quickquip

2021/06/21 08:34

ファイル構造と、ファイルの中身と、実行したコマンド履歴が全部あった方がいい気がします
ogiogimaru

2021/06/21 09:56

いくつものアドバイスありがとうございました。データが格納されていなかった原因は、単純に条件に合うデータが存在しなかったからです。お恥ずかしい限りです…。
guest

回答3

0

コードには問題がなさそうなので「どこに」書いているか、「どうやって」実行しているのか? の方の問題です。そしてその情報がほぼありません。

手元にシンプルなflask_sqlalchemyのサンプルがあったので、ちょっとデータとコードを入れてみました。(質問者さんがflask_sqlalchemyを使っているかはわかりませんが)

DB

plain

1% sqlite3 demo/app.db 2SQLite version 3.32.3 2020-06-18 14:16:19 3Enter ".help" for usage hints. 4sqlite> select * from link; 5algorithm.html|data.html 6algorithm.html|search.html 7algorithm.html|sort.html 8data.html|graph.html 9graph.html|data.html 10graph.html|search.html 11search.html|data.html 12search.html|sort.html 13sort.html|data.html 14sort.html|search.html 15sqlite> ^D

demo/__init__.py

python

1from flask import Flask 2from flask_sqlalchemy import SQLAlchemy 3 4app = Flask(__name__) 5app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' 6app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 7 8db = SQLAlchemy(app) 9 10from . import models

demo/views.py

from . import app from .models import * @app.route('/') def home(): source_list = db.session.query(Link.source).filter_by(target='data.html').all() # (target=url)もだめでした。 print(source_list) url_list = ['algorithm.html', 'data.html', 'graph.html', 'search.html', 'sort.html'] for url in url_list: print(url) print(type(url)) source_list = db.session.query(Link.source).filter_by(target= f"{url}").all() # (target=url)もだめでした。 print(source_list) return 'ok'

run.py

from demo.views import app if __name__ == "__main__": app.run()

demo/models.pyやマイグレーション系は略


shell

1python run.py

を実行してhttp://127.0.0.1:5000/にアクセス。ブラウザにokが出るのを確認。
ターミナル上は

plain

1[('algorithm.html',), ('graph.html',), ('search.html',), ('sort.html',)] 2algorithm.html 3<class 'str'> 4[] 5data.html 6<class 'str'> 7[('algorithm.html',), ('graph.html',), ('search.html',), ('sort.html',)] 8graph.html 9<class 'str'> 10[('data.html',)] 11search.html 12<class 'str'> 13[('algorithm.html',), ('graph.html',), ('sort.html',)] 14sort.html 15<class 'str'> 16[('algorithm.html',), ('search.html',)]

でした。

投稿2021/06/21 09:57

quickquip

総合スコア11202

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

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

quickquip

2021/06/21 09:59

行き違った……
ogiogimaru

2021/06/21 10:00

ありがとうございます!コードが正しい事がわかったのはすごく嬉しいです!ものすごく参考になりました。精進いたします。
guest

0

ベストアンサー

app.pyとして以下のコードを作成

python

1# app.py 2from flask import Flask 3from flask_sqlalchemy import SQLAlchemy 4 5app = Flask(__name__) 6 7app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' 8db = SQLAlchemy(app) 9 10 11class Link(db.Model): 12 source = db.Column(db.String(150), primary_key=True) 13 target = db.Column(db.String(150), primary_key=True) 14 15 16@app.route('/') 17def index(): 18 return '' 19 20 21if __name__ == '__main__': 22 app.run() 23

pythonコンソールで以下を順次実行。
どんなデータが入っているのか不明なので、aaaとbbbを入れて取得できるか確認。

>>> from app import db >>> db.create_all() >>> from app import Link >>> link1 = Link(source='aaa', target='bbb') >>> db.session.add(link1) >>> db.session.commit() >>> source_list = db.session.query(Link.source).filter_by(target='bbb').all() >>> print(source_list) [('aaa',)] >>> source_list2 = db.session.query(Link).filter_by(target='bbb').all() >>> print(source_list2) [<Link aaa, bbb>]

source_listおよびsource_list2のどちらの取得方法でも、target='bbb'に対する値(aaa)が取得できています。

urlとして指定している値が間違っているか、DBに入っている値が間違っているかのどちらかだと思います。

DBと連携した質問をする場合は、DBに入っている値、それを入れるためのinsert(もしくはそれに類するコード)、DBからデータを取得するのに使ったコードを提供いただけると正確な回答ができる可能性が上がります。

投稿2021/06/21 03:59

FiroProchainezo

総合スコア2421

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

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

ogiogimaru

2021/06/21 08:23

格納に使用したコードを載せておきました。他に足りない部分がございましたらすぐに用意いたします。
FiroProchainezo

2021/06/21 08:46

以下 ``` source → ["aaa.html", "bbb.html", "ccc.html"] ↓      ↓      ↓ target → ["ddd.html", "eee.html", "fff.html"] ``` と以下の関連性を教えてください。 ``` link_items = list() url = "aaa.html" for link in link_list: # linklistには["ddd.html", "eee.html", "fff.html"]といったように格納されています。 new_link = Link(source=url, target=link) link_items.append(new_link) db.session.add_all(link_items) db.session.commit() ``` urlは固定で、ddd.html,eee.html,fff.htmlと入れても、sourceは常にaaa.htmlで変わらないのではないですか? `例えば、以下のようにデータが格納されています。 `と書いてありますが、そのようにデータは格納されていないはずです。 実際にデータを入れたコードやinsert文と、そのデータ内容を教えてください。
ogiogimaru

2021/06/21 09:31

失礼いたしました。データ格納に使用したコード、データの中身を載せておきました。
ogiogimaru

2021/06/21 09:55

申し訳ありません。せっかくお時間頂戴したのに、出力の原因が、そもそも条件に合うデータがなかったからでした。アドバイスいただきありがとうございました。
guest

0

単純に条件に一致するものがなかっただけだったようです。当たり前のこと過ぎてお恥ずかしい限りです。回答してくださった方々には深く感謝を。ありがとうございました。

投稿2021/06/21 09:53

ogiogimaru

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問