Mysql
 sql >> база данни >  >> RDS >> Mysql

Flask-SQLAlchemy - в движение връзки към множество бази данни

Една база данни

Двигателят е това, което ви позволява да използвате обединяване на връзки. По подразбиране той ще запази връзките между заявките. Основното използване (без фантастични неща като scoped_session или sessionmaker ) е така:

engine = create_engine(...)

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

Освен това можете да добавите scoped_session и 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 улеснява живота ви, като предоставя всичко това:

db = SQLAlchemy(app)

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

Множество бази данни

Можете лесно да разширите тази концепция до множество бази данни:

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

Когато добавите scoped_session и 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 ""

Това става малко досадно, когато имате много бази данни, в който случай вероятно трябва да напишете клас на системния регистър, за да следите всички двигатели и сесии:

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

Ще трябва да добавите някакъв LRU върху него, така че да няма неограничено създаване на двигатели.

flask-sqlalchemy има поддръжка за ограничена форма от множество бази данни, където всеки от вашия модел се свързва с различна база данни. Ако това се отнася за вас, документацията е тук .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Времето за изчакване на заключване е превишено

  2. Кой е най-простият начин за съхраняване на данни от java програма в MySQL?

  3. Как да изчисля пълзяща средна с помощта на MySQL?

  4. MySQL с помощта на Sum и Case

  5. Как да стартирате или заредите .po/.mo файлове за локализация в php