当前位置: 首页 > 知识库问答 >
问题:

SQLAlchemy使用contains在循环中生成查询

蓝恩
2023-03-14

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

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

我一直得到的错误:"属性错误:'Unicode'对象没有属性'_sa_instance_state'"。以下是模型的样子:


class Team(db.Model):                                                            
    __tablename__ = 'teams'                                                      

    id = db.Column(db.Integer, primary_key=True)                                 
    users = association_proxy("user_associations", "user", creator=lambda u: Teaming(user=u))

    def __repr__(self):                                                          
        s = ""                                                                   
        for u in self.users:                                                     
            s = s + u.username + ", "                                            

        return "Team {tid}: {users_string}".format(tid = self.id, users_string=s)

class Teaming(db.Model):                                                         
    __tablename__ = 'teaming'                                                    

    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("User", backref="team_associations")                  
    team = db.relationship("Team", backref="user_associations")                  

    def __repr__(self):                                                          
        return "".format(uid = self.user_id, tid = self.team_id)

class User(UserMixin, db.Model):                                                 
    __tablename__ = 'users'                                                      

    id = db.Column(db.Integer, primary_key=True)                                 

    email = db.Column(db.String(64), unique=True, index=True)                    
    username = db.Column(db.String(64), unique=True, index=True)                 
    password_hash = db.Column(db.String(128))                                    
    confirmed = db.Column(db.Boolean, default=False)                             

    teams = association_proxy("team_associations", "team", creator = lambda t: Teaming(team=t))

任何方向都将不胜感激!

共有1个答案

隗昀
2023-03-14

最可能的原因是playerlist不是User实例的列表,而是一些字符串(可能是名称)<代码>包含仅适用于模型实例。如果要使用其他属性,请使用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()
 类似资料:
  • 我不是只想用第一个数字来完成这个操作,而是使用while循环和if条件,使我在键盘上输入的任何内容都变成一个整数。 你觉得问题出在哪里?请帮帮我.

  • 问题内容: 有没有一种方法可以使SQLAlchemy使用自定义列生成查询,该自定义列是与当前行相关的子查询: 使用ORM API? 我正在使用PostgreSQL 9.3和旧版本的SQLAlchemy 0.9.8 问题答案: 如果您经常需要这样做,并且/或者计数是模型不可或缺的一部分,则应该使用混合属性,如其他答案中所述。另一方面,如果只需要一个查询就可以使用,则可以使用或创建标量子查询: 子查询

  • 我知道这在没有生成器的情况下是非常容易归档的,但是我想更好地理解生成器。因此,请不要建议使用其他东西。 我有一个类可以为屏幕截图生成文件名(selenium): 现在我的问题是:除了Foreach循环之外,我可以在任何其他上下文中使用这样的生成器吗?例如。 对我来说,这总是返回null,如果我调试,它永远不会进入生成器方法。PHP文档也没有真正提到这一点。 所以我的问题是:有没有一种记录在案的方法

  • 我知道这在没有生成器的情况下是非常容易归档的,但是我想更好地理解生成器。因此,请不要建议使用其他东西。 我有一个类可以为屏幕截图生成文件名(selenium): 现在我的问题是:除了Foreach循环之外,我可以在任何其他上下文中使用这样的生成器吗?例如。 对我来说,这总是返回null,如果我调试,它永远不会进入生成器方法。PHP文档也没有真正提到这一点。 所以我的问题是:有没有一种文档化的方法可

  • 我一直在做一些实践技术面试问题,这个问题很容易,但是我想知道我的两个解决方案中更有效的是否真的如此。 我现在看到这里的其他人以前问过这个问题,但我的问题有代码片段,我觉得它可能会为其他正在寻找解决方案的人提供进一步的见解。 问题是:给定一个整数数组和一些数字k,创建一个函数,如果数组中的任意两个数字与k相加,则返回true。 以下是我的“慢”解决方案: 还有我的“快速”解决方案: 我遇到的问题是A

  • 问题内容: 我有一个查询,该查询将需要连续运行28000次,因此我认为使用prepareStatement可能是一个聪明的主意。 这是我的查询: 一切工作都很好,直到我们意识到模糊方法对像“皮卡丘是我的英雄”之类的分裂单词效果不佳,建议在这种情况下创建4个模糊搜索“皮卡丘”,“是”,“我”,“英雄’。不知道这是否是正确的,但是由于我将运行查询28 000次,因此这是一个很好的机会来查看它的运行情况