.. _binds: .. currentmodule:: flask_sqlalchemy Работа с несколькими базами данных и 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' } Создание и удаление таблиц ---------------------------- Методы :meth:`~SQLAlchemy.create_all` и :meth:`~SQLAlchemy.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) Ссылки на привязки ------------------ Если вы объявляете модель, вы можете указать привязку для нее, используя атрибут :attr:`~Model.__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__` в ваших моделях вы можете использовать их именно так, как привыкли. Модель подключается к указанной в ней базе данных. `Оригинал этой страницы `_