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 多个不确定条件查询