python - 在基于 sqlalchemy 的 Web 应用程序中,将 db_session 相关语句放在哪里?

标签 python model sqlalchemy flask-sqlalchemy

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

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

例如 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) 在 Controller 中

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

最佳答案

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

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

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

关于python - 在基于 sqlalchemy 的 Web 应用程序中,将 db_session 相关语句放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12094605/

相关文章:

python - 通过调用页面的 PageObject 导航到该页面

python - Scrapy:获取两个标识符之间的文本

php - 如何将带下划线的表列映射到 ZF2 中的驼峰式模型类属性?

python - 多个模型上的 Alembic 迁移

python - SQLAlchemy - 使用关系按行类型类进行过滤

python - 来自查询/游标结果的 Sqlalchemy 模型实例

python - PyWin32 和 Python 3.8.0

Python 实例和属性 : is this a bug or i got it totally wrong?

javascript - 如何在 AngularJS 中处理实时数据和查看状态

iphone - 从 View Controller 访问模型?