【问题标题】:How to get a handle to the initialized database from a Flask application with SQLAlchemy?如何使用 SQLAlchemy 从 Flask 应用程序获取初始化数据库的句柄?
【发布时间】:2021-01-24 09:18:02
【问题描述】:

我想在没有运行 Flask 应用程序的情况下使用 Flask-SQLAlchemy 将数据添加到数据库。

在应用程序和数据库初始化后,有没有办法从应用程序中获取db

我的代码看起来像

db = SQLAlchemy()

def init_app():

    app = Flask(__name__)

    db = SQLAlchemy(app)
    db.init_app(app)

    return app

而我想做的就是

from app import init_app
app = init_app() # initialized but not running

# db is used in model.py, but not initialized
# with Flask
# from db = SQLAlchemy()
from model import Machine # class Machine(db.Model)

p = Machine(name='something')

# now I need the initialized db from somewhere
db.session.add(p)
db.session.commit()   

基本上我想做here所描述的事情:

另一个缺点是 Flask-SQLAlchemy 使用数据库 在 Flask 上下文之外很难。这是因为,与 FLask-SQLAlchemy,数据库连接、模型、app都是 位于 app.py 文件中。在应用程序文件中有模型,我们 与应用程序外部的数据库交互的能力有限。 这使得在您的应用程序之外加载数据变得困难。此外, 这使得在 Flask 上下文之外检索数据变得困难。

【问题讨论】:

  • 可能的解决方案之一:Using SQLAlchemy models in and out of Flask
  • 是的,可以。但我不想放弃 Flask-SQLAlchemy 带来的舒适感。使用该解决方案基本上是多余的,您可以完全跳过 Flask-SQLAlchemy。

标签: flask sqlalchemy flask-sqlalchemy


【解决方案1】:

好吧,一旦你初始化了应用程序,Flask 就会建立一个服务器(开发或生产,无论你设置哪个),所以如果你想在没有运行 Flask 应用程序的情况下使用 Flask-SQLAlchemy 将数据添加到数据库中,你最好使用在当前应用程序的上下文中运行的flask shell 命令,然后您可以添加数据。

但首先,您最好将您的应用设置为以下内容,以便我们可以直接导入 db、auth 等内容:

...
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def init_app():

    app = Flask(__name__)
    db.init_app(app)

    return app

在项目的根目录中,在终端中输入以下命令

flask shell

现在您在当前应用的上下文中运行了一个 shell,但服务器没有运行:

from app import db

from model import Machine # class Machine(db.Model)

p = Machine(name='something')

# now I need the initialized db from somewhere
db.session.add(p)
db.session.commit() 

【讨论】:

    【解决方案2】:

    来自精彩的教程...

    https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database

    定义这样的东西...

    from app import app, db
    from app.models import User, Post
    
    @app.shell_context_processor
    def make_shell_context():
        return {'db': db, 'User': User, 'Post': Post}
    

    然后……

    (venv) $ flask shell
    >>> db
    <SQLAlchemy engine=sqlite:////Users/migu7781/Documents/dev/flask/microblog2/app.db>
    >>> User
    <class 'app.models.User'>
    >>> Post
    <class 'app.models.Post'>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 2016-10-20
      • 2021-07-09
      • 2020-09-25
      • 1970-01-01
      • 2023-01-27
      • 2020-08-20
      相关资源
      最近更新 更多