Я использую две базы данных для приложения только для чтения. Вторая база данных - это кеш, если основная база данных не работает. Я использую два объекта для хранения соединений, метаданных и совместимых экземпляров Table
. В верхней части функции просмотра присваивается db = primary
или db = secondary
, а остальные - только запросы от db.tableA.join(db.tableB)
. Я не использую ORM.
Схемы не являются строго идентичными. Первичной базе данных нужен префикс schema.
(Table(...schema='schema')
), а в базе данных кеша нет. Чтобы обойти это, я создаю свои объекты таблицы в функции, которая принимает имя схемы в качестве аргумента. Вызывая функцию один раз для каждой базы данных, я заканчиваю совместимыми префиксными и не префиксными объектами Table
.
По крайней мере, в Pylons SQLAlchemy meta.Session
является ScopedSession
. Приложение BaseController
в appname/lib/base.py
звонит Session.remove()
после каждого запроса. Вероятно, лучше иметь один Session
, который разговаривает с обеими базами данных, но если этого не произойдет, вам может понадобиться изменить ваш BaseController
, чтобы позвонить .remove()
на каждом Session
.
Практически любой другой дизайн лучше этого. Почему вы не можете загружать одну базу данных из нескольких источников? –
Или присоедините внешние базы данных к вашему текущему. Это заставляет их вести себя так, как будто они находятся в одном соединении, просто в другом пространстве имен. – Christopher
Чтобы загрузить все в одну базу данных, мне нужно будет изменить схему, и я не могу этого сделать, поскольку другие приложения зависят от этой схемы. Предложение ATTACH кажется интересным, но я не могу придумать способ заставить его работать в моем случае. Я полагаюсь на sqlalchemy для создания моей модели декларативно, и каждый класс модели связан с табличным именем. Чтобы присоединить идентичные базы данных, мне нужно будет добавить каждое имя таблицы с идентификатором, который сломает sqlalchemy. – dzhelil