我想在不运行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上下文之外检索数据。
答案 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'>