2014-10-22 15 views
5

Ich versuche gerade, eine kleine Flask-Anwendung zusammenzusetzen. Das ist meine Struktur.Flask und SQLAlchemy, Anwendung nicht auf Instanz

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

database.py enthält nur die SQLAlchemy Objekt:

db = SQLAlchemy() 

ich diese dann in mein models.py importieren, um meine Modelle zu erstellen. Schließlich innerhalb __init__.py importiere ich db von database.py und zu tun:

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() 

Allerdings kann ich die Tabellen aus den Modellen nicht schaffen es erscheint. Wenn ich db.create_all() entferne. Die Anwendung wird ohne Probleme ausgeführt, aber offensichtlich wird die Datenbank nicht erstellt. Wenn db.create_all() vorhanden ist, bekomme ich 'RuntimeError: Anwendung nicht registriert auf der DB-Instanz und keine Anwendung an den aktuellen Kontext gebunden'.

Ich bin ehrlich verwirrt, wie zuvor hatte ich Probleme, nur die Anwendung zu starten, ohne die Datenbank zu erstellen, aber db in die eigene Datei zu verschieben scheint das Problem irgendwie zu korrigieren. Jetzt bleibt nur noch das Problem, die Datenbank zu erstellen.

Kann mir jemand sagen, was das Problem sein könnte? Ich bin echt ratlos.

Antwort

8

Die Antwort ist hier: http://flask-sqlalchemy.pocoo.org/latest/api/#configuration

den Teil Siehe etwa:

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.

Es stehen weitere Informationen hier: http://flask-sqlalchemy.pocoo.org/latest/contexts/

Wenn alles, was verwirrend ist (es wahrscheinlich ist, da er spricht (eine ziemlich fortgeschrittene Eigenschaft von Flask), ist die kurze kurze Version db.init_app(app) ändert das app Objekt, aber es ändert nichts in der db Objekt. Es ist absichtlich, weil es mehr als eine app herumfliegen kann, und db möglicherweise mit allen von ihnen sprechen müssen. (Ich sagte, es war eine erweiterte Funktion.)

Also, wenn Sie db.create_all() aufrufen, ohne eine Anfrage live (was erstellt eine globale, die die gerade laufenden app hat), weiß es nicht, was zu verbinden, und Bomben. Das ist was der Fehler bedeutet.

In Ihrem Fall ich den SQLAlchemy Rückruf in __init__.py und app es passieren setzen würde, das ist der einfachste Weg:

db = SQLAlchemy(app) 

Oder die Dinge, wie sie sind, und das Setup vor der ersten Anforderung laufen :

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

Ich hoffe, dass hilft! Lassen Sie mich wissen, wenn Sie weitere Probleme haben.

+0

Ah, ich verstehe. Am Ende habe ich jedoch "app" in meine Modelle importiert und dort das "db" -Objekt erstellt. Das schien all meine Probleme zu lindern. – Battleroid

+0

Cool, das funktioniert auch. Freut mich, dass du es reparieren konntest! –

+4

können Sie auch 'db.create_all (app = app)' machen und das 'app' Argument auf Ihre aktuelle App setzen – danidee

Verwandte Themen