2013-03-21 66 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' 
相關問題