Én database
Motoren er det, der giver dig mulighed for at bruge forbindelsespooling. Som standard bevarer den forbindelser på tværs af anmodninger. Den grundlæggende brug (uden smarte ting som scoped_session
eller sessionmaker
) er sådan her:
engine = create_engine(...)
@app.route(...)
def foo():
session = Session(bind=engine)
try:
session.query(...)
session.commit()
finally:
session.close()
return ""
Oven i dette kan du tilføje scoped_session
og sessionmaker
:
engine = create_engine(...)
Session = sessionmaker(bind=engine)
session = scoped_session(Session, scopefunc=...)
@app.route(...)
def foo():
try:
session.query(...)
session.commit()
finally:
session.close()
return ""
flask-sqlalchemy
gør dit liv lettere ved at levere alt dette:
db = SQLAlchemy(app)
@app.route(...)
def foo():
db.session.query(...)
db.session.commit()
return ""
Flere databaser
Du kan nemt udvide dette koncept til flere databaser:
engine1 = create_engine(...)
engine2 = create_engine(...)
@app.route(...)
def foo():
session = Session(bind=choose_engine_for_user())
try:
session.query(...)
session.commit()
finally:
session.close()
return ""
Når du tilføjer scoped_session
og sessionmaker
:
engine1 = create_engine(...)
engine2 = create_engine(...)
Session1 = sessionmaker(bind=engine1)
Session2 = sessionmaker(bind=engine2)
session1 = scoped_session(Session1, scopefunc=...)
session2 = scoped_session(Session2, scopefunc=...)
@app.route(...)
def foo():
session = choose_session_for_user()
try:
session.query(...)
session.commit()
finally:
session.close()
return ""
Dette bliver lidt irriterende, når du har mange databaser, i så fald bør du nok skrive en registreringsklasse for at holde styr på alle motorer og sessioner:
class SessionRegistry(object):
_registry = {}
def get(self, url, **kwargs):
if url not in self._registry:
engine = create_engine(url, **kwargs)
Session = session_maker(bind=engine)
session = scoped_session(Session, scopefunc=...)
self._registry[url] = session
return self._registry[url]
registry = SessionRegistry()
@app.route(...)
def foo():
session = registry.get(...)
try:
session.query(...)
session.commit()
finally:
session.close()
return ""
Du bliver nødt til at tilføje en slags LRU oven på det, så der ikke er nogen ubegrænset oprettelse af motorer.
flask-sqlalchemy
har understøttelse af en begrænset form for flere databaser, hvor hver af dine modeller opretter forbindelse til en anden database. Hvis dette gælder for dig, er dokumentationen her
.