【问题标题】:Where to put db_session related statements in sqlalchemy based web application?在基于 sqlalchemy 的 Web 应用程序中将 db_session 相关语句放在哪里?
【发布时间】:2012-08-23 14:59:42
【问题描述】:

我正在使用烧瓶和 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()
    .
    .
    .

【问题讨论】:

    标签: python model sqlalchemy flask-sqlalchemy


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我决定采用第一种方法。
    【解决方案2】:

    一般来说,是的,您应该将它们放在视图/控制器中。原因是应用程序的逻辑应该在View/Controller中。通常,您将通过您的视图/控制器添加/删除/删除/更新等,这就是您应该放置所有这些的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 2014-08-03
      • 2023-03-10
      相关资源
      最近更新 更多