Python 在炼金术中使用同一模型的多个数据库

Python 在炼金术中使用同一模型的多个数据库,python,mysql,flask,flask-sqlalchemy,flask-restful,Python,Mysql,Flask,Flask Sqlalchemy,Flask Restful,所以我有多个数据库DB_US和DB_UK。它们有着完全相同的结构,但它们保存着不同国家的数据。我有一个带restful的api。端点接受国家以检索此特定国家的数据 我的问题是我不知道如何根据请求选择数据库。我已经阅读了bind方法,但是您必须为每个模型指定一个\u bind\u键,并且我的所有模型都在这两个数据库中 我已尝试在@before\u request中初始化数据库,但在处理第一个请求后,您不能调用init\u db方法(或任何设置方法) 这是一种特殊情况,因为数据库是相同的,所以将它放

所以我有多个数据库
DB_US
DB_UK
。它们有着完全相同的结构,但它们保存着不同国家的数据。我有一个带restful的api。端点接受国家以检索此特定国家的数据

我的问题是我不知道如何根据请求选择数据库。我已经阅读了bind方法,但是您必须为每个模型指定一个
\u bind\u键
,并且我的所有模型都在这两个数据库中

我已尝试在
@before\u request
中初始化数据库,但在处理第一个请求后,您不能调用
init\u db
方法(或任何设置方法)

这是一种特殊情况,因为数据库是相同的,所以将它放在同一个数据库中似乎是有意义的,但它是更大系统的一部分,需要这样做


如何根据每个请求选择数据库?

也许您可以定义一些基本数据模型,并为单独的数据库继承它们。例如:

class User(db.Model):

    __abstract__ = 1

    # fields define

class UserUK(User):

    __bind_key__ = 'uk'

class UserUS(User):

    __bind_key__ = 'us'
您可以创建一个dict,它是
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)
导入时间
从烧瓶进口烧瓶
从flask_sqlalchemy导入sqlalchemy
app=烧瓶(名称)
app.config[“SQLALCHEMY_数据库_URI”]=”sqlite:////path/2/default.db"
app.config[“SQLALCHEMY_绑定”]={“uk”:sqlite:////path/2/uk.db“,“美国”:”sqlite:////path/2/us.db"}
db=SQLAlchemy(应用程序)
类UserBase(db.Model):
__摘要=1
id=db.Column(db.Integer,主键=1)
username=db.Column(db.String(16))
类UserUK(UserBase):
__绑定密钥=“英国”
类UserUS(UserBase):
__绑定密钥
models={“uk”:{“User”:UserUK},“us”:{“User”:UserUS}
@附件路线(“/”)
def指数(国家):
user=models[country][“user”](用户名=country+str(time.time()))
db.session.add(用户)
db.session.commit()
返回国,“补充”
如果名称=“\uuuuu main\uuuuuuuu”:
运行(调试=1)

我也有同样的问题。我已经在这里描述过了

您的案例稍微容易一些,因为您不必处理模式差异。 你可以按照stamaimer的建议去做,但问题是要为每个国家创建新的用户模型(如果你有两个以上的用户模型,就会变得一团糟)

为了修复它,我停止使用flask sqlAlchemy db实例化方法,并让内容提供者init方法处理要选择的db:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

Session = sessionmaker()

class ContentProvider():

    db = None
    connection = None
    session = None

    def __init__(self, center):
        if center == UK:
            self.db = create_engine('sqlite://UK', echo=True, pool_threadlocal=True)
            self.connection = self.db.connect()
        elif center == US:
            self.db = create_engine('sqlite://US', echo=True, pool_threadlocal=True)
            self.connection = self.db.connect()
        self.session = Session(bind=self.connection)

    def index(country):
        user = models[country]["User"](username=country + str(time.time()))
        self.session.add(user)
        self.session.commit()
        return country, "added"