2017-08-14 48 views
1

所以我有多個數據庫。​​和DB_UK。他們有完全相同的結構,但他們擁有不同國家的數據。我有一個與flask_restful api。端點接受國家檢索該特定國家的數據。在flask-sqlalchemy中使用同一模型的多個數據庫

我的問題是我無法弄清楚如何選擇每個請求的數據庫。我已經閱讀了bind方法,但是您必須爲每個模型指定一個__bind_key,並且我的所有模型都在兩個數據庫中。

我試圖初始化@before_request內的數據庫,但在處理第一個請求後,您不能調用init_db方法(或任何設置方法)。

這是一個特殊情況,因爲數據庫是相同的,所以它似乎有意義將它放在同一個數據庫中,但它是更大系統的一部分,需要這樣做。

如何根據請求選擇數據庫?

回答

0

也許你可以定義一些基礎數據模型,並將它們繼承爲單獨的數據庫。例如:

class User(db.Model): 

    __abstract__ = 1 

    # fields define 

class UserUK(User): 

    __bind_key__ = 'uk' 

class UserUS(User): 

    __bind_key__ = 'us' 

您可以創建一個字典是model = {"uk": {"User": UserUK}, "us": {"User": UserUS}}從要求選擇由國家合適的型號。例如:model[country]["User"]

完整演示:

import time 
from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 

app = Flask(__name__) 

app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:////path/2/default.db" 
app.config["SQLALCHEMY_BINDS"] = {"uk": "sqlite:////path/2/uk.db", "us": "sqlite:////path/2/us.db"} 

db = SQLAlchemy(app) 


class UserBase(db.Model): 

    __abstract__ = 1 

    id = db.Column(db.Integer, primary_key=1) 

    username = db.Column(db.String(16)) 


class UserUK(UserBase): 

    __bind_key__ = "uk" 


class UserUS(UserBase): 

    __bind_key__ = "us" 


models = {"uk": {"User": UserUK}, "us": {"User": UserUS}} 


@app.route("/<country>") 
def index(country): 

    user = models[country]["User"](username=country + str(time.time())) 

    db.session.add(user) 

    db.session.commit() 

    return country, "added" 


if __name__ == "__main__": 

    app.run(debug=1) 
相關問題