Где поместить инструкции, связанные с сеансом БД, в веб-приложение на основе 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 ответа:
Во втором случае вы можете сохранить несколько записей в одной транзакции и откатить ее, если что-то пойдет не так. Мне кажется логичным использовать session в основном в контроллерах, по крайней мере, это то, что я сделал в своем предыдущем проекте. В первую очередь потому, что таким образом транзакции и код обработки ошибок выглядели более явными.
С другой стороны, вы можете использовать суб-транзакции, и есть Django ORM, который имеет
model.save
,model.delete
функции. И контроллеры выглядят чище в этом смысле.Там всегда есть плюсы и минусы. Я бы предложил написать пару различных контроллеров и посмотреть, какой подход лучше подходит для вашего проекта. Не забывайте обрабатывать исключения. Если вы решите использовать первый подход, создайте класс BaseModel с общими для всех ваших моделей методами.