フラスコ-sqlalchemyまたはsqlalchemy


93

私はフラスコとsqlalchemyの両方を初めて使用し、フラスコアプリで作業を開始するだけで、今のところsqlalchemyを使用しています。Flask-sqlalchemyとsqlalchemyを使用することから得られる大きなメリットがあるかどうか疑問に思っていました。http://packages.python.org/Flask-SQLAlchemy/index.htmlで十分な動機を見つけることができなかったか、値を理解できなかったのかもしれません。あなたの説明をお願いします。


6
うーん、まだここで満足のいく答えはありません。誰もが実際の具体的なメリットがFlaskアプリで何よりもflask-sqlalchemy古くなっsqlalchemyていることを説明できますか?
スティーブベネット

ただし、大きな欠点の1つは、Flask-SqlAlchemyアプリでマルチテナンシーをセットアップする方法を提供しないことです。それはIMOの最大のマイナスです。binds提供されているのは、異なるデータベースを異なるモデルに接続することだけですが、同じモデルでテナント固有のデータベースを使用する方法はありません。
Rohit Jain

回答:


67

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

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

の唯一の機能となる理想的な世界ではFlask-SQLAlchemy、実際にはさらにいくつかの機能が追加されます。それらの概要をまとめた優れたブログ投稿は、Flask-SQLAlchemyの解説です。

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

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


4
私は混乱したままです。リンクされたブログ投稿(および公式ドキュメント!)には、Flask-SQLAlchemy機能であるかのように、いくつかのプレーンなSQLAlchemy機能(宣言ベースなど)がリストされています。彼らがSQLAlchemyに組み込まれたものを信用しているか、それを再実装したのか(また、後者の場合はなぜそうしたのか)は不明です。最初の段落には、セッション管理用の便利なラッパー(ただし、Flaskの外部で SQLAlchemyモデルを使用する場合は、独自にロールバックする必要はありませんか?)と、「Flaskアプリを操作する」ための未指定の「構成」という2つの機能がリストされています。それはどういう意味ですか?
マークアメリー2018

1
私も質問に少し戸惑っています。リンクされたブログ投稿は非常に明確なIMOです。たとえば、「クエリプロパティとページネーションをサポートするカスタム宣言ベースモデル」というキーが「カスタム」であり、「クエリプロパティとページネーションをサポートする」が上に追加されます。 SQLAlchemyの宣言ベース。
ボリスセレブロフ2018年

1
「便利なラッパー」について-それらは便宜のためではなく、物事を適切に機能させるためのものです。SQLAlchemyの使用を開始するには、データベース接続(enening / connection / session)オブジェクトが必要であり、SQLクエリを作成する必要があるたびにこれらを作成したくないので、これらをグローバルに作成し、アプリケーションコード全体で使用できるようにする必要があります。したがって、この「db」オブジェクトを適切に作成および初期化する方法を考えずに、「fromyourapplication import db」のようなことを実行してから、「db.session.something()」を実行できます。
ボリスセレブロフ2018年

そして、「Flaskアプリを操作する」ための未指定の「構成」については、実際には2番目の段落で指定されていますThis setup is quite complex as we need to create the scoped session and properly handle it according to the Flask application request/response life-cycle.。SQLAlchemyのドキュメントで詳細を参照してください。いつセッションを構築するか、いつコミットするか、いつ行うか閉じますか?およびContextual / Thread-local Sessions
ボリスセレブロフ2018年

20

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


5
はい、あなたのユースケースではFlask-SQLAlchemyは時代遅れのようです。しかし、OPがそのようなシナリオを持っている場合、彼はおそらくこの質問をしません。セッションスコープについて何も知らない新規ユーザーにとって、Flask-SQLAlchemyは間違いなく必須です!
schlamar 2013年

20

Flask-SQLAlchemyを使用すると、SQLAlchemyを使用して自分で実装することになる他の優れた機能が数多く提供されます。

Flask-SQLAlchemyを使用する際のプラス面


  1. Flask_SQLAlchemyは、セッションの構成、セットアップ、および破棄を処理します。
  2. クエリとページ分割を容易にする宣言型の基本モデルを提供します
  3. バックエンド固有の設定。Flask-SQLAlchemyは、インストールされているライブラリをスキャンしてUnicodeをサポートし、失敗した場合はSQLAlchemy Unicodeを自動的に使用します。
  4. apply_driver_hacksMySQLのプールサイズなどの適切なデフォルトを自動的に設定するメソッドが呼び出されます
  5. すべてのテーブルを作成および削除するためのメソッドcreate_all()およびdrop_all()の優れたビルドがあります。あなたが愚かな何かをした場合、テストやPythonコマンドラインで役立ちます
  6. >(http://flask-sqlalchemy.pocoo.org/2.1/queries/にあるfind()の代わりにget_or_404()およびfind_or_404()のコード例を提供します。

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

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


  1. Flask-SQLAlchemyを使用すると、Flaskからの移行がさらに困難になり、必要に応じてPyramidを使用できるようになります。これは主に、Flask_SQLAchemyのカスタム宣言ベースモデルによるものです。
  2. Flask-SQLAlchemyを使用すると、SQLAlchemy自体よりもはるかに小さなコミュニティのパッケージを使用するリスクがあり、私はすぐにアクティブな開発から簡単に離脱することはできません。
  3. Flask-SQLAlchemyにはいくつかの優れた機能があり、それらが存在することを知らないと混乱する可能性があります。

15

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

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

この引用と詳細な動機は、セッションFAQの 2番目の質問にあります。


2
Flask-sqlalchemyはメンテナンスされていないようです。最後の更新は2013年8月1日でした。このアドバイスはもう関係ありますか?
pmav99 2014年

@ pmav99に具体的な問題がない限り、特に新しいユーザーには特にお勧めします。
シュラマー

1
2014年11月の時点で積極的に維持されているようです。最近のコミットの多く。github.com/mitsuhiko/flask-sqlalchemy/commits/master
スティーブベネット

25
OPは直接尋ねませんでしたが、imo。彼はFlask-SQLAlchemyの利点を知りたがっていました。あなたの答えは文字通り「利点が何であるかわからない場合でもそれを使用してください」-はい、利点は何ですか?
Markus Meskanen、2016年

1
この答えはOPの質問には答えません。あなたはフラスコ-sqlalchemyを推奨していますが、推奨の背後に多くの理由があります。
mbadawi23

7

@schlamarが示唆するように、Flask-SqlAlchemyはdefoが良いことです。そこに作成されたポイントに追加のコンテキストを追加したいのですが。

あなたが他のものを選んでいるように感じないでください。たとえば、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()

ご覧のとおり、問題なく1つから別の場所に簡単にジャンプできます。2番目の例では、実際にはFlask-Sqlalchemyで定義されたモデルを使用しています。


1
「たとえば、Flask-Sqlalchemyを使用するモデルを使用して、テーブルからすべてのレコードを取得するとします。これは、Model.query.all()「SQLAlchemy だけで実行できます。Flask -SQLAlchemyを使用すると、ここではまったく何も新しいものは提供されません。
Markus Meskanen

あなたは素晴らしいです!私はこの投稿に偶然出会い、私が抱えていた問題を解決しました。anacondaをインストールした後、何らかの理由で通常の更新が機能しませんでした。何らかの理由でからModel.query.all()に変更されたdb.session.query(Model).all()ため、セッションは通常どおり追跡および更新できました。
ジェフブルーメル

2

これは、flask-sqlalchemyが単純なsqlalchemyに勝る利点の例です。

フラスコ_ユーザーを使用しているとします。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.