簡體   English   中英

在Jupyter筆記本中使用Flask-SQLAlchemy模型

[英]Use Flask-SQLAlchemy models in Jupyter notebook

有什么辦法可以將我的Flask-SQLAlchemy模型導入到Jupyter筆記本中嗎? 我希望能夠在筆記本中探索我的模型和數據。

我沒有嘗試過,但我相信可以通過一些工作來完成。


TL;博士

導入app, db和要使用的模型。 在執行查詢之前推送應用程序上下文。 如果你理解了這一切,你就完成了。


更詳細

在設置Flask應用程序的代碼中,您有一個Flask-SQLAlchemy對象,通常定義如下:

from flask_sqlalchemy import FlaskSQLAlchemy
db = FlaskSQLAlchemy()

在其他地方你有你的模型:

from db_setup import db
class MyThing(db.Model):
    thing_id = db.Column(db.Integer())

在某個地方你有應用程序:

from flask import Flask
from db_setup import db
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = '...'
db.init_app(app)

現在,在您的iPython筆記本中,您必須能夠導入上面的最后兩個部分:

from app_setup import app
from models import MyThing

要運行查詢,您必須在應用程序上下文中(請參閱http://flask.pocoo.org/docs/1.0/api/#flask.Flask.app_context ):

with app.app_context():
    things = MyThing.query.filter(MyThing.thing_id < 100).all()

您應該能夠在那里運行任何查詢。 如果我沒記錯的話,即使在with塊之外, things的對象仍然有效,你可以檢索它們的屬性等。

如果要顯式提交,可以從定義的位置導入db ,然后執行

db.session.commit()

就像使用模型類名進行查詢一樣, db只能在上下文中工作。


技術性

除非你完成了上述工作,否則不要擔心這一部分,但你想調整你的工作方式。

首先,您可能不想使用以與在Flask代碼中創建它的方式完全相同的方式創建的應用程序。 例如,您可能希望使用其他配置。 您可以在筆記本中創建一個新的Flask應用程序,而不是導入定義app的模塊。 您仍然需要導入db (執行db.init_app(app) )和MyThing 但是這些模塊可能沒有任何配置代碼,因為配置都是在應用程序級別完成的。

其次,代替使用with ,你也可以明確地做

my_context = app.app_context()
my_context.push()

然后你的SQLAlchemy代碼,然后再

my_context.pop()

這有兩個好處。 在將其用於多個筆記本單元格之前,您可以將上下文推送一次。 with塊僅適用於一個單元格。

此外,在創建變量后將上下文存儲在變量中意味着您可以重用相同的上下文。 出於SQLAlchemy的目的,上下文有點像事務。 如果在一個上下文中對對象進行更改,則它們將不會應用於其他上下文,除非您已提交到數據庫。 如果將FlaskSQLAlchemy對象存儲在Python變量中,則無法在不同的上下文中對其執行任何操作。

您還可以存儲上下文中的變量,然后在多用它with塊。

my_context = app.app_context()
with my_context.push():
    thing1 = MyThing.query().order_by(MyThing.thing_id).first()

# (Maybe in another cell)
with my_context.push()
    print thing1.thing_id

最后一個考慮因素是,使用vanilla SQLAlchemy而不是FlaskSQLAlchemy定義模型可能是有意義的。 這意味着您不需要使用上下文的所有內容,只需要數據庫連接來創建會話。 這將使得在非燒瓶代碼中導入模型變得更加容易,但是權衡的是它會使得在Flask中使用它們更加困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM