在应用程序上下文之外创建数据库

时间:2014-06-05 12:42:49

标签: python sqlite flask sqlalchemy

我有一个像这样的应用工厂

db = SQLAlchemy()

def create_app(environment):
  app = Flask(__name__)
  app.config.from_object(config[environment])

  db.init_app(app)
  # ... etc

  return app

然后,我有一个脚本,它在应用程序的上下文之外提取CSV。这个脚本是一个每x小时运行一次的cron

我想以某种方式更新sqlite数据库应用程序正在使用。这可能吗?

3 个答案:

答案 0 :(得分:11)

Flask-SQLAlchemy只需要一个应用程序上下文来运行。您可以手动创建应用程序上下文。

app = create_app(env)
ctx = app.app_context()
ctx.push()

# your code here

ctx.pop()

这是来自文档herehere

答案 1 :(得分:8)

我知道此问题已得到解答,但您也可以使用with声明:

from my_package import create_app

app = create_app(my_envrionment)

with app.app_context():
    # your code here

我认为这看起来有点清洁:)

答案 2 :(得分:3)

解决此问题的另一个优雅方法是使用@with_appcontext装饰器。

from flask.cli import with_appcontext

@click.command(name='db-init-data')
@with_appcontext
def db_init_data():
    """Init db with some data"""
    admin = User(fname='John', lname='Smith', email='jsmith@google.com')
    db.session.add(admin)
    db.session.commit()