2017-05-01 20 views
-1

Flask-SQLAlchemyを使用してFlaskアプリケーションを構築していますが、メインアプリケーションを実行せずにSqlite3データベースを作成するスクリプトを作成しようとしています。循環参照を避けるために、FlaskのメインアプリケーションオブジェクトとSQLAlchemyデータベースオブジェクトを別々のモジュールに初期化しました。私はその後、アプリケーションを実行するときに3番目のファイルにインポートして結合します。これは、データベースを構築し、行を作成してクエリを実行するときに正しく動作するため、アプリケーションを実行しているときに問題なく動作します。しかし、私は別のモジュールでそれらをインポートしようとすると、私は次のエラーを取得する:/フラスコ内のデータベースを作成するsqlalchemy

ルート/ create_database.py

from application.database import db 
from application.server import app 

db.init_app(app) 

db.create_all() 

ルート:

RuntimeError: application not registered on db instance and no applicationbound to current context 

私のコードは次のようになります。 run.sh

export FLASK_APP=application/server.py 
flask run 

ルート/アプリケーション/ のinit .py

from database import db 
from server import app 

db.init_app(app)  

from routes import apply_routes 
apply_routes(app) 

ルート/アプリケーション/ database.py

from flask_sqlalchemy import SQLAlchemy 
db = SQLAlchemy() 

ルート/アプリケーション/ server.py

from flask import Flask 
import os 
app = Flask(__name__) 

path = os.path.dirname(os.path.realpath(__file__)) 
database_path = os.path.join(path, '../mydb.sqlite') 

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + database_path 

ルート/アプリケーション/モデル/ INITの.py

from user import User 

ルート/アプリケーション/モデル/ user.py私create_database.pyスクリプトで

from application.database import db 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
    password = db.Column(db.String(120)) 

    def __init__(self, username, password): 
     self.username = username 
     self.password = password 

私はSQLAlchemyのdbインスタンスがappオブジェクトから設定内容で構成されていることを確認しようとしているが、それはdoesnの何らかの理由で接続しているようです。私はここで何か重要なものを逃しています

答えて

1

リクエストを作成するか、sqlalchemyを使用してモデルを直接作成する必要があります。私たちは仕事で似たようなことをし、前者を選びました。

Flaskでは、アプリを初期化するためのテストリクエストを作成できます。試してみてください。

from application.database import db 
from application.server import app 

with app.test_request_context(): 
    db.init_app(app) 

    db.create_all() 
+1

ありがとう。 – Copernicus

関連する問題