sql >> Database teknologi >  >> RDS >> Mysql

Flask-SQLAlchemy - på farten forbindelser til flere databaser

É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 .




  1. Henter RAND() rækker uden ORDER BY RAND() i kun én forespørgsel

  2. ved hjælp af MySql.Data.MySqlClient; Det virker ikke

  3. Java.lang.IllegalStateException:Allerede vedhæftet

  4. Kræver LIMIT OFFSET,LENGTH ORDER BY for paginering?