小编use*_*527的帖子

SQLAlchemy提交对通过__dict__修改的对象的更改

我正在开发一款多人游戏.当我使用库存中的对象时,它应该使用对象属性的值更新用户生物的统计数据.

这是我的代码:

try:
    obj = self._get_obj_by_id(self.query['ObjectID']).first()

    # Get user's current creature
    cur_creature = self.user.get_current_creature()

    # Applying object attributes to user attributes
    for attribute in obj.attributes:
        cur_creature.__dict__[str(attribute.Name)] += attribute.Value

    dbObjs.session.commit()
except (KeyError, AttributeError) as err:
    self.query_failed(err)
Run Code Online (Sandbox Code Playgroud)

现在,由于某种原因,这并没有正确提交,所以我尝试了:

cur_creature.Health  = 100
logging.warning(cur_creature.Health)
dbObjs.session.commit()
Run Code Online (Sandbox Code Playgroud)

哪个有效,但不是很方便(因为我需要一个大的if语句来更新该生物的不同统计数据)

所以我尝试过:

cur_creature.__dict__['Health'] = 100
logging.warning(cur_creature.Health)
dbObjs.session.commit()
Run Code Online (Sandbox Code Playgroud)

我进入100日志,但没有变化,所以我试过:

cur_creature.__dict__['Health'] = 100
cur_creature.Health  = cur_creature.__dict__['Health']
logging.warning(cur_creature.Health)
dbObjs.session.commit()
Run Code Online (Sandbox Code Playgroud)

日志中仍为'100',但没有变化,所以我试过:

cur_creature.__dict__['Health'] = 100
cur_creature.Health  = 100
logging.warning(cur_creature.Health)
dbObjs.session.commit()
Run Code Online (Sandbox Code Playgroud)

其中仍然在日志中写入100,但不提交对数据库的更改.现在,这很奇怪,因为它只有不同的工作版本,因为它有这条线在顶部:

cur_creature.__dict__['Health'] = 100
Run Code Online (Sandbox Code Playgroud)

简介:如果我直接修改属性,则提交工作正常.相反,如果我通过类'字典​​修改属性,那么,无论我之后如何修改它,它都不会提交对数据库的更改.

有任何想法吗?

提前致谢

更新1:

此外,这会更新db中的Health,但不会更新Hunger:

cur_creature.__dict__['Hunger'] = …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy commit

8
推荐指数
1
解决办法
2271
查看次数

标签 统计

commit ×1

python ×1

sqlalchemy ×1