SQLAlchemy filter_by 来自同一列的多个项目

Posted

技术标签:

【中文标题】SQLAlchemy filter_by 来自同一列的多个项目【英文标题】:SQLAlchemy filter_by several item from same column 【发布时间】:2021-12-21 01:08:50 【问题描述】:

DB 中有 2 个表,它们之间的关系通过 Player 表中的 ext 列。

玩家 id/names 超过 1000 个,ExtPlayer 列也有几个。使用filter()filter_by() 在一次或几次查询中将前5 名玩家一起查询其ExtPlayer 数据,避免加载所有ExtPlayer 表。

top = [x.id for x in player_top]列表

我在尝试过程中尝试过类似这些或类似的查询

ext_data = ExtPlayer.query.filter_by(player_id=top).all()

db.session.query(ExtPlayer).filter(
    or_(ExtPlayer.player_id.like(top1),...,
        ExtPlayer.player_id.like(top5))
)

简化模型/表格

lass Player(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    lastseen = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    name = db.Column(db.String(32))
    ext = db.relationship('ExtPlayer', backref='extplayer', cascade="all, delete")


class ExtPlayer(db.Model):
    created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    id = db.Column(db.Integer, primary_key=True)
    trophies = db.Column(db.Integer)
    player_id = db.Column(db.Integer, db.ForeignKey('player.id'))

感谢任何提示。

【问题讨论】:

【参考方案1】:

如果我理解正确,您正在寻找:

ext_data = db.session.query(ExtPlayer).filter(ExtPlayer.player_id.in_(top)).all()

【讨论】:

top 不能直接插入,因为它是一个列表。它返回一个错误sqlalchemy.exc.ArgumentError: Object ExtPlayer('4715', '3785', '912', '229', 'None', '1') is not legal as a SQL literal value

以上是关于SQLAlchemy filter_by 来自同一列的多个项目的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy学习-8.query查找之filter()和filter_by()区别

如何在 sqlalchemy 中使用 filter_by 而不是等于?

flask_sqlalchemy filter 和filter_by的区别

Flask 学习-85.Flask-SQLAlchemy 多个不确定条件查询

Flask 学习-85.Flask-SQLAlchemy 多个不确定条件查询

sqlalchemy使用及序列化