如何使用SQLAlchemy从Flask应用程序获取初始化数据库的句柄?

时间:2020-10-09 09:43:18

标签: flask sqlalchemy flask-sqlalchemy

我想在不运行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.py文件中。在应用文件中包含模型,我们 与应用外部的数据库进行交互的能力有限。 这使得很难在应用程序外部加载数据。另外, 这使得很难在Flask上下文之外检索数据。

2 个答案:

答案 0 :(得分:0)

好吧,一旦初始化应用程序,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

现在,您有一个正在当前应用程序上下文中运行的外壳程序,但服务器未运行:

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() 

答案 1 :(得分:0)

精彩的教程中...

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'>