2

フラスコと sqlalchemy を使用して Web アプリケーションを作成しています。

db_session.add() のような db_session 関連のステートメントを置くことについて混乱しています。私が考えているアプローチは2つあります。1 つは、モデル自体に add() 関数を作成し、sqlalchemy 部分を完全にカプセル化することです。別のアプローチは、コントローラーからこれらの関数を呼び出すことです。モデルの多くの例を見ていると、主に 2 番目のアプローチが使用されていることがわかります。これを行うためのより良い/正しい方法とその理由はどれですか?

例1) モデル自体

class Events(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(128))
    .
    .
    .

    def add(self):
        db.session.add(self)
        db.session.commit()

    def delete(self):
        db.session.delete(self)
        db.session.commit()

class EventsAPI(MethodView):
    def get(self, event_id):
        e = Events()
        e.title = 'testing'
        e.add()
    .
    .
    .

2) コントローラー内

class Events(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(128))
    .
    .
    .

class EventsAPI(MethodView):
    def get(self, event_id):
        e = Events()
        e.title = 'testing'
        db.session.add(e)
        db.session.commit()
    .
    .
    .
4

2 に答える 2

1

2 番目のケースでは、1 つのトランザクションで複数のレコードを保存し、問題が発生した場合にロールバックできます。ほとんどのコントローラーで session を使用することは、私にとって論理的に思えます。少なくとも、以前のプロジェクトで行ったことはそうです。主な理由は、トランザクションとエラー処理コードがより明示的に見えたためです。

一方、サブトランザクションを使用することができmodel.savemodel.delete関数を持つ Django ORM があります。そして、コントローラーはそのようにきれいに見えます。

常に長所と短所があります。いくつかの異なるコントローラーを作成し、どのアプローチがプロジェクトに適しているかを調べることをお勧めします。例外を処理することを忘れないでください。最初のアプローチを使用する場合は、すべてのモデル メソッドに共通の BaseModel クラスを作成します。

于 2012-08-23T19:31:09.447 に答える
0

一般に、はい、それらをビュー/コントローラーに配置する必要があります。その理由は、アプリケーションのロジックがビュー/コントローラーにある必要があるためです。通常、View / Controllerを介して追加/削除/削除/更新などを行います。ここに、これらすべてを配置する必要があります。

于 2012-08-23T19:25:44.113 に答える