引入binds的目的是让Flask-SQLAlchemy支持多个数据库。
什么是binds
在SQLAlchemy中,一个binds是可以执行SQL语句,且通常是一个连接或引擎的东西。在Flask-SQLAlchemy中,bind总是背后自动为你创建好引擎。每一个引擎中都会关联一个键(bind key)。这个键会在模型声明时使用来把一个模型关联到一个特定引擎。
如果没有为模型指定bind key,会默认连接(即SQLALCHEMY_DATABASE_URI配置的值)
示例配置:
下面的配置声明了三个数据库连接:默认连接(SQLALCHEMY_DATABASE_URI)和另外两个分别名为users和appmeta。
SQLALCHEMY_DATABASE_URI='postgres://localhost/main'
SQLALCHEMY_BINDS={
'users':'mysqldb://localhost/users',
'appmeta':'sqlite:////path/to/appmeta.db'
}
创建表和删除表:
create_all()和drop_all()方法的原型为:
create_all(bind='__all__',app=None)
drop_all(bind='__all__',app=None)
create_all()和drop_all()方法默认作用于声明的所有bind,包括默认的。这个行为可以通过提供bind参数来制定。它可以是单个bind名。'__all__'指向所有binds或一个bind名的列表。默认的bind(即SQLALCHEMY_DATABASE_URI)名为None:
>>>db.create_all()
>>>db.create_all(bind=['users'])
>>>db.create_all(bind='appmeta')
>>>bd.drop_all(bind=None)
引用Binds:
当你声明模型时,你可以使用__bind_key__属性指定bind:
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内部存储在表的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__,你可以用它们准确地做你想要的。模型会自行连 接到指定的数据库连接。