2017-08-14 18 views
1

私は複数のデータベースを持っています。​​およびDB_UK。彼らはまったく同じ構造を持っていますが、各国のデータを保持しています。私はflask_restfulでapiを持っています。エンドポイントは、この特定の国のデータを取得する国を受け入れます。flask-sqlalchemyで同じモデルの複数のデータベースを使用する

私の問題は、リクエストごとにデータベースを選択する方法を理解できないことです。私はバインドメソッドを読んだが、モデルごとに__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) 
関連する問題