Диалог настройки SQLAlchemy Flask

У меня есть приложение Flask, работающее под WSGI, где URI базы данных изменяется со временем. Каждые два часа URI переключается на другую базу данных. Я использую это время, чтобы заполнить одну базу данных, а другая – обслуживать данные для приложения.

Мне сложно определить, как лучше всего настроить сеанс, чтобы при переключении клиенты получили правильную (другую) базу данных при следующем запросе. Из моего тестирования, если я инициализирую базу данных на верхнем уровне, когда произойдет переход, клиенты все еще остаются указателями на старую базу данных.

Я думал о настройке сеанса внутри самих страниц (индекс и т. Д.), Но какая боль, а затем я беспокоюсь о том, чтобы открывать и закрывать слишком много соединений с базой данных и оставлять их лежащими. Я думаю, что я, вероятно, мог бы заставить его работать, инициализируя обе сессии при запуске, а затем просто выбирая, что использовать при переключении внутри каждой страницы. Это кажется неэффективным, и я уверен, что есть лучший способ.

Помогите?!

~~~~~~~~~

Это общее представление о том, что я сейчас делаю, но нет способа изменить URI между запросами. Код верхнего уровня запускается только один раз или каждый так часто.

if now.hour % 2: db_name = 'db1' else: db_name = 'db2' app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://foo:poo@localhost:3306/%s" % db_name def init_db(uri, **kwargs): engine = create_engine(uri, **kwargs) Base.metadata.create_all(bind=engine) global db_session db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) Base.query = db_session.query_property() init_db(app.config['SQLALCHEMY_DATABASE_URI'], pool_recycle=3600) @app.teardown_request def shutdown_session(exception=None): db_session.remove() @app.route('/') def index(): ...etc... 

Рабочий пример – Красивый.

 app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://foo:poo@localhost:3306/%s" class SessionManager(object): def __init__(self, base_uri=None, **kwargs): self.session = None self.base_uri = base_uri self.kwargs = kwargs def get_session(self): if now.hour % 2: db_name = 'db1' else: db_name = 'db2' if self.session: if self.session.name == db_name: return self.session else: self.session.remove() self.session = None if not self.session: engine = create_engine(self.base_uri % db_name, **self.kwargs) db_session = scoped_session(sessionmaker(bind=engine)) db_session.name = db_name self.session = db_session return db_session session_manager = SessionManager(base_uri=app.config['SQLALCHEMY_DATABASE_URI'], pool_recycle=3600) db_session = LocalProxy(session_manager.get_session) 

    One Solution collect form web for “Диалог настройки SQLAlchemy Flask”

    Вы можете создать пользовательский построитель для сеанса, который будет воссоздавать движок и сеанс с ограниченным сроком действия, когда ваши правила будут его диктовать. Что-то вроде

     class SessionManager(object): def __init__(self): self.session = None def get_session(self): # return existing session or make a new engine and scoped_session 

    Чтобы сделать этот класс прозрачным, используйте LocalProxy от Werkzeug . Код, который использует сеансы, не должен вообще меняться.

     session_manager = SessionManager() db_session = LocalProxy(session_manager.get_session) 
    Python - лучший язык программирования в мире.