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

标签 python sql flask sqlalchemy

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

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

我不断收到错误:“AttributeError:‘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))

任何方向将不胜感激!

最佳答案

最可能的原因是 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()

关于python - SQLAlchemy 在循环中生成包含包含的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25712754/

相关文章:

python - Numpy 数组占用太多内存

python - 如何从表格中抓取第二列

mysql - 如何在 PHPMyAdmin 中运行大型 SQL 文件

java - Hibernate 一对多映射 - 根据条件仅获取一个映射记录

python - Flask + Flask_SocketIO = 运行时错误 : Working outside of request context

python - 清理从 Flask MethodView API 启动的长时间运行的子进程

mysql - 返回同一行中的多个项目 (SQL)

python - Flask:在一个应用程序中使用多个包

python - 将变量附加到应用程序与 Flask 中的 current_app 相同吗?

python - 将 os.system 输出重定向到 python 中的文本文件