をすでにありますフラスコxtension Flask-SQLAlchemy - FlaskドキュメントSQLAlchemy in Flaskにも記載されています。しかし、ほとんどのFlaskエクステンションのように、FlaskとSQLAlchemy(または他のライブラリ)を一緒に「配管」するだけです。最良のドキュメントは、しばしば、ソースコードです:)
github.com/mitsuhiko/flask-sqlalchemy/blob/master/flask_sqlalchemy/__init__.py
しかし、フラスコSQLAlchemyの場合には、それは多くのコードであり、また、フラスココンテキストと変更の追跡と絡み合っスコープのセッションについていくつかの黒魔術とWebアプリケーションや、すべての可能なコーナーケースやその他いくつかの点で便利なものがいくつかあります。私はそれが少し強調されていると思います。私はではありませんあなたはそれを使用すべきではないと言っています - ちょうどSQLAlchemyとFlaskの間の接続は、より多くの読書時間がかかるかもしれないので、拡張コードから最初の目に見えません。
しかし、あなたはそれを自分で行いたい場合には(まあ、SQLAlchemyのが得ることができるよう簡単など)は非常に簡単です - ちょうど「あなたがsessionmaker
を得るように、SQLAlchemyのを初期化し、各要求の前にセッションを作成し、その後、ドン要求の後にそれを閉じることを忘れてください:)そして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のアプリを参照してください:あなたはあなたも一つの大きなファイル上のすべてのものを持っていますが(通常はmodel.py
のように命名された1)複数のファイルにそれを分割することができます見ての通りhttps://github.com/messa/db-workshop-web-app/blob/sqlalchemy/anketa.py
を されますベストプラクティス
最も重要なことは、個々の要求の間孤立セッション持つことである - 私の溶液中のセッションがbefore_request
フックで要求ごとに作成されます。 Flask docs "SQLAlchemy in Flask"の解決策は、基本的に同じ効果を持つscoped_session
を使用します(各スレッドごとに1つの別々のセッションでスレッドローカル変数を使用して実現)。
広告アプリケーションのアーキテクチャ:より大きなアプリケーションでは、Larger Applications patternsとblueprintsを使用するとよいでしょう。私のフラスコのルートハンドラはすべて青写真になります。そして、私は1つの "main"関数を持っています。get_app()
1)Flaskオブジェクトを作成します。2)青写真を登録します。3)SQLAlchemyエンジンを作成し、フラスコでフックします。おおよそthisまたはthisに似ています。
あなたは今までつのエンジンを持っている必要があり
なぜ?技術的には、エンジンはデータベースとの接続(プール)に過ぎません。あなたのアプリが3つの別々のデータベースを使用している場合、もちろん、3つのエンジンが必要です。
もちろん、セッションはちょうど1つのエンジンに接続されています。したがって、複数のセッションが必要になります。そして、あなたのモデルクラスのための複数の宣言的な基底、そして - 最も重要なのは - それを誤って混ぜ合わせないことです。だから可能ならば、ただ1つのエンジンを持つことをお勧めします。
リクエストごとにエンジンを作成できます。これは技術的には正しいものの、非効率的です。アプリケーション全体に対して1つのエンジンを保持し、要求ごとにセッションを作成するだけです。
http://flask-sqlalchemy.pocoo.org/ – davidism