flask sqlalchemy Multiple joins in one call
时间: 2024-02-24 20:54:05 浏览: 141
在 Flask SQLAlchemy 中,可以通过在查询中使用多个 `join()` 方法来实现多个表的关联查询。下面是一个示例代码:
```python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80), nullable=False)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
user = db.relationship('User', backref=db.backref('posts', lazy=True))
class Comment(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.Text, nullable=False)
post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False)
post = db.relationship('Post', backref=db.backref('comments', lazy=True))
@app.route('/')
def index():
query = db.session.query(Post, Comment, User).\
join(User).\
join(Comment).\
filter(User.username == 'john').\
all()
return str(query)
```
上面的代码中,我们定义了三个模型类 `User`、`Post` 和 `Comment`,并且在 `Post` 模型中定义了一个外键 `user_id`,在 `Comment` 模型中定义了一个外键 `post_id`。我们使用 `db.relationship()` 方法来定义了一个 `user` 属性和一个 `post` 属性,它们分别可以让我们通过 `post.user` 和 `comment.post` 来访问到这个 `Post` 对象所属的 `User` 对象和该评论所属的 `Post` 对象。
在视图函数中,我们使用 `db.session.query()` 方法来创建查询对象,然后使用多个 `join()` 方法来指定要关联的模型,最后使用 `filter()` 方法来添加查询条件。在这个例子中,我们查询所有属于用户名为 "john" 的用户所发表的文章和这些文章所对应的评论,最后关联到这些文章所属的用户。
注意,在使用多个 `join()` 方法时,我们需要注意表之间的关系,即在使用 `join()` 方法时,需要指定关联的属性名和关联的外键。如果关系比较复杂,可以使用 `join()` 方法的另一种语法 `join(User, Post.user_id == User.id).join(Comment, Post.id == Comment.post_id)` 这样的语法来实现。
阅读全文