【问题标题】:SQLAlchemy filter_by several item from same columnSQLAlchemy filter_by 来自同一列的多个项目
【发布时间】: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'))

感谢任何提示。

【问题讨论】:

    标签: python flask sqlalchemy orm


    【解决方案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
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2015-07-05
    • 2019-08-18
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2017-04-02
    相关资源
    最近更新 更多