sql >> Databasteknik >  >> RDS >> Mysql

Flask-SQLAlchemy - i farten anslutningar till flera databaser

En databas

Motorn är det som låter dig använda anslutningspoolning. Som standard kommer det att bevara anslutningar över förfrågningar. Den grundläggande användningen (utan snygga saker som scoped_session eller sessionmaker ) är så här:

engine = create_engine(...)

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

Utöver detta kan du lägga till scoped_session och 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 ditt liv enklare genom att tillhandahålla allt detta:

db = SQLAlchemy(app)

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

Flera databaser

Du kan enkelt utöka detta koncept till flera 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 lägger till scoped_session och 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 ""

Det här blir lite irriterande när du har många databaser, i så fall bör du förmodligen skriva en registerklass för att hålla reda på alla motorer och 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 måste lägga till någon form av LRU ovanpå den så att det inte finns något obegränsat skapande av motorer.

flask-sqlalchemy har stöd för en begränsad form av flera databaser där var och en av dina modeller ansluter till en annan databas. Om detta gäller dig finns dokumentationen här .




  1. Förstå PostgreSQL-datumtyper och funktioner (genom exempel)

  2. Hur kan jag använda DATE() i Doctrine 2 DQL?

  3. Hur Random() fungerar i PostgreSQL

  4. Kan inte ta reda på hur man kör en mysqli_multi_query och använder resultaten från den senaste frågan