2013-03-21 19 views
0

我拥有:多个相同的数据库和SQL-Alchemy设置。为多个数据库服务页面

我需要做什么:一个单独的“烧瓶”功能可以查询所有的数据库。所有其他功能只需要访问其中一个数据库。

该数据库已经存在,我正在从中加载数据。

最初我只使用SQL-Alchemy抽象层,没有任何Flask模型。代码如下所示:

app = Flask(__name__) 
app.config.from_object('myflaskapp.config.settings') 
metadata = None 

def connect_db(): 
    engine = create_engine(app.config['DATABASE_URI']) 
    global metadata 
    metadata = MetaData(bind=engine) 
    return engine.connect() 

@app.before_request 
    def before_request(): 
    g.db = connect_db() 

@app.after_request 
    def after_request(response): 
    close_connection() 
    return response 

在settings.py中声明为DATABASE_URI。我想没关系,但是底层的数据库是MySQL服务器和DATABASE_URI样子:

DATABASE_URI = 'mysql://' + dbuser + ':' + dbpass + '@' + dbhost + '/' +dbname 

上面的代码让我写这样的事情:

myTable = Table('branch', metadata, autoload=True) 
myBranch = select([myTable]) 

,会非常方便。这种方法工作得很好,除非我必须处理多个数据库。更确切地说,我想在同一个函数中显示属于多个数据库的数据,这些数据具有完全相同的结构。这意味着相同的查询可以成功地运行任何数据库。在伪代码中:

@app.route('/summary') 
def summary(): 
    .... 
    allData = [] 
    for db in all_of_my_dbs: 
     allData.append(db.query()) 
    .... 
sendToTemplate(allData) 

这是可行的吗?这是否可行? 谢谢。

回答

0

这绝对是possible

尝试添加一些像这样的设置文件

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

编辑

所以这里是工作拷贝/粘贴例如

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
app.debug = True 

databases = { 
    'sqlite1': 'sqlite:///sqlite1.db', 
    'sqlite2': 'sqlite:///sqlite2.db' 
} 
app.config['SQLALCHEMY_BINDS'] = databases 
db = SQLAlchemy(app) 

class Thing(db.Model): 
    __tablename__ = "sqlite1" 
    thing_id = db.Column(db.Integer, primary_key=True) 
    thing_val = db.Column(db.String(40)) 

    def __init__(self, thing_val): 
     self.thing_val = thing_val 

class Thing2(db.Model): 
    __tablename__ = "sqlite2" 
    thing_id = db.Column(db.Integer, primary_key=True) 
    thing_val = db.Column(db.String(40)) 

    def __init__(self, thing_val): 
     self.thing_val = thing_val 


if __name__ == "__main__": 

    db.create_all() 
    t1 = Thing("test1") 
    t2 = Thing2("test2") 

    db.session.add(t1) 
    db.session.add(t2) 
    db.session.commit() 

    t1 = Thing.query.filter_by(thing_id=1).first() 
    t2 = Thing2.query.filter_by(thing_id=1).first() 

    print t1.thing_val 
    print t2.thing_val 
+0

我已经看到了这个链接,因为现在逃离我的原因,我认为它并没有满足我的需求。明天会试一试。感谢你的回答。 – 2013-03-21 19:12:16

+0

看起来像它一样 – 2013-03-22 11:56:49

+0

看起来不是我所需要的。或者至少我不能看到如何将包含在该页面中的提示与我需要的相关联。 – 2013-03-22 11:59:41

0

首先,我想此言一几件事情关于我自己的情况。这两个表具有相同的名称,相同的DDL,但属于不同的模式/数据库。

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 

app = Flask(__name__) 

databases = { 
    'sqlite1': 'sqlite:///sqlite1.db', 
    'sqlite2': 'sqlite:///sqlite2.db' 
} 

app.config['SQLALCHEMY_BINDS'] = databases 
db = SQLAlchemy(app) 

class Thing(db.Model): 
    __tablename__ = "mytable" 
    __bind_key__ = 'sqlite1' 
    thing_id = db.Column(db.Integer, primary_key=True) 
    thing_val = db.Column(db.String(40)) 

    def __init__(self, thing_val): 
     self.thing_val = thing_val 


if __name__ == "__main__": 

    t1 = Thing.query.filter_by(thing_id=1).first() 
    print t1.name 

当我在第一个类定义之后添加第二个名为Thing2的类时,一切都会中断。即:

class Thing(db.Model): 
    __tablename__ = "mytable" 
    __bind_key__ = 'sqlite1' 
    thing_id = db.Column(db.Integer, primary_key=True) 
    thing_val = db.Column(db.String(40)) 

    def __init__(self, thing_val): 
     self.thing_val = thing_val 


class Thing2(db.Model): 
    __tablename__ = "mytable" 
    __bind_key__ = 'sqlite2' 
    thing_id = db.Column(db.Integer, primary_key=True) 
    thing_val = db.Column(db.String(40)) 

    def __init__(self, thing_val): 
     self.thing_val = thing_val 

上面的代码改变了这个错误:

InvalidRequestError:表“MYTABLE”是这个元数据实例已定义。指定'extend_existing = True'来重新定义现有Table对象上的选项和列。

所以框架似乎不能区分它们中的两个。

0

显然这个问题有一个错误 - https://github.com/mitsuhiko/flask-sqlalchemy/pull/222所以问题是绑定键必须是唯一的,只能用于一个类(至少现在),所以你仍然可以有多个数据库,但每个数据库只能有一个表或一类,但它似乎有一个巨大的开销,如果你许多表还是这仅仅是一个解决办法,至少现在...

这里是“绑定”的提法 - http://flask-sqlalchemy.pocoo.org/2.0/binds/#binds

下面是配置:

SQLALCHEMY_DATABASE_URI ='sqlite:///// main .db的”

SQLALCHEMY_BINDS = { '表1': '源码://///DB1.db', '表2': '源码://///DB2.db', }

和下面是该模型:

类表1(db.Model):

__tablename__ = "table1" 
__bind_key__='table1' 

类表2(db.Model):

__tablename__ = "table2" 
__bind_key__='table2' 
相关问题