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

cor*_*vid 5 python sqlite sqlalchemy flask

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

db = SQLAlchemy()

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

  db.init_app(app)
  # ... etc

  return app
Run Code Online (Sandbox Code Playgroud)

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

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

dav*_*ism 12

Flask-SQLAlchemy只需要一个应用程序上下文来操作.您可以手动创建应用程序上下文.

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

# your code here

ctx.pop()
Run Code Online (Sandbox Code Playgroud)

这是来自这里这里的文档.


Joe*_*rty 10

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

from my_package import create_app

app = create_app(my_envrionment)

with app.app_context():
    # your code here
Run Code Online (Sandbox Code Playgroud)

我觉得这看起来有点干净:)


oli*_*ree 5

解决此问题的另一种优雅方法是使用 @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()
Run Code Online (Sandbox Code Playgroud)