SQLAlchemy 在包含的循环中生成查询

Posted

技术标签:

【中文标题】SQLAlchemy 在包含的循环中生成查询【英文标题】:SQLAlchemy generating query in loop with contains 【发布时间】:2014-10-31 23:50:53 【问题描述】:

我正在 Flask 中构建一个涉及一些 SQLAlchemy 的 Web 应用程序。我有一个函数“get_team()”让我发疯。

def get_team(玩家列表) cond = and_(*[Team.users.contains(p) for p in playerlist ]) q = Team.query.filter(cond) ...

我不断收到错误消息:“AttributeError: 'unicode' object has no attribute '_sa_instance_state'”。模型如下所示:

班级团队(db.Model): __tablename__ = '团队' id = db.Column(db.Integer, primary_key=True) users = association_proxy("user_associations", "user", creator=lambda u: Teaming(user=u)) def __repr__(self): s = "" 为你在 self.users 中: s = s + u.username + ", " return "团队 tid: users_string".format(tid = self.id, users_string=s) 班组(db.Model): __tablename__ = '合作' team_id = db.Column(db.Integer, db.ForeignKey('teams.id'), primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True) user = db.relationship("用户", backref="team_associations") team = db.relationship("团队", backref="user_associations") def __repr__(self): return "".format(uid = self.user_id, tid = self.team_id) 类用户(UserMixin,db.Model): __tablename__ = '用户' id = db.Column(db.Integer, primary_key=True) 电子邮件 = db.Column(db.String(64),唯一 = True,索引 = True) 用户名 = db.Column(db.String(64),唯一 = True,索引 = True) password_hash = db.Column(db.String(128)) 确认 = db.Column(db.Boolean, default=False) 团队 = 关联代理(“团队关联”,“团队”,创建者 = lambda t:团队(团队 = t))

任何方向将不胜感激!

【问题讨论】:

【参考方案1】:

最可能的原因是playerlist 不是User 实例的列表,而是一些字符串(可能是名称)。 contains 仅适用于模型实例。如果您想使用其他属性,请使用any

def get_team_of_players(playerlist):
    cond = and_(*[Team.users.contains(p) for p in playerlist])
    q = Team.query.filter(cond)
    return q

p1, p2 = db.session.query(User).get(1), db.session.query(User).get(2)
q = get_team_of_players([p1, p2]).all()


def get_team_of_usernames(usernames):
    cond = and_(*[Team.users.any(User.username == p) for p in usernames])
    q = Team.query.filter(cond)
    return q

p1, p2 = 'user1', 'user2'
q = get_team_of_usernames([p1, p2]).all()

【讨论】:

以上是关于SQLAlchemy 在包含的循环中生成查询的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy-ORM

在 Flask-SQLAlchemy 中联表查询

在 SQLAlchemy 中查询 SQL Server JSON

需要帮助构建 SQLAlchemy 查询 + 子查询

如何在 Sqlalchemy 中正确使用 SQL 连接/子查询

如何在 SQLAlchemy 中漂亮地格式化 SQL 查询的打印?