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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

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

Q&A

解決済

2回答

4213閲覧

プログラミング初学者です。flaskからsqliteを用いたデータベースが作成できません。

sanvo

総合スコア1

Flask

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

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

0グッド

0クリップ

投稿2022/10/25 06:19

前提

https://note.com/junyaaa/n/n9eab953c73c9 を参考にflask と sqlite3を連携させてtodo 管理アプリを作ろうとしています。
flask を使ってデータベースを作ろうと思いソースコードをそのまま実行したところ以下のエラーメッセージが発生しました。

実現したいこと

flask_sqlalchemyとsqliteを使ってデータベースを作成できるようにする。

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

raise RuntimeError(unbound_message) from None RuntimeError: Working outside of application context. This typically means that you attempted to use functionality that needed the current application. To solve this, set up an application context with app.app_context(). See the documentation for more information.

該当のソースコード

python
from flask import Flask, render_template from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///potform.db' db = SQLAlchemy(app) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) employee_name = db.Column(db.String(30), nullable=False) request_date = db.Column(db.DateTime, nullable=False) pot_from = db.Column(db.DateTime, nullable=False) pot_to = db.Column(db.DateTime, nullable=False) response_date = db.Column(db.DateTime, nullable=False) supervisor_approval = db.Column(db.Boolean, nullable=False) supervisor_note = db.Column(db.String(100)) hr_note = db.Column(db.String(100)) @app.route("/") def main(): return render_template("index.html") if __name__ == "__main__": app.run(debug=True, host='0.0.0.0', port=8888, threaded=True)

試したこと

python,sqlalchemy、flask_sqlalchemyのバージョン変更
sqlite3のpathを通す。(パスが通ってないことが問題かと思いました。)

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

vscode バージョン: 1.72.2 (user setup)
windows 11

どうかよろしくお願いいたします。
ここにより詳細な情報を記載してください。

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

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

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

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

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

sanvo

2022/10/25 07:00

失礼しました。上記の方法を試したのですがそれでもうまくいかなかったため、焦り、同じ内容を投稿してしまいました。 以後気をつけます。
PondVillege

2022/10/25 07:14 編集

「試したこと」の欄に書かれていなかったので伺いましたが試されていたのですね, でしたら with app.app_context(): db.create_all() はどこに書いてダメだったんですか? 場所次第ではうまくいかなくて当然.となる場合もあります. 解答のため,質問のところにあるコードのファイル名を教えてください.
sanvo

2022/10/25 07:34

ご親切にありがとうございます。 app.pyです。 上記のコードの hr_note = db.Column(db.String(100)) @app.route("/") の間に以下のように書きました。 hr_note = db.Column(db.String(100)) from app import app, db with app.app_context(): db.create_all() @app.route("/") よろしくお願いいたします。
quickquip

2022/10/26 01:38

> 以下のように書きました。 そうしたらどうなったのかを質問に書かないといけないのではないでしょうか (それでどうなったのかで話が全然変わります)
sanvo

2022/10/26 05:20

おっしゃる通りです。失礼いたしました。 >>> from app import app,db >>> with app.app_context(): ...    db.create_all() ... という表示で止まりました。 改めてフォルダを見たところinsatanceの中に作成されていました。 丁寧にコメントくださりありがとうございました。
guest

回答2

0

ベストアンサー

他の人への回答のコメント欄に、何も説明せずに以下のコメントをするのは、無茶振りが過ぎませんか?

text

1上記の方法をためしたましたが 2 3NameError: name 'db' is not defined 4 5 6が発生しデータベースを作成することができませんでした。 7どのような原因が考えられるでしょうか。

上記だけだと単なる荒しなので、一応回答します。

質問文にあるコードをコピーし、「Flask データベース定義について」への回答にある手順と同じ手順でDB作成を実行してみたところ、作成できました。

本当に同じ手順を実行したのか確認をお願いします。

一応補足ですが、NameError: name 'db' is not definedの場合、dbが無いという意味です。
これはどこで出たのでしょうか?対話モードで実行してみたら出た感じでしょうか?
回答に記載した以下のコマンドを全く同じに入力していますか?

text

1from app import app, db 2with app.app_context(): 3 db.create_all()

from app import app, dbの部分で、dbを端折っていたりしませんか?
再度手順を確認して、対応してみてください。

また、質問するときは、ソースコード/フォルダ・ファイル構造/実行方法/実行時のエラーを省略せず全文、質問に記載すると、回答が付きやすくなると思いますので、その辺考慮ください。

さらに追加で補足しますと、以下の条件を満たしている必要があります。

  1. Flaskコードは、app.pyというファイルに記入している。(これは質問文に記載されていません。from appなのでapp.pyだろうと想像して回答しています。)
  2. FlaskとFlask-SQLAlchemyがインストールされている。
  3. app.pyが存在するフォルダで、python(python3)コマンドを実行し、pythonの対話モードを起動する。
  4. 対話モードに上記textに記載したコマンドを入力する。

投稿2022/10/25 07:41

FiroProchainezo

総合スコア2401

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

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

sanvo

2022/10/25 14:41

申し訳ありませんでした。 ほとんど同じ投稿をしたところ、警告を受けたため安易な考えで同じ内容のスレッドにコメントをしました。 大変なご無礼をしてしたことをお許しください。以後ご指導いただいたことをもとに気をつけます。 無礼を働いたにも関わらず丁寧に回答をくださりありがとうございます。 ご質問に対して回答させていただきます。 1.どこでNameError: name 'db' is not definedに関しては「from app import app,db」の「db」を記載しなかったことでおきました。 2.省略をせずに上記の分を入力したところ「IndentationError: expected an indented block after 'with' statement on line 1」というメッセージがでました。 3.インデントが異なっていることに気づき上記textの通りにしたところ「>>>」がでました。 4補足していただいた条件は再度確認しましたが満たしております。 また、venv環境、環境外のどちらの条件でも試しましたがうまくいきません。 ほかに条件はあるのでしょうか。どうかお力添えください。 長文失礼いたしました。
sanvo

2022/10/26 05:22

>>> from app import app,db >>> with app.app_context(): ... db.create_all() ... と上記のように表示されました。 すみません。解決しました。 instaceのなかに作成されていました。 私の不注意でご迷惑をおかけしました。 ご協力ありがとうございました。
FiroProchainezo

2022/10/26 05:23

以下の情報を質問文を編集して提供ください。 1. 実際のフォルダ構造と、ファイルの配置状況 2. 実行環境(Windowsか, Linux(Ubuntu, CentOS, Debian, その他・・・)か, Macか) 3. ターミナルに表示される文字列全部。(実行した内容を全て、省略せず、貼り付けて下さい。) 4. Pythonバージョン 5. venv環境構築手順 6. `pip freeze`の出力結果。(venvの場合は`pip freeze`。venv出ない場合は`pip3 freeze`) sanvoさんは、内容を省略しすぎです。 シェルなどで実行した内容は、入力/出力問わず見ればヒントになることが全て書いてあります。 その辺の情報提供が一切なしで回答はできません。 > 1.どこでNameError: name 'db' is not definedに関しては「from app import app,db」の「db」を記載しなかったことでおきました。 dbを記載しないだけで、上記メッセージは発生しません。 dbを記載しないでimportしたあと、dbを使用した時にでます。 何かが省略されていると判断している理由です。 > 2.省略をせずに上記の分を入力したところ「IndentationError: expected an indented block after 'with' statement on line 1」というメッセージがでました。 私のコードは、実行した結果をコピペして貼り付けたものです。 コピー方法が間違っているか、余計なものを入れている可能性が高いです。 シェルの内容など、入力/出力を省略せず記載いただかないと何もコメントできません。 > 3.インデントが異なっていることに気づき上記textの通りにしたところ「>>>」がでました。 意味が理解できません。 対話モードで実行している場合、常に`>>>`が表示されているはずです。 エラーが出ない場合は、正常終了したと判断しますが、何か問題があったということでしょうか? > 4補足していただいた条件は再度確認しましたが満たしております。 > また、venv環境、環境外のどちらの条件でも試しましたがうまくいきません。 条件を満たしていると判断した根拠、うまくいかなかったと判断した理由を提示ください。
sanvo

2022/10/26 05:59

改めて大変丁寧にコメントくださりありがとうございます。 条件を満たしていると判断したのはエラーが起きず、ディレクトリ内に変化が起きていないと早とちりしたからです。 ディレクトリ内にinstanceというファイルが作成されているのに気付き、中身を見たところ作成されておりました。 また、 from app import app, db >>> with app.app_context(): ... db.create_all() ... という流れでした。 先ほどは「>>>」と書きましたが間違いで「...」でした。 さらにEnterを押したところintstance内に作成されました。 ご指摘いただいたことを反省し、今後に生かしていきます。 深くお礼申し上げます。 ありがとうございました。
FiroProchainezo

2022/10/26 07:04

> ディレクトリ内にinstanceというファイルが作成されているのに気付き、中身を見たところ作成されておりました。 instanceというディレクトリが出来て、「potform.db」というファイルが作成されていた、の間違いではないですか?
guest

0

app.pyと同じディレクトリで,Pythonの対話モードを利用して以下のようにコマンドを入力してください.

Python

1>>> from app import app, db 2>>> with app.app_context(): 3... db.create_all()

投稿2022/10/25 07:39

PondVillege

総合スコア1579

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

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

sanvo

2022/10/25 15:13

同じディレクトリで試しましたが上手くいきませんでした。
PondVillege

2022/10/25 16:09

うまくいかなかった.と言われても,次の改善案が示せません. 具体的に,何がどうなったのでしょうか? 同じエラーが出たのですか? 何も表示されなかったのですか?
sanvo

2022/10/26 05:16

おっしゃる通りです。せっかく丁寧にアドバイスをくださっているのに対し失礼なコメントでした。 申し訳ありませんでした。 app.pyのあるディレクトリでpython対話モードで上記のように入力したところエラーとは表示されなかったのですが >>> from app import app,db >>> with app.app_context(): ... db.create_all() ... と上記のように表示されました。 すみません。解決しました。 instaceのなかに作成されていました。 ご迷惑をおかけしました。
PondVillege

2022/10/26 05:41

db.create_all()では何もエラーが出ず,データベースが作成される.が正解です. 何も表示されておらず,instanceの中に作成されていた.ということならそれで完了だと思います.
sanvo

2022/10/26 06:01

ご丁寧にありがとうございました。 深く感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問