用Binds操作多个数据库

引入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__,你可以用它们准确地做你想要的。模型会自行连 接到指定的数据库连接。

你可能感兴趣的:(用Binds操作多个数据库)