私はflaskとsqlalchemyの両方で新しいです。ただflaskアプリで作業を開始し、今のところsqlalchemyを使用しています。フラスコ-sqlalchemy対sqlalchemyを使用することで得られる大きなメリット http://packages.python.org/Flask-SQLAlchemy/index.html で十分な動機を見つけることができなかった値を理解してください!!私はあなたの説明に感謝します。
Flask-SQLAlchemy
の主な機能は、Flaskアプリケーションとの適切な統合です。エンジン、接続、およびセッションを作成および構成し、Flaskアプリと連携するように構成します。
スコープセッション を作成し、Flaskアプリケーションのリクエスト/レスポンスライフに従って適切に処理する必要があるため、このセットアップは非常に複雑です。 -サイクル。
理想的な世界では、これがFlask-SQLAlchemy
の唯一の機能になりますが、実際にはそれ以上のものが追加されます。以下に、それらの概要を記載した優れたブログ投稿を示します: Demystifying Flask-SQLAlchemy .
FlaskとSQLAlchemyを初めて使用したとき、このオーバーヘッドが気に入らなかった。調べて、拡張機能からセッション管理コードを抽出しました。このアプローチは機能しますが、この統合を適切に行うことは非常に難しいことがわかりました。
したがって、(私が取り組んでいる別のプロジェクトで使用されている)より簡単なアプローチは、Flask-SQLAlchemy
をドロップするだけで、それが提供する追加機能を使用しないことです。 db.session
が得られ、純粋なSQLAlchemy
セットアップであるかのように使用できます。
正直に言うと、何の利点もありません。私見、Flask-SQLAlchemyは、本当に必要ない追加のレイヤーを作成します。私たちの場合、ORMとCoreの両方を使用する複数のデータベース/接続(マスタースレーブ)を備えたかなり複雑なFlaskアプリケーションがあり、セッション/ DBトランザクションを制御する必要があります(例:ドライランとコミットモード)Flask-SQLAlchemyは、必要なものではないものを想定してセッションを自動的に破棄するなど、いくつかの追加機能を追加します。
SQLAlchemyのドキュメントには、Flask-SQLAlchemyを使用する必要があることが明確に記載されています(特にその利点を理解していない場合!)。
[...] Flask-SQLAlchemyなどの製品[...] SQLAlchemyは、これらの製品を使用可能な状態で使用することを強くお勧めします。
セッションFAQ の2番目の質問でこの引用と詳細な動機を見つけることができます。
Flask-SQLAlchemyは、SQLAlchemyを使用して自分で実装することになる他の素晴らしい追加機能を提供します。
apply_driver_hacks
と呼ばれるメソッドを使用して、SaneデフォルトをMySQL pool-sizeのようなthigsに自動的に設定しますテーブル名を自動的に設定します。 Flask-SQLAlchemyはClassName
> class_name
を変換してテーブル名を自動的に設定します。これは__tablename__
クラスリスト項目を設定することでオーバーライドできます
@schlamarが示唆するように、Flask-SqlAlchemyはデフォは良いことです。そこに追加されたポイントに追加のコンテキストを追加したいと思います。
どちらかを選択しているように感じないでください。たとえば、Flask-Sqlalchemyを使用したモデルを使用して、テーブルからすべてのレコードを取得したいとしましょう。シンプルな
Model.query.all()
多くの場合、Flask-Sqlalchemyはまったく問題ありません。私が作りたい余分なポイントは、Flask-Sqlalchemyがあなたが望むことをしないなら、SqlAlchemyを直接使用できない理由がないということです。
from myapp.database import db
num_foo = db.session.query(func.count(OtherModel.id)).filter(is_deleted=False).as_scalar()
db.session.query(Model.id, num_foo.label('num_foo')).order_by('num_foo').all()
ご覧のとおり、問題なく簡単にジャンプできます。2番目の例では、実際にはFlask-Sqlalchemy定義のモデルを使用しています。
これは、flask-sqlalchemyが単純なsqlalchemyよりも優れている利点の例です。
Flask_userを使用しているとします。
flask_userはユーザーオブジェクトの作成と認証を自動化するため、データベースにアクセスする必要があります。クラスUserManagerは、データベース呼び出しを抽象化する「アダプター」と呼ばれるものを呼び出すことでこれを行います。 UserManagerコンストラクターでアダプターを提供します。アダプターはこれらの機能を実装する必要があります。
class MyAdapter(DBAdapter):
def get_object(self, ObjectClass, id):
""" Retrieve one object specified by the primary key 'pk' """
pass
def find_all_objects(self, ObjectClass, **kwargs):
""" Retrieve all objects matching the case sensitive filters in 'kwargs'. """
pass
def find_first_object(self, ObjectClass, **kwargs):
""" Retrieve the first object matching the case sensitive filters in 'kwargs'. """
pass
def ifind_first_object(self, ObjectClass, **kwargs):
""" Retrieve the first object matching the case insensitive filters in 'kwargs'. """
pass
def add_object(self, ObjectClass, **kwargs):
""" Add an object of class 'ObjectClass' with fields and values specified in '**kwargs'. """
pass
def update_object(self, object, **kwargs):
""" Update object 'object' with the fields and values specified in '**kwargs'. """
pass
def delete_object(self, object):
""" Delete object 'object'. """
pass
def commit(self):
pass
Flask-sqlalchemyを使用している場合、組み込みのSQLAlchemyAdapterを使用できます。 sqlalchemy(not-flask-sqlalchemy)を使用している場合は、オブジェクトをデータベースに保存する方法(テーブルの名前など)について異なる仮定を立てることができるため、独自のアダプタークラスを作成する必要があります。