【问题标题】:Searching for posts with tags using Flask-SQLAlchemy使用 Flask-SQLAlchemy 搜索带有标签的帖子
【发布时间】:2020-12-27 00:53:03
【问题描述】:

我正在使用 Flask-SQLAlchemy 开发一个 API。我有一个包含帖子、标签和它们之间的多对多映射的数据库。我想在搜索中查找至少有一个匹配标签的帖子。例如,搜索标签“A”、“B”和“C”应返回以“A”或“B”或“C”作为标签的帖子。

我大致遵循Charles Leifer's example 在使用多对多关系时查询多个标签。但是,我当前的查询根本不返回任何行:

@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
    )

【问题讨论】:

    标签: python sql flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    在我看来这是您的in 支票的问题。您目前拥有:

    Tag.tag in tags
    

    在 Python 中将首先评估为布尔值。这将始终是False,因为Tag.tag 不是字符串,因此永远不能“在标签中”。这会在您的 SQL 查询中有效地生成 WHERE 0 = 1(可能因数据库而异)。

    您需要使用the "SQL-in",将其重写为:

    Tag.tag.in_(tags)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多