Диалог настройки 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) 
     
    Interesting Posts for Van-Lav

    Ошибка загрузки DLL:% 1 не является допустимым приложением win32

    Что самое близкое к Apache Hadoop на других языках?

    Чтение аудиоданных в реальном времени в массив numpy

    Слияние данных в ближайшем времени datetime / timestamp

    mod_wsgi error – class .__ dict__ недоступен в ограниченном режиме

    Какова минимальная структура каталогов, чтобы заставить setuptools работать с one_file.py?

    Matplotlib – логарифмическая шкала, но требует не логарифмических меток

    сгенерировать шаблонную матрицу

    Добавьте разделители тысяч десятичных знаков в число

    Утвердить, что метод был вызван в модульном тесте Python

    Печать 5 элементов в строке по отдельным строкам для списка?

    Как подсчитать строки комментариев и пустые строки исходного кода Java с помощью Python?

    Проверка JQuery Удаленная опция Flask

    Как я могу получить путь к папке% APPDATA% в Python?

    Как разбить массив numpy в куски фиксированного размера с перекрытием и без него?

    Python - лучший язык программирования в мире.