sql >> Database >  >> RDS >> Mysql

Flask-SQLAlchemy - directe verbindingen met meerdere databases

Eén database

De engine is wat u in staat stelt om pooling van verbindingen te gebruiken. Standaard zal het verbindingen tussen verzoeken behouden. Het basisgebruik (zonder fancy dingen zoals scoped_session of sessionmaker ) is als volgt:

engine = create_engine(...)

@app.route(...)
def foo():
    session = Session(bind=engine)
    try:
        session.query(...)
        session.commit()
    finally:
        session.close()
    return ""

Bovendien kunt u scoped_session . toevoegen en 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 maakt uw leven gemakkelijker door dit alles te bieden:

db = SQLAlchemy(app)

@app.route(...)
def foo():
    db.session.query(...)
    db.session.commit()
    return ""

Meerdere databases

U kunt dit concept eenvoudig uitbreiden naar meerdere databases:

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 ""

Wanneer u scoped_session . toevoegt en 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 ""

Dit wordt een beetje vervelend als je veel databases hebt, in welk geval je waarschijnlijk een registerklasse moet schrijven om alle engines en sessies bij te houden:

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 ""

Je moet er een soort LRU aan toevoegen, zodat er geen onbeperkte creatie van engines is.

flask-sqlalchemy heeft ondersteuning voor een beperkte vorm van meerdere databases waarbij elk van uw modellen verbinding maakt met een andere database. Als dit op u van toepassing is, is de documentatie hier .




  1. SQL-query om kolomwaarden uit meerdere rijen in Oracle samen te voegen

  2. Omgaan met database-integriteit

  3. Een multi-datacenterconfiguratie voor PostgreSQL implementeren - deel één

  4. Geavanceerde failover met behulp van post/pre-script hooks