- 61
- 0
背景
用Flask实现一个REST微服务,多个结构相同的MySQL数据库对应着同一个Model。需要根据请求,在不同的数据库中作查询并返回结果。
已完成的工作
根据官方文档配置了SQLALCHEMY_BINDS,如:
SQLALCHEMY_BINDS = {
'db01': 'mysql://...',
'db02': 'mysql://...',
'db03': 'mysql://...'
}
查询时根据请求中包含的数据库名称字段动态查询:
...
engine = db.get_engine(bind=db_name) #绑定数据库
DBSession = sessionmaker(bind=engine)
db_session = DBSession()
result = db_session.query(db_model).filter(...).all()
db_session.close()
...
问题
现在不单单要提供RESTful API,还要做一个将查询结果分页展示的前端页面,查阅资料可以用flask-sqlalchemy支持的paginate()来做。然而问题来了,我上面这样调用db_session.query()得到的Query对象是flask-sqlalchemy的Query父类,不支持paginate()方法。想要调用paginate()应该是:
result = db_model.query.filter_by(...).paginate()
而Model默认的bind应该来自app.config中的SQLALCHEMY_DATABASE_URI,我这里为None必然导致抛出异常。这样一来,engine/bind的初始化又该在哪里做?而要动态地改变db_model的bind,又该如何实现呢?
- 共 0 条
- 全部回答
-
ソ记忆扯散流年 普通会员 1楼
在Flask-SQLAlchemy中,你可以使用
relationship属性来动态绑定模型。以下是一个简单的例子:```python from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), unique=True) email = db.Column(db.String(120), unique=True)
class Category(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80))
class Product(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80)) category_id = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False) ```
在这个例子中,我们定义了三个模型:User,Category和Product。每个模型都有一个ID,一个名字和一个电子邮件字段。
然后,在我们的Flask应用中,我们可以在视图函数中使用
relationship属性来动态绑定模型。例如,我们可以显示所有用户:```python from flask import Flask, render_template, request
app = Flask(name)
@app.route('/') def index(): users = User.query.all() return render_template('index.html', users=users)
@app.route('/add', methods=['POST']) def add(): name = request.form['name'] email = request.form['email'] user = User(name=name, email=email) db.session.add(user) db.session.commit() return redirect('/') ```
在这个例子中,我们首先获取所有用户,然后在POST请求中添加一个新的用户。
relationship属性使我们可以动态地将模型的引用添加到视图函数中,这使得我们可以方便地在视图函数中使用这些模型。注意,
relationship属性的值应该是模型的引用,而不是模型的实例。这是因为当我们动态地添加一个新的用户时,我们实际上是在操作模型的引用,而不是模型的实例。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
