Hi Sorry this is a very open ended question and more like a coding advice. Looking for what are the best practises for using sqlalchemy session for flask projects. Couldn't find a blog that could answer my question, hence asking it here.
I have project structure for a flask app similar to following:
---services
--- service_1.py
--- service_2.py
---models.py
---adapter.py
---app.py
All the business logic resides in services. Methods in services call methods in adapter for any interaction with DB.
Adapter is data access layer all the sql queries are happening inside it. Adaper code is like this:
from .models import *
class DBAdapter(object):
def __init__(self, session):
self._db_session = get_session() # get a sql alchemy session
def create_customer(**kwargs):
c = Customer(**kwargs)
self._db_session.add(c)
return c
.
.
.
def commit(self):
self.session.commit()
def close_session(self):
self.session.close()
The service looks something like this:
from ..adapter import DBAdapter
class Service1(object):
def __init__(self, a):
self.a = a
self._db_adapter = DBAdapter()
def do_something(self, x, y):
if x != 10:
self.create_something(x)
self._db_adapter.commit()
self._db_adapter.close_session()
return
self._db_adapter.create_customer(y)
self._db_adapter.create_something_else(x)
self._db_adapter.commit()
self._db_adapter.close_session()
return
Now the problem is how to close the session without repetition of self._db_adapter.close_session()
before each return statement. It needs to be closed at two places once before return inside if condition then at the end.
Should I create my data access layer DBAdapter
in a different way?
I want to keep my session clean and create it only when a service is initialized, so I can't put it in g object in flask like this:
Flask and sqlalchemy: handling sessions
Aucun commentaire:
Enregistrer un commentaire