在烧瓶外使用SQLAlchemy错误

时间:2018-03-11 14:01:06

标签: python-3.x flask flask-sqlalchemy

我尝试创建一个系统,其模型可以在烧瓶的应用程序上下文和外部作业中使用。 我创建了一个带有以下内容的database.py:

from sqlalchemy import MetaData, Column, Integer, String, Float, DateTime
from sqlalchemy.ext.declarative import declarative_base

metadata = MetaData()
Base = declarative_base(metadata=metadata)


class Stock(Base):
    __tablename__ = 'Stock'
    id = Column(Integer, primary_key=True)
    ticker = Column(String(10), nullable=False)
    time_stamp = Column(DateTime, nullable=False)
    open = Column(Float, nullable=False)
    high = Column(Float, nullable=False)
    low = Column(Float, nullable=False)
    close = Column(Float, nullable=False)
    volume = Column(Integer, nullable=False)
    price = Column(Float, nullable=True)

我还创建了一个flask_db.py文件:

from flask_sqlalchemy import SQLAlchemy

from database import metadata

db = SQLAlchemy(metadata=metadata) 

然后在我的app.py

中使用它
from flask import Flask, render_template
from flask_db import db
import os

# create the flask app
app = Flask(__name__, template_folder="dist/", static_folder="dist/", static_url_path="")

# config
app.config.from_object(os.environ['APP_SETTINGS'])

# initialise db
db.init_app(app)


@app.route("/")
def index():
    """
    renders basic index page
    :return: template
    """
    return render_template("index.html")


# app entry point
if __name__ == "__main__":
    app.run()

当我运行名为create_db.py的文件时:

from flask_db import db
db.create_all()

我收到以下错误:

RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.

我不确定为什么没有找到应用程序。

1 个答案:

答案 0 :(得分:1)

只有在调用init_app时才会初始化db扩展,并且只有在运行应用程序时才会创建应用程序上下文。但是因为你要从flask_db模块导入,所以这些都不会发生 - 应用程序模块中的代码永远不会被Python解释器运行。

你可能需要做的是这样的事情:

```python
from app import app, db

app_ctx = app.app_context()
ctx.push()
db.create_all()
ctx.pop()
```

我认为这应该有效。但我强烈建议您考虑使用application factory pattern创建您的应用,并使用click commands(使用with_appcontext装饰器)添加到Flask的cli界面,而不是使用一次性脚本。此外,使用Flask-Migrate进行正确的数据库迁移可能值得。

编辑:在您的应用模块中,您可能还需要告诉Flask-SQLAlchemy您的自定义基本模型:

```
db = SQLAlchemy(metadata=metadata, model_class=Base)
```