当然已经有一个烧瓶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