基本的Flask SQLAlchemy上下文问题

时间:2019-01-30 20:24:36

标签: python-3.x flask-sqlalchemy

我已经阅读了许多其他文章,其中介绍了将模型与主应用程序分开的情况,但我无法仅将它与app.py(我的实际应用程序)和models.py(我的数据库模型)一起使用。 / p>

如果执行以下操作,我将得到一个没有表的app.db文件:

from app import db
db.create_all() 

如果执行以下操作,则会收到RuntimeError:未找到应用程序。在视图函数内部工作或推送应用程序上下文。

from app import db
db.create_all() 

我也看过Introduction into Contexts页,无法确定我在def create_app()中的位置:在我看来,这些都没有用。

这是我的app.py:

from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
from models import userTable

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

@app.route('/', methods=['GET', 'POST'])
def home():
    return "home"

if __name__ == '__main__':
    app.run(debug=True)

这是我的模型。py:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

class userTable(db.Model):

    __tablename__ = "userTable"

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)

1 个答案:

答案 0 :(得分:1)

也许您可以尝试以下操作:

app.py

from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
import models
from models import initialize_db

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

initialize_db(app)

@app.route('/', methods=['GET', 'POST'])
def home():
    return "home"

if __name__ == '__main__':
    app.run(debug=True)

models.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

def initialize_db(app):
  app.app_context().push()
  db.init_app(app)
  db.create_all()

class userTable(db.Model):

    __tablename__ = "userTable"

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)

关键在于在models.py中创建一个数据库初始化函数,该函数将应用程序实例作为参数。该函数只有在具有其应用程序实例后才创建数据库表。这样一来,您就可以在没有应用程序实例的情况下最初导入模型模块,并且仍然具有模块化设计。