當然已經有一個燒瓶e xtension Flask-SQLAlchemy - 也在Flask文檔SQLAlchemy in Flask中提到。但是像大多數Flask擴展一樣,它所做的只是將一些「管道」Flask和SQLAlchemy(或任何其他庫)集中在一起。最好的文檔往往是時代的源代碼:)
github.com/mitsuhiko/flask-sqlalchemy/blob/master/flask_sqlalchemy/__init__.py
然而,在燒瓶SQLAlchemy中的情況下,大量的代碼,並與有關瓶的背景和修改跟蹤和交織範圍的會議一些黑魔法持續時間調試以及一些在網絡應用和所有可能的角落案例和其他一些事情中有用的東西。我會說這有點過分。我是而不是,表示你不應該使用它 - 只是從擴展代碼首先看SQLAlchemy和Flask之間的連接是不可見的,所以它可能需要更多的閱讀時間。
但是,如果你想自己做這很容易(當然,如容易爲SQLAlchemy中可以得到) - 只需初始化SQLAlchemy的,所以你得到一個sessionmaker
,然後創建每個請求之前的會話,然後穿上」不要忘記在請求後關閉它),並在你的Flask處理程序中使用這個會話(我的意思是@app.route
函數)。
import flask
import sqlalchemy
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Item (Base):
__tablename__ = 'items'
id = Column(Integer, primary_key=True)
title = Column(String)
engine = sqlalchemy.create_engine('sqlite:///bestappever.db', echo=True)
Session = sessionmaker(bind=engine)
# create all tables if you wish...
Base.metadata.create_all(engine)
app = flask.Flask(__name__)
@app.before_request
def create_session():
flask.g.session = Session()
@app.teardown_appcontext
def shutdown_session(response_or_exc):
flask.g.session.commit()
flask.g.session.remove()
@app.route('/')
# just use the SQLAlchemy session :)
items = flask.g.session.query(Item).all()
return flask.render_template('index.html', items=items)
見我的例子瓶+ SQLAlchemy的應用:https://github.com/messa/db-workshop-web-app/blob/sqlalchemy/anketa.py
正如你看到的,你甚至可以有一個大文件的一切,但它分裂成多個文件(其中一個通常命名爲像model.py
) 是最佳做法。
最重要的是有個別請求之間的隔離會話 - 在我的解決方案中,爲before_request
鉤子中的每個請求創建會話。 Flask docs "SQLAlchemy in Flask"的解決方案使用scoped_session
,它具有基本相同的效果(使用線程局部變量,每個線程有一個單獨的會話實現)。
廣告應用程序架構:對於更大的應用程序,最好使用Larger Applications patterns和blueprints。所以我所有的燒瓶路由處理程序都將在藍圖中,然後我將有一個「主」功能get_app()
1)創建Flask對象2)用它註冊藍圖3)創建SQLAlchemy引擎並使用Flask app.before_request
掛接Session()
。大致類似於this或this。
,你應該永遠只能有一個引擎
爲什麼?從技術上講,引擎只是連接(池)到數據庫。如果你的應用使用三個獨立的數據庫會怎樣那麼當然你需要三個引擎。
但是,當然會話連接到一個引擎。所以你需要多個會話。並且爲您的示範課程提供多個聲明性基礎,並且 - 最重要的是 - 不會意外地混淆它。這就是爲什麼建議只有一個引擎 - 如果可能的話。
您可以爲每個請求創建引擎 - 它在技術上是正確的,但效率不高。爲整個應用程序保留一個引擎,並只爲每個請求創建會話。
http://flask-sqlalchemy.pocoo.org/ – davidism