我正在使用Flask-SQLAlchemy开发API。我有一个数据库,其中包含帖子,标签以及它们之间的多对多映射。我想查找在搜索中至少具有一个匹配标签的帖子。例如,搜索标签“ A”,“ B”和“ C”应返回以“ A”或“ B”或“ C”作为标签的帖子。
我大致遵循Charles Leifer在使用多对多关系时查询多个标签的示例。但是,我当前的查询根本不返回任何行:
@app.route('/api/posts/search', methods=['GET'])
def search_posts():
tags = json.loads(request.data['tags'])
posts = db.session.query(Post).join(TagMap).join(Tag).filter(Tag.tag in tags).group_by(Post.id).all()
return jsonify(posts)
我已经确认标签正确地以字符串列表的形式进入数据库,并且我有帖子,标签以及它们之间的映射正确存储在数据库中。
如有必要,我的模型如下:
@dataclass
class Post(db.Model):
__tablename__ = 'post'
id:int
text:str
created:str
op:bool
id = db.Column(
db.Integer,
primary_key=True
)
text = db.Column(
db.String(2000),
index=False,
nullable=False
)
@dataclass
class Tag(db.Model):
__tablename__ = 'tag'
id:int
tag:str
id = db.Column(
db.Integer,
primary_key=True
)
tag = db.Column(
db.String(32),
index=False,
nullable=False,
unique=True
)
@dataclass
class TagMap(db.Model):
__tablename__ = 'tagmap'
post_id:int
tag_id:int
id = db.Column(
db.Integer,
primary_key=True
)
post_id = db.Column(
db.ForeignKey('post.id'),
index=False,
nullable=False
)
tag_id = db.Column(
db.ForeignKey('tag.id'),
index=False,
nullable=False
)
在我看来,这是您的in
支票问题。您目前有:
Tag.tag in tags
首先将在Python中将其评估为布尔值。这将始终是False
因为Tag.tag
不是字符串,因此永远都不能在“标记中”。这将WHERE 0 = 1
在您的SQL查询中有效地生成一个(可能因数据库而异)。
您需要通过将“ SQL-in”重写为:
Tag.tag.in_(tags)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句