2014-10-22 3 views
5

현재 작은 플라스크 응용 프로그램을 함께 조각하려고합니다. 이것은 나의 구조이다.플라스크 및 SQLAlchemy, 응용 프로그램이 인스턴스에 등록되지 않았습니다.

db = SQLAlchemy() 

그때 내 모델을 만들 내 models.py이 점을 가져옵니다

run.py 
application 
    __init__.py 
    database.py 
    models.py 
    views.py 

database.py 그냥 SQLAlchemy의 객체가 포함되어 있습니다. 마지막으로, __init__.py 내부에서 나는 database.py에서 db을 가져 수행

from .database import db 
from flask import Flask 
app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///application.db' 
db.init_app(app) 
db.create_all() 

그러나, 나는이 나타나는 모델에서 테이블을 만들 수 없습니다. db.create_all()을 삭제하면 응용 프로그램은 문제없이 실행되지만 분명히 데이터베이스는 생성되지 않습니다. db.create_all()이 존재하면 'RuntimeError : db 인스턴스에 등록되지 않은 응용 프로그램이고 현재 컨텍스트에 바인딩 된 응용 프로그램이 없습니다'라는 메시지가 나타납니다.

전 데이터베이스를 만들지 않고 응용 프로그램을 시작하기 전에 문제가 발생하는 것처럼 솔직히 혼란 스럽지만 db을 자신의 파일로 이동하면 어떻게 든 문제가 해결 된 것 같습니다. 자, 유일한 문제는 실제로 데이터베이스를 만드는 것입니다.

누구에게 어떤 문제가 있다고 말할 수 있습니까? 나는 정말로 엉망이다.

답변

8

답은 여기에 있습니다 :

The difference between the two is that in the first case methods like create_all() and drop_all() will work all the time but in the second case a flask.Flask.request_context() has to exist.

자세한 내용은 여기있다 : http://flask-sqlalchemy.pocoo.org/latest/api/#configuration

에 대해 부분을 참조하십시오 http://flask-sqlalchemy.pocoo.org/latest/contexts/

혼란 모든 경우는 (아마, 그것은에 대해서 이야기하기 때문에 Flask의 상당히 고급 기능) 짧은 짧은 버전은 db.init_app(app)app 개체를 변경하지만 db 개체는 변경되지 않습니다. 두 개 이상의 app이 주위를 돌아 다니고 있기 때문에 목적이 있습니다. db은 모두 그들과 대화해야 할 수도 있습니다. (내가 고급 기능이라고 했어.) db.create_all() (현재 실행중인 app을 가진 글로벌을 생성 함) 요청을하지 않고 db.create_all()을 호출하면 연결할 대상과 폭탄을 알 수 없습니다. 그것은 오류의 의미입니다.

db = SQLAlchemy(app) 

또는 그들이 사물을있는 그대로 유지하고, 첫 번째 요청하기 전에 설치 프로그램을 실행 : 귀하의 경우에는

, 나는 __init__.py에 다시 SQLAlchemy의 호출을 넣어 그것에 app을 통과 할 것, 그게 가장 쉬운 방법 :

@app.before_first_request 
def create_database(): 
    db.create_all() 

나는 도움이 되길 바랍니다. 더 이상 문제가 생기면 알려주세요.

+0

아, 알겠습니다. 그러나, 내가 끝낸 것은'app'을 내 모델로 가져 와서 거기에'db' 오브젝트를 생성하는 것이 었습니다. 그것은 내 모든 문제를 완화시키는 것 같았다. – Battleroid

+0

멋지다. 다행히 고칠 수있었습니다! –

+4

당신은 또한이'db.create_all (app = app)'를하고 현재 app에'app' 인수를 설정할 수 있습니다. – danidee

관련 문제