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"