web-dev-qa-db-ja.com

flask-sqlalchemyまたはsqlalchemy

私はflaskとsqlalchemyの両方で新しいです。ただflaskアプリで作業を開始し、今のところsqlalchemyを使用しています。フラスコ-sqlalchemy対sqlalchemyを使用することで得られる大きなメリット http://packages.python.org/Flask-SQLAlchemy/index.html で十分な動機を見つけることができなかった値を理解してください!!私はあなたの説明に感謝します。

78
Amin

Flask-SQLAlchemyの主な機能は、Flaskアプリケーションとの適切な統合です。エンジン、接続、およびセッションを作成および構成し、Flaskアプリと連携するように構成します。

スコープセッション を作成し、Flaskアプリケーションのリクエスト/レスポンスライフに従って適切に処理する必要があるため、このセットアップは非常に複雑です。 -サイクル。

理想的な世界では、これがFlask-SQLAlchemyの唯一の機能になりますが、実際にはそれ以上のものが追加されます。以下に、それらの概要を記載した優れたブログ投稿を示します: Demystifying Flask-SQLAlchemy .

FlaskとSQLAlchemyを初めて使用したとき、このオーバーヘッドが気に入らなかった。調べて、拡張機能からセッション管理コードを抽出しました。このアプローチは機能しますが、この統合を適切に行うことは非常に難しいことがわかりました。

したがって、(私が取り組んでいる別のプロジェクトで使用されている)より簡単なアプローチは、Flask-SQLAlchemyをドロップするだけで、それが提供する追加機能を使用しないことです。 db.sessionが得られ、純粋なSQLAlchemyセットアップであるかのように使用できます。

52
Boris Serebrov

正直に言うと、何の利点もありません。私見、Flask-SQLAlchemyは、本当に必要ない追加のレイヤーを作成します。私たちの場合、ORMとCoreの両方を使用する複数のデータベース/接続(マスタースレーブ)を備えたかなり複雑なFlaskアプリケーションがあり、セッション/ DBトランザクションを制御する必要があります(例:ドライランとコミットモード)Flask-SQLAlchemyは、必要なものではないものを想定してセッションを自動的に破棄するなど、いくつかの追加機能を追加します。

17
MOCKBA

SQLAlchemyのドキュメントには、Flask-SQLAlchemyを使用する必要があることが明確に記載されています(特にその利点を理解していない場合!)。

[...] Flask-SQLAlchemyなどの製品[...] SQLAlchemyは、これらの製品を使用可能な状態で使用することを強くお勧めします。

セッションFAQ の2番目の質問でこの引用と詳細な動機を見つけることができます。

16
schlamar

Flask-SQLAlchemyは、SQLAlchemyを使用して自分で実装することになる他の素晴らしい追加機能を提供します。

Flask-SQLAlchemyの使用に関するプラス面


  1. Flask_SQLAlchemyは、セッションの構成、セットアップ、および分解を処理します。
  2. クエリとページネーションを簡単にする宣言的なベースモデルを提供します
  3. バックエンド固有の設定。Flask-SQLAlchemyはインストールされたライブラリをスキャンしてUnicodeサポートを行い、失敗した場合は自動的にSQLAlchemy Unicodeを使用します。
  4. apply_driver_hacksと呼ばれるメソッドを使用して、SaneデフォルトをMySQL pool-sizeのようなthigsに自動的に設定します
  5. すべてのテーブルを作成および削除するためのメソッドcreate_all()およびdrop_all()にNiceビルドがあります。テストに便利で、何かおかしいことをした場合はpythonコマンドラインで
  6. Get()の代わりにget_or_404()およびfind()の代わりにfind_or_404()を提供します> http://flask-sqlalchemy.pocoo.org/2.1/queries/ のコード例

テーブル名を自動的に設定します。 Flask-SQLAlchemyはClassName> class_nameを変換してテーブル名を自動的に設定します。これは__tablename__クラスリスト項目を設定することでオーバーライドできます

Flask-SQLAlchemyの使用に関するマイナス面


  1. Flask-SQLAlchemyを使用すると、Flaskからの移行がさらに困難になります。必要に応じてPyramidを使用します。これは主にFlask_SQLAchemyのカスタム宣言ベースモデルによるものです。
  2. Flask-SQLAlchemyを使用すると、SQLAlchemy自体よりもはるかに小さなコミュニティでパッケージを使用するリスクがあります。これは、すぐにアクティブな開発から簡単に削除できません。
  3. Flask-SQLAlchemyには、それらが存在することがわからない場合に混乱させることができる素敵な追加機能があります。
14
Kimmo Hintikka

@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定義のモデルを使用しています。

7
Mike Waites

これは、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)を使用している場合は、オブジェクトをデータベースに保存する方法(テーブルの名前など)について異なる仮定を立てることができるため、独自のアダプタークラスを作成する必要があります。

2
2-complex