2009-07-07 4 views
1

Я делаю приложение, которое будет использовать несколько баз данных sqlite3, предварительно заполненных данными из внешнего приложения. Каждая база данных будет иметь одни и те же таблицы, но с разными данными.Переключение баз данных в TG2 во время выполнения

Я хочу иметь возможность переключаться между этими базами данных в соответствии с пользовательским вводом. Какой самый элегантный способ сделать это в TurboGears 2?

+0

Практически любой другой дизайн лучше этого. Почему вы не можете загружать одну базу данных из нескольких источников? –

+0

Или присоедините внешние базы данных к вашему текущему. Это заставляет их вести себя так, как будто они находятся в одном соединении, просто в другом пространстве имен. – Christopher

+0

Чтобы загрузить все в одну базу данных, мне нужно будет изменить схему, и я не могу этого сделать, поскольку другие приложения зависят от этой схемы. Предложение ATTACH кажется интересным, но я не могу придумать способ заставить его работать в моем случае. Я полагаюсь на sqlalchemy для создания моей модели декларативно, и каждый класс модели связан с табличным именем. Чтобы присоединить идентичные базы данных, мне нужно будет добавить каждое имя таблицы с идентификатором, который сломает sqlalchemy. – dzhelil

ответ

1

Если все базы данных имеют одинаковую схему, вы должны иметь возможность создавать несколько сеансов с использованием той же модели для разных БД.

1

Джелил,

я написал сообщение в блоге некоторое время назад об использовании нескольких баз данных в TG2. Вы могли бы объединить этот метод с предложением Хорхе о множественных DBSessions, и я думаю, вы могли бы сделать это легко.

How to use multiple databases in TurboGears 2.0

Надеется, что это помогает, Сета

1

Я использую две базы данных для приложения только для чтения. Вторая база данных - это кеш, если основная база данных не работает. Я использую два объекта для хранения соединений, метаданных и совместимых экземпляров 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.

Смежные вопросы