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

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

ただいまの
回答率

90.48%

  • Python 3.x

    10230questions

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

  • Flask

    362questions

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

  • SQLAlchemy

    55questions

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

Flask-SQLAlchemyを使うために不足している箇所はなにか?なぜか動かない。。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,180

Flask-SQLAlchemyの書き方を勉強しています。
以下のコードまでは書いてみました。実際にORMとマイグレーションツールをつかってテーブルができるまでを第一目標としています。

チュートリアルを書いてみたのはいいものの、動かし方がわかっていません。
manage.pyを動かしてサーバーを立てた状態で以下のコマンドをやってもこのようなエラーがでました。

flask db initの実行場所を間違えているのでしょうか?
加えて、DBモデルのコードで何か不足している点、書き間違えている点をご指摘頂きけませんでしょうか?

t@MAC ~/l/c/dev> flask db init
Usage: flask db init [OPTIONS]

Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.

modelのコード

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.dialects.mssql import TINYINT
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from a.config import test
from a import create_app

app = create_app(test)
db = SQLAlchemy(app)
migrate = Migrate(app, db)


engine = create_engine(test, echo=True)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))


class Master(db.Model):
    __tablename__ = 'master'

    master_id = db.Column(db.String(225), primary_key=True, nullable=False)
    account_id = db.Column(db.String(225), primary_key=True, nullable=False)
    user_id = db.Column(db.String(225))

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.

とそのものズバリ書いてあると思うのですが、読んでないのでしょうか。

http://flask.pocoo.org/docs/1.0/cli/

The FLASK_APP environment variable is used to specify how to load the application.
(略)
If FLASK_APP is not set, the command will look for a file called wsgi.py or app.py and try to detect an application instance or factory.

とありますね。
環境変数FLASK_APPで指定するか、wsgi.py か app.py を置く必要がある、と。

flask_migrateは使ってないのでわかりませんが、

FLASK_APP=(ファイル名の拡張子を除いた部分) flask db init


とでもすればいいんじゃないかと想像します。


FLASK_APP=モジュール名 flask db init


export FLASK_APP=モジュール名
flask db init


でいいと思います。


FLASK_APP=モジュール名
flask db init


は駄目です。

参考 https://qiita.com/pink/items/73e712345cfabaef31e8

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/03 02:23 編集

    コメントありがとうございます!上の方が切れており上手くコピペできていませんでしたが、FLASK_APP=(ファイル名の拡張子を除いた部分)は設定してやってエラー画面がでています。
    ちなみに、どのファイル名を記入したほうがよいとおっっしゃっていますでしょうか?
    FLASK_APP environment variableを指すものは何かという質問と同義かもしれません。
    私は、 app.runが記述されたファイルのことだと認識しています。

    キャンセル

  • 2018/08/03 07:57

    精確には指定するのはモジュール名。app(かapplication)という名前のattributeを持っていて、それがFlaskクラスのインスタンスである必要がある。それがなければcreate_app(かmake_app)というファクトリ関数を持っているかを探す。それか、`モジュール名:属性名`でFlaskクラスのインスタンスを指定する。と、回答に書いたurlで説明されている。

    キャンセル

  • 2018/08/03 07:59

    app.run()が**実行される**ようなモジュールを指定したら、サーバが実行されてしまってまずいんじゃないでしょうか?

    キャンセル

  • 2018/08/05 14:21 編集

    ありがとうございます!
    ```
    export FLASK_APP=manage:app_test
    flask db init
    ```
    で実行しました。
    また、
    migrationに関わるコードはあまりmodelファイルに書かないほうが良いみたいで
    migrate = Migrate(app, db)のコードをenv.pyに書いてmigrationの実行までできるようになりました。

    ご丁寧にありがとうございました。

    キャンセル

+1

ファイル名や、コマンド実行時のタイプミスかなと思います。

If FLASK_APP is not set, the command will look for a file called wsgi.py or app.py and try to detect an application instance or factory.

上の引用に沿う形で、質問文にあるコードを自分の環境で試してみました。

コードをmanage.pyとして、次のように実行します。

$ FLASK_APP=manage flask db init
Usage: flask [OPTIONS] COMMAND [ARGS]...

Error: No such command "db".

別のエラーが出ていますが、Flaskのアプリケーションとして、認識してくれているようです。

何か問題の解決につながれば幸いです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/05 14:23

    実行ありがとうございました。
    勝手にmodelの記述が原因でエラーを吐き出しているとおもっていましたが、typoのようでした。

    キャンセル

  • 2018/08/05 14:23

    実行ありがとうございました。
    勝手にmodelの記述が原因でエラーを吐き出しているとおもっていましたが、typoのようでした。

    キャンセル

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

  • Python 3.x

    10230questions

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

  • Flask

    362questions

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

  • SQLAlchemy

    55questions

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