Работа с несколькими базами данных и Binds

Начиная с версии 0.12 Flask-SQLAlchemy может легко подключаться к нескольким базам данных. Для этого неоходимо выполнить преконфигурацию SQLAlchemy для поддержки нескольких “binds” (прим. пер. буду переводить как привязка).

Что такое привязки? В SQLAlchemy гворят привязка это то что может выполнить операторы SQL, и как правило подключения или движок. В Flask-SQLAlchemy под привязками имеют ввиду движки которые создаются автоматически невидимо для вас. Каждый из этих движков затем связывается с коротким ключом (ключ привязки). Этот ключ затем используется во время описания модели, чтобы связать модель с конкретным двигателем.

Елси не один ключ привязки не указан для модели, то используется подключение по умолчанию (как заданно SQLALCHEMY_DATABASE_URI).

Пример конфигурации

Следующая конфигурация объявляет поключение к трем базам данных. Одно по умолчанию, а также два других названных users (для пользователей) и appmeta (которое подключается к базе данных SQLite с доступом только на чтения к некоторым данным приложение обеспечивает внутри):

SQLALCHEMY_DATABASE_URI = 'postgres://localhost/main'
SQLALCHEMY_BINDS = {
    'users':        'mysqldb://localhost/users',
    'appmeta':      'sqlite:////path/to/appmeta.db'
}

Создание и удаление таблиц

Методы create_all() и drop_all() по умолчанию работают на всех привязках, включая которая по умолчанию. Это поведение может быть настроенно в реализации параметра bind. Это может быть имя одной привязки, '__all__' для указания всех привязок или список привязок. По умолчанию привязка (SQLALCHEMY_DATABASE_URI) установлеа в None:

>>> db.create_all()
>>> db.create_all(bind=['users'])
>>> db.create_all(bind='appmeta')
>>> db.drop_all(bind=None)

Ссылки на привязки

Если вы объявляете модель, вы можете указать привязку для нее, используя атрибут __bind_key__:

class User(db.Model):
    __bind_key__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)

Внутри ключ привязки сохраняется в словаре таблици info как 'bind_key'. Это вадно знать, потому что когда вы захотите создать объект таблицы напрямую, вам придется поместить его туда:

user_favorites = db.Table('user_favorites',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('message_id', db.Integer, db.ForeignKey('message.id')),
    info={'bind_key': 'users'}
)

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

Оригинал этой страницы