2014-10-22 8 views
5

Attualmente sto provando a mettere insieme una piccola applicazione Flask. Questa è la mia strutturaFlask e SQLAlchemy, applicazione non registrata su istanza

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

database.py contiene solo l'oggetto SQLAlchemy:

db = SQLAlchemy() 

Ho poi importare questo nel mio models.py per creare i miei modelli. Infine, all'interno __init__.py importare db da database.py e fare:

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

Tuttavia, non riesco a creare le tabelle dai modelli appare. Se rimuovo db.create_all(). L'applicazione verrà eseguita senza problemi, ma ovviamente il database non viene creato. Quando è presente db.create_all(), viene visualizzato "RuntimeError: applicazione non registrata su istanza db e nessuna applicazione associata al contesto corrente".

Sono sinceramente confuso, come prima avevo problemi nell'avviare l'applicazione senza creare il database, ma spostare db nel proprio file sembra aver risolto in qualche modo quel problema. Ora, l'unico problema rimane in realtà è la creazione del database.

Qualcuno può dirmi quale potrebbe essere il problema? Sono sinceramente perplesso.

risposta

8

La risposta è qui: http://flask-sqlalchemy.pocoo.org/latest/api/#configuration

vedere la parte su:

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.

C'è di più informazioni qui: http://flask-sqlalchemy.pocoo.org/latest/contexts/

Se tutto ciò che è fonte di confusione (probabilmente lo è, dal momento che sta parlando una funzione abbastanza avanzata di Flask), la versione breve corta è db.init_app(app) cambia l'oggetto app, ma non cambia nulla nell'oggetto db. È apposta perché potrebbero esserci più di uno app che volano in giro, e db potrebbe dover parlare con tutti loro. (Ho detto che era una funzionalità avanzata.)

Così quando si chiama db.create_all() senza avere una richiesta in tempo reale (che crea un globale che ha il app attualmente in esecuzione, non sa a cosa connettersi e bombe. Questo è ciò che significa l'errore.

Nel tuo caso, vorrei mettere la chiamata SQLAlchemy indietro nel __init__.py e passare app ad esso, che è il modo più semplice:

db = SQLAlchemy(app) 

O mantenere le cose come sono, ed eseguire il programma di installazione prima della prima richiesta :

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

Spero che questo aiuti! Fammi sapere se incontri altri problemi.

+0

Ah, capisco. Comunque, quello che ho finito è stato importare 'app' sui miei modelli e creare l'oggetto' db' lì. Questo sembrava alleviare tutti i miei problemi. – Battleroid

+0

Fantastico, funziona anche. Sono contento che tu sia stato in grado di aggiustarlo! –

+4

potresti anche fare questo 'db.create_all (app = app)' e impostare l'argomento 'app' sulla tua app attuale – danidee

Problemi correlati