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

9 投票
3 回答
6140 浏览
提问于 2025-04-18 08:43

我有一个应用程序工厂,像这样:

db = SQLAlchemy()

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

  db.init_app(app)
  # ... etc

  return app

然后,我有一个脚本,它会在应用程序之外获取CSV文件。这个脚本是一个定时任务,每隔一段时间就会运行一次。

我想更新应用程序正在使用的sqlite数据库。不知道这样做行不行?

3 个回答

6

另一种优雅的解决方法是使用 @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()
15

我知道这个问题已经有人回答过了,但你也可以使用 with 语句:

from my_package import create_app

app = create_app(my_envrionment)

with app.app_context():
    # your code here

我觉得这样看起来更简洁一些 :)

20

Flask-SQLAlchemy 只需要一个应用上下文就能正常工作。你可以手动创建一个应用上下文。

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

# your code here

ctx.pop()

这个内容来自文档,详细信息可以在 这里这里 找到。

撰写回答