【问题标题】:AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated withAttributeError:“InstrumentedAttribute”对象和“比较器”对象都没有关联
【发布时间】:2017-01-04 16:55:07
【问题描述】:

我有一个表定义为

class Results(db.Model):
    __tablename__ = 'results'
    event_id = db.Column(db.Integer, db.ForeignKey(Events.id), primary_key=True)
    event = db.relationship('Events', foreign_keys='Results.event_id')
    team_id = db.Column(db.Integer, db.ForeignKey(Teams.id), primary_key=True)
    team = db.relationship('Teams', foreign_keys='Results.team_id')
    position = db.Column(db.Integer, default=0)
    rr_position = db.Column(db.Integer, default=0)
    score = db.Column(db.Float, default=0)

class Teams(db.Model):
    __tablename__ = 'teams'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False)
    country = db.Column(db.String(64), nullable=False)

当我运行以下内容时

r = Results.query.all()
print(len(r))

我得到 138 行。

如果我跑步

r =  db.session.query(Teams.name
    , Results.team_id
    , Results.event_id).all()
print(len(r))

r = Results.query.add_column(Teams.name).all()
print(len(r))

然后我得到 6072 行。使用此查询,我期望有 138 行和一个团队名称。

但如果我尝试

r ==  db.session.query(Results.team.name
    , Results.team_id
    , Results.event_id).all()

我收到以下错误

AttributeError:与 Results.team 关​​联的“InstrumentedAttribute”对象和“Comparator”对象都没有属性“name”

【问题讨论】:

    标签: flask sqlalchemy foreign-keys


    【解决方案1】:

    您是否尝试在执行查询时明确指定连接?

    例如:

    db.session.query(Results.team_id, Results.event_id, Team.name).join(Team).all()
    

    我假设在返回 > 6000 个条目的情况下,您将得到笛卡尔结果。

    【讨论】:

    • 谢谢,这行得通。什么情况下可以使用关系,什么时候不能使用?
    • 如果您希望基于字段的两个表之间的交集,您将需要显式指定连接。在这种情况下,您正在寻找内连接。
    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2021-07-03
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多