sql >> Databáze >  >> RDS >> Mysql

Flask-SQLAlchemy - průběžné připojení k více databázím

Jedna databáze

Engine je to, co vám umožňuje používat sdružování připojení. Ve výchozím nastavení zachová připojení napříč požadavky. Základní použití (bez ozdobných věcí jako scoped_session nebo sessionmaker ) je takto:

engine = create_engine(...)

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

Kromě toho můžete přidat scoped_session a 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 usnadňuje vám život tím, že poskytuje toto vše:

db = SQLAlchemy(app)

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

Více databází

Tento koncept můžete snadno rozšířit na více databází:

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

Když přidáte scoped_session a 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 ""

To je trochu nepříjemné, když máte mnoho databází, v takovém případě byste pravděpodobně měli napsat třídu registru, abyste měli přehled o všech motorech a relacích:

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

Na to budete muset přidat nějaký druh LRU, aby nedocházelo k neomezené tvorbě motorů.

flask-sqlalchemy má podporu pro omezenou formu více databází, kde se každý váš model připojuje k jiné databázi. Pokud se vás to týká, dokumentace je zde .




  1. SQL Server Vložit, pokud neexistuje

  2. Jak nakonfigurovat zvýraznění syntaxe v SQLcl

  3. Jak funguje načítání dat ze serveru SQL Server do SqlDataReader?

  4. Nelze se připojit k serveru MySQL na '127.0.0.1' (10061) (2003)