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

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

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

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

938閲覧

(sqlite3.OperationalError) no such table: が解決できません。

kgnmakl

総合スコア12

Flask

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2023/04/23 11:51

編集2023/04/23 16:56

実現したいこと

YouTubeでいまにゅさんの動画を参考(https://www.youtube.com/watch?v=VtJ-fGm4gNg&t=5383s)にflaskとPythonを使った記事投稿サイトを作成してます。

前提

indexページ表示時に以下のメッセージが表示されます。

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

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: post [SQL: INSERT INTO post (title, body, created_at) VALUES (?, ?, ?)] [parameters: ('f', 'a', '2023-04-23 20:30:29.259175')] (Background on this error at: https://sqlalche.me/e/20/e3q8)

該当のソースコード

Python

1from flask import Flask 2from flask import render_template, request, redirect 3 4from flask_sqlalchemy import SQLAlchemy 5from datetime import datetime 6 7import pytz 8 9app=Flask(__name__) 10# configure the SQLite database, relative to the app instance folder 11app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///blog.db" 12 13# create the extension 14db = SQLAlchemy(app) 15 16class Post(db.Model): 17 id = db.Column(db.Integer, primary_key=True) 18 title = db.Column(db.String(50), nullable=False) 19 body = db.Column(db.String(300), nullable=False) 20 created_at=db.Column(db.DateTime, nullable=False, default=datetime.now(pytz.timezone('Asia/Tokyo'))) 21 22@app.route('/') 23def index(): 24 return render_template('index.html') 25 26@app.route('/create',methods=['GET','POST']) 27def create(): 28 if request.method == 'POST': 29 30 title = request.form.get('title') 31 body = request.form.get('body') 32 33 post=Post(title=title, body=body) 34 35 db.session.add(post) 36 db.session.commit() 37 38 return redirect('/') 39 40 41 else: 42 return render_template('create.html')

試したこと

下記のようにdb.session.commit())をコメントアウトして、実行しました。

db.session.add(post) # db.session.commit()

commit()を実行していないので、新規記事の反映されませんでしたが、エラーもなくredirectされました。

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

Python 3.10.6
Visual Studio Codeを使用しています。

あなたは このコードをどのように配置していますか?
app.py というファイルに上記のコードを書きました。

あなたは flaskをどのように起動していますか?
Visual Studio Codeで'' ''Flask02' というファイルを開き、ターミナルで
export FLASK_APP=app
flask --app app run --debug
として、実行しています。

あなたが実行している環境 では、blog.db をどのように作成しましたか? そのファイルはどこにありますか?
blog.bdはターミナルで
python3とし、対話モードにし

from app import bd
bd.create_all())

とすることで、instanceというフォルダが作成され、その中にblog.bdというファイルが作成されました。

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

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

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

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

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

quickquip

2023/04/23 14:40

**あなたは** このコードをどのように配置していますか? **あなたは** flaskをどのように起動していますか? **あなたが実行している環境** では、blog.db をどのように作成しましたか? そのファイルはどこにありますか?
m.ts10806

2023/04/24 00:27

「HTML」は本件とほとんど関係ないと思います。
quickquip

2023/04/24 05:07

OSがわからないので確実性はないですが macやLinuxなら、sqlite3 instance/blog.db してできたファイルの中身をチェックして、 .tables コマンドでどんなテーブルがあるか確認するとかからですかね https://www.sqlite.org/faq.html#q7 db を bd と書いてますが、作業中にここを取り違えているとかはないですか? (質問した時の誤字なのか、作業した時の誤字なのかの区別は、第三者にはできません)
kgnmakl

2023/04/24 05:23

コメントありがとうございます。db を bdとしたのは質問時の誤字です。失礼しました。 sqlite3 instance/blog.db してできたファイルとありますが、上記で示した通り、instanceは指定していません。sqlite:///blog.dbでinstanceとうファイルが生成されました。これは、flaskの仕様なのでしょうか?それとも、このあたりにエラーの要因があるのでしょうか。
guest

回答1

0

自己解決

今回のようなコードの場合はアプリのコンテキストなるものが必要になるらしく、それはflask shellの場合しかアプリのコンテキストで動作するREPL環境を起動してくれないようです。

$ flask shell >>>from app import db >>>db.create_all()

とすることで、instanceというフォルダの中にblog.dbが作成され、解決しました。
質問に示すように、

$python3 >>>from app import db >>>db.create_all()

としてもinstanceフォルダの中にblog.dbが作成されますが、パスの関係?でno such tableとなるようです。参考URLを示します。
https://qiita.com/k-dev-curry/items/057884aa7c9fb46e3118

投稿2023/04/24 06:01

kgnmakl

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問