sql alchemy列值依赖于其他表

时间:2015-12-27 22:42:48

标签: sqlalchemy

如果有一个包含列的表,我希望在另一个表列中获取列'id'的出现次数?

因此,如果每个玩家都有一个桌面“玩家”,并列出了每个进球得分的表'目标',那么每当他们得分的目标被添加到目标表时,就会有一种简单的方法来自动更新玩家列?

另一个例子是'团队'和'玩家'表,每当玩家添加player.team_name == team.name或类似的东西时,表会更新team.number_of_players。

使用JSON作为一种方式为每个用户保留{'username': True}或类似的东西是值得的吗?

1 个答案:

答案 0 :(得分:1)

您有多种方法可以实现您的想法:

  1. 最简单的方法:您可以使用更新查询更新列,如下所示:

        try:
            player = Player(name='New_player_name', team_id=3)
            Session.add(player)
            Session.flush()
            Session.query(Team).filter(Team.id == Player.team_id).update({Team.players_number: Team.players_number + 1})
            Session.commit()
        except SQLAlchemyError:
            Session.rollback()
            # error processing
    
  2. 您可以实现sql-trigger。但是对于不同的DBMS,实现是不同的。因此,您可以在DBMS的文档中阅读它。

  3. 您可以实现SQLAlchemy触发器,如下所示:

  4. 
        from sqlalchemy import event
    
        class Team(Base):
            ...
    
    
        class Player(Base):
           ...
    
            @staticmethod
            def increment_players_number(mapper, connection, player):
                try:
                    Session.query(Team).filter(Team.id == player.team_id)\
                             .update({Team.players_number: Team.players_number + 1})
                except SQLAlchemyError:
                    Session.rollback()
                    # error processing
    
        event.listen(Player, 'after_insert', Player.increment_players_number)
    
    
    1. 如您所见,总有两个查询,因为您应该执行两个过程:insert和update。我认为(但我不确定)某些DBMS可以处理这样的查询:
    2. 
          UPDATE table1 SET column = column + 1 WHERE id = SOMEID AND (INSERT INTO table2 values (VALUES))