在sqlalchemy脚本中缩进db.commit()

时间:2014-07-27 06:04:49

标签: python sqlite flask sqlalchemy flask-sqlalchemy

我知道这应该是一个基本问题,但由于某些原因,它对我没有意义。我不明白为什么第db.session.commit()行不在for语句for r in roles:下缩进?相反,它在函数定义def insert_roles():下缩进,这对我来说没有意义,因为除了分配dict键和值之外,for语句除外没有任何事情发生。我将在下面发布整个代码以及本书的内容。在此先感谢您的帮助。 。

class Permission:
    FOLLOW = 0x01
    COMMENT = 0x02
    WRITE_ARTICLES = 0x04
    MODERATE_COMMENTS = 0x08
    ADMINISTER = 0x80


class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    default = db.Column(db.Boolean, default=False, index=True)
    permissions = db.Column(db.Integer)
    users = db.relationship('User', backref='role', lazy='dynamic')

    @staticmethod
    def insert_roles():
        roles = {
            'User': (Permission.FOLLOW |
                     Permission.COMMENT |
                     Permission.WRITE_ARTICLES, True),
            'Moderator': (Permission.FOLLOW |
                          Permission.COMMENT |
                          Permission.WRITE_ARTICLES |
                          Permission.MODERATE_COMMENTS, False),
            'Administrator': (0xff, False)
        }
        for r in roles:
            role = Role.query.filter_by(name=r).first()
            if role is None:
                role = Role(name=r)
            role.permissions = roles[r][0]
            role.default = roles[r][1]
            db.session.add(role)
        db.session.commit()

    def __repr__(self):
        return '<Role %r>' % self.name

从书中可以看出:

  

insert_roles()函数不直接创建新的角色对象。相反,它尝试   按名称查找现有角色并更新它们。仅为此创建新角色对象   已经不在数据库中的角色名称。这样做是为了使角色列表可以   在需要进行更改时将来更新。添加新角色或更改   角色的权限分配,更改角色数组并重新运行该功能。注意   “Anonymous”角色不需要像数据库那样在数据库中表示   旨在表示不在数据库中的用户。

1 个答案:

答案 0 :(得分:0)

db.session.commit()缩进的原因是它需要在循环完成后运行 - 将每个角色添加到db会话中。这是将信息“永久写入”数据库的命令 - add()函数将数据存储在临时内存中,但commit()实际将其提交到磁盘。写入内存是一个相当便宜的操作,提交到磁盘更昂贵,所以你想要保存该步骤直到结束。这有意义吗?