Переключение баз данных в TG2 во время выполнения
Я делаю приложение, которое будет использовать несколько баз данных sqlite3, предварительно заполненных данными из внешнего приложения. Каждая база данных будет иметь одинаковые таблицы, но с разными данными.
Я хочу иметь возможность переключаться между этими базами данных в соответствии с пользовательским вводом. Какой самый элегантный способ сделать это в TurboGears 2?
3 ответа
Если ВСЕ базы данных имеют одинаковую схему, вы сможете создать несколько сеансов с использованием одной и той же модели для разных БД.
Я использую две базы данных для приложения только для чтения. Вторая база данных - это кэш на случай, если основная база данных не работает. Я использую два объекта для хранения соединения, метаданных и совместимых Table
экземпляров. Верхняя часть функции просмотра назначает db = primary
или же db = secondary
а остальное просто запросы против db.tableA.join(db.tableB)
, Я не использую ORM.
Схемы не являются строго идентичными. Первичная база данных нуждается в schema.
префикс (Table(...schema='schema')
) и кеш базы данных нет. Чтобы обойти это, я создаю свои объекты таблицы в функции, которая принимает имя схемы в качестве аргумента. Вызывая функцию один раз для каждой базы данных, я получаю совместимые префиксы и префиксы Table
объекты.
По крайней мере, в пилонах, SQLAlchemy meta.Session
это ScopedSession
, Приложения BaseController
в appname/lib/base.py
звонки Session.remove()
после каждого запроса. Вероятно, лучше иметь один Session
который обращается к обеим базам данных, но если вы этого не сделаете, вам может понадобиться изменить BaseController
звонить .remove()
на каждой Session
,
Джелил,
Некоторое время назад я написал сообщение в блоге об использовании нескольких баз данных в TG2. Вы могли бы объединить этот метод с предложением Хорхе нескольких DBSessions, и я думаю, что вы могли бы сделать это легко.
Как использовать несколько баз данных в TurboGears 2.0
Надеюсь, это поможет, Сет