Где поместить инструкции, связанные с сеансом БД, в веб-приложение на основе sqlalchemy?


Я создаю веб-приложение, используя flask и sqlalchemy.

Меня смущает, что я ставлю связанные с db_session операторы, такие как db_session.добавлять(). Есть два подхода, о которых я думаю. Один из них-создать функцию 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 2

2 ответа:

Во втором случае вы можете сохранить несколько записей в одной транзакции и откатить ее, если что-то пойдет не так. Мне кажется логичным использовать session в основном в контроллерах, по крайней мере, это то, что я сделал в своем предыдущем проекте. В первую очередь потому, что таким образом транзакции и код обработки ошибок выглядели более явными.

С другой стороны, вы можете использовать суб-транзакции, и есть Django ORM, который имеет model.save, model.delete функции. И контроллеры выглядят чище в этом смысле.

Там всегда есть плюсы и минусы. Я бы предложил написать пару различных контроллеров и посмотреть, какой подход лучше подходит для вашего проекта. Не забывайте обрабатывать исключения. Если вы решите использовать первый подход, создайте класс BaseModel с общими для всех ваших моделей методами.

В общем, да, вы должны поместить их в представление / контроллер. Причина в том, что логика приложения должна быть в представлении / контроллере. Обычно вы добавляете / удаляете / удаляете / обновляете и т. д. через ваш вид / контроллер, и именно туда вы должны поместить все это.