Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Flask-SQLAlchemy – On-the-Fly-Verbindungen zu mehreren Datenbanken

Eine Datenbank

Die Engine ermöglicht es Ihnen, das Verbindungspooling zu verwenden. Standardmäßig werden Verbindungen über Anforderungen hinweg beibehalten. Die grundlegende Verwendung (ohne ausgefallene Dinge wie scoped_session oder sessionmaker ) sieht so aus:

engine = create_engine(...)

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

Darüber hinaus können Sie scoped_session hinzufügen und 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 macht Ihr Leben einfacher, indem es all dies bereitstellt:

db = SQLAlchemy(app)

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

Mehrere Datenbanken

Sie können dieses Konzept leicht auf mehrere Datenbanken erweitern:

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

Wenn Sie scoped_session hinzufügen und 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 ""

Dies wird ein wenig lästig, wenn Sie viele Datenbanken haben, in diesem Fall sollten Sie wahrscheinlich eine Registrierungsklasse schreiben, um alle Engines und Sitzungen zu verfolgen:

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

Sie müssen darüber eine Art LRU hinzufügen, damit keine unbegrenzten Engines erstellt werden.

flask-sqlalchemy unterstützt eine begrenzte Form mehrerer Datenbanken, bei denen jedes Ihrer Modelle eine Verbindung zu einer anderen Datenbank herstellt. Wenn dies auf Sie zutrifft, finden Sie die Dokumentation hier .