我有資料庫foobar_pt,foobar_br,foobar_mx等等,它們都具有相同的模型。
另一方面,我使用(相同)模型創建了一個藍圖,我想做如下事情:
class Product(db.Model):
__tablename__ = 'product'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(10), nullable=False)
api = Blueprint('api', __name__)
@api.route('/products')
def product_get():
...
result = Product.all()
...
return jsonify(result)
這是問題所在:
# this blueprint should use the foobar_pt DB
app.register_blueprint(api, url_prefix='/pt')
# this blueprint should use the foobar_br DB
app.register_blueprint(api, url_prefix='/br')
# this blueprint should use the foobar_mx DB
app.register_blueprint(api, url_prefix='/mx')
...
[more countries]
這個想法是有一個 API,如:
# get the products from PT
https://www.example.com/pt/products
# get the products from BR
https://www.example.com/br/products
# get the products from MX
https://www.example.com/mx/products
...
[more countries]
模型完全一樣,唯一改變的是資料庫名稱
有沒有辦法做到這一點?
uj5u.com熱心網友回復:
您可以嘗試使用SQLALCHEMY_BINDS create_scoped_session()。下面是一個例子:
from flask import Flask, Blueprint, jsonify, request, g
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
DB1 = 'br'
DB2 = 'mx'
app = Flask(__name__)
api = Api(app)
app.config['SQLALCHEMY_BINDS'] = {
DB1: 'sqlite:////tmp/br.db',
DB2: 'sqlite:////tmp/mx.db',
}
db = SQLAlchemy(app)
class Product(db.Model):
__tablename__ = 'product'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(10), nullable=False)
def get_session(name: str):
return db.create_scoped_session(
options=dict(bind=db.get_engine(app, name),
binds={}))
# prepare structure & data in different db
for name_ in [DB1, DB2]:
session_ = get_session(name_)
db.Model.metadata.create_all(session_.bind.engine)
for i in range(10):
session_.add(Product(name='{}-{}'.format(name_, i)))
session_.commit()
# register all routes for each db...
for name_ in app.config['SQLALCHEMY_BINDS'].keys():
bp = Blueprint(name_, __name__, url_prefix='/' name_)
@bp.before_request
def before_request():
# select session by blueprint name(connection name)
g.session = get_session(request.blueprint)
@bp.route('/products')
def products():
session = g.session
return jsonify({
'db': session.bind.engine.url.database,
'products': [r.name for r in session.query(Product).all()],
})
app.register_blueprint(bp)
運行服務器。打開/mx/products和/br/products
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372056.html
標籤:Python 烧瓶 sqlalchemy 烧瓶-sqlalchemy
