在基于sqlalchemy的Web应用程序中放置db_session相关语句的位置?

时间:2012-08-23 14:59:42

标签: python model sqlalchemy flask-sqlalchemy

我正在使用flask和sqlalchemy创建一个Web应用程序。

我对db_session相关语句如db_session.add()感到困惑。我正在考虑两种方法。一种是在模型本身中创建一个add()函数,并完全封装sqlalchemy部分。另一种方法是从控制器调用这些函数。在查看模型的许多示例时,我可以看到主要使用第二种方法。哪种方式更好/更正确?为什么?

例如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()
    .
    .
    .

2 个答案:

答案 0 :(得分:1)

在第二种情况下,您可以在一个事务中保存多个记录,并在出现问题时将其回滚。对我来说,主要在控制器中使用会话似乎是合乎逻辑的,至少这是我在之前的项目中所做的。主要是因为事务和错误处理代码看起来更明确。

另一方面,您可以使用子事务,并且Django ORM具有model.savemodel.delete个函数。控制器看起来更干净。

总有利有弊。我建议编写几个不同的控制器,看看哪种方法对你的项目更有效。不要忘记处理异常。如果您决定使用第一种方法,请为所有模型方法创建一个共同的BaseModel类。

答案 1 :(得分:0)

一般情况下,是的,您应该将它们放在View / Controller中。原因是应用程序的逻辑应该在View / Controller中。通常,您将通过View / Controller添加/删除/删除/更新等,这是您应该放置所有这些内容的地方。