Расширение для поддержки SQLAlchemy в Flask
Начиная с 0.12 Flask-SQLAlchemy может легко подключаться к нескольким базам данных. Чтобы добиться этого, он предварительно настраивает SQLAlchemy для поддержки нескольких «привязки».
Что такое привязки? В 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()
по умолчанию работают со всеми объявленными связями, включая заданные по
умолчанию. Это поведение можно настроить, указав параметр связывания. Требуется либо одно имя привязки, __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)
Внутри ключ привязки хранится в информационном словаре таблицы как 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__
на своих моделях, вы можете использовать их точно так как обычно. Модель подключается к
указанному соединению с базой данных.