Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在基于sqlalchemy的web应用程序中,将db_会话相关语句放在何处?_Python_Model_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python 在基于sqlalchemy的web应用程序中,将db_会话相关语句放在何处?

Python 在基于sqlalchemy的web应用程序中,将db_会话相关语句放在何处?,python,model,sqlalchemy,flask-sqlalchemy,Python,Model,Sqlalchemy,Flask Sqlalchemy,我正在使用flask和sqlalchemy创建一个web应用程序 我不知道如何放置与db_会话相关的语句,比如db_session.add()。我正在考虑两种方法。一种是在模型本身中创建一个add()函数,并完全封装sqlalchemy部分。另一种方法是从控制器调用这些函数。在查看许多模型示例时,我可以看到大部分使用了第二种方法。哪种方法更好/正确?为什么 例如1)在模型本身中 class Events(db.Model): id = db.Column(db.Integer, prim

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

我不知道如何放置与db_会话相关的语句,比如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()
    .
    .
    .

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

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

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


利与弊总是存在的。我建议编写两个不同的控制器,看看哪种方法更适合您的项目。不要忘记处理异常。如果您决定使用第一种方法,请使用common for all models方法创建一个BaseModel类。

谢谢。我决定采用第一种方法。