私はフラスコと sqlalchemy の両方に慣れていません。フラスコ アプリの開発を始めたばかりで、今のところ sqlalchemy を使用しています。私は、flask-sqlalchemy と sqlalchemy を使用することで得られる大きな利点があるかどうか疑問に思っていました。http://packages.python.org/Flask-SQLAlchemy/index.htmlで十分な動機を見つけることができなかったか、価値を理解していなかったのかもしれません!! ご説明いただければ幸いです。
6 に答える
の主な機能は、Flask-SQLAlchemy
Flask アプリケーションとの適切な統合です。エンジン、接続、およびセッションを作成および構成し、Flask アプリと連携するように構成します。
スコープ付きセッションを作成し、Flask アプリケーションの要求/応答ライフサイクルに従って適切に処理する必要があるため、このセットアップは非常に複雑です。
の唯一の機能である理想的な世界ではFlask-SQLAlchemy
、実際には、さらにいくつかの機能が追加されます。詳細については、ドキュメントをご覧ください。または、それらの概要を説明したこのブログ投稿を参照してください: Demystifying Flask-SQLAlchemy (更新: 元の記事は現在利用できません。webarchive にスナップショットがあります)。
Flask と SQLAlchemy を初めて使用したとき、このオーバーヘッドが気に入らなかったのです。拡張機能からセッション管理コードを抽出しました。このアプローチは機能しますが、この統合を適切に行うのは非常に難しいことがわかりました。
したがって、より簡単なアプローチ (私が取り組んでいる別のプロジェクトで使用されています) は、単にドロップFlask-SQLAlchemy
インし、それが提供する追加機能を使用しないことです。があり、純粋なセットアップdb.session
であるかのように使用できます。SQLAlchemy
Flask-SQLAlchemy は、他の場合は SQLAlchemy を使用して自分で実装することになるいくつかの優れた追加機能を提供します。
Flask-SQLAlchemy を使用する利点
- Flask_SQLAlchemy は、セッションの構成、セットアップ、破棄を処理します。
- クエリとページネーションを容易にする宣言型の基本モデルを提供します
- バックエンド固有の設定。Flask-SQLAlchemy はインストールされたライブラリをスキャンして Unicode サポートを確認し、失敗した場合は自動的に SQLAlchemy Unicode を使用します。
apply_driver_hacks
正常なデフォルトを MySQL のプールサイズなどに自動的に設定するメソッドが呼び出される- すべてのテーブルを作成および削除するための create_all() および drop_all() メソッドが組み込まれています。何かばかげたことをした場合に、テストや python コマンド ラインで役立ちます。
- get() の代わりに get_or_404() を、find() の代わりに find_or_404() コード例を > http://flask-sqlalchemy.pocoo.org/2.1/queries/で提供します。
テーブル名を自動設定します。Flask-SQLAlchemy は自動的にテーブル名を変換して設定しますClassName
>これはクラス リスト項目class_name
を設定することでオーバーライドできます__tablename__
Flask-SQLAlchemy を使用することのマイナス面
- Flask-SQLAlchemy を使用すると、必要に応じて Flask から Pyramid への移行がさらに困難になります。これは主に、Flask_SQLAchemy のカスタム宣言ベース モデルによるものです。
- Flask-SQLAlchemy を使用すると、SQLAlchemy 自体よりもはるかに小さなコミュニティを持つパッケージを使用するリスクが生じます。これは、アクティブな開発からすぐに削除することはできません。
- Flask-SQLAlchemy が持っているいくつかの優れた追加機能は、それらがそこにあることを知らないと混乱する可能性があります。
正直、メリットは感じません。私見、Flask-SQLAlchemy は、実際には必要のない追加のレイヤーを作成します。私たちの場合、ORM と Core の両方を使用する複数のデータベース/接続 (マスター/スレーブ) を持つかなり複雑な Flask アプリケーションがあり、とりわけ、セッション/DB トランザクションを制御する必要があります (ドライランとコミット モードなど)。Flask-SQLAlchemy は、セッションの自動破棄などのいくつかの追加機能を追加します。これは、非常に多くの場合、必要なものではないことを前提としています。
SQLAlchemy のドキュメントには、Flask-SQLAlchemy を使用する必要があることが明確に記載されています (特に、その利点を理解していない場合は!)。
[...] Flask-SQLAlchemy などの製品 [...] SQLAlchemy は、これらの製品を利用できる限り使用することを強くお勧めします。
この引用と詳細な動機は、セッション FAQの 2 番目の質問にあります。
これは、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
フラスコ sqlalchemy を使用している場合は、組み込みの SQLAlchemyAdapter を使用できます。sqlalchemy (not-flask-sqlalchemy) を使用している場合、オブジェクトがデータベースに保存される方法 (テーブルの名前など) について異なる想定を行う可能性があるため、独自のアダプター クラスを作成する必要があります。