Flask-SQLAlchemy更新记录方法不适用于数据库

时间:2018-12-01 17:52:07

标签: python sql flask sqlalchemy flask-sqlalchemy

我正在尝试归纳用户表的更新方法。例如;我希望能够将更新的列作为关键字参数传递。这些是模块的相关部分。

update_user()通过用户名查找用户,并通过更新__dict__属性来更新其字段。

class UserModel(db.Model):

    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(80), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    reputation = db.Column(db.Integer, nullable=False)
    registration_date = db.Column(db.DateTime(), nullable=False)

    @staticmethod
    def update_user(_username, **kwargs):
        user = UserModel.query.filter_by(username=_username).first()
        print(kwargs)
        user.__dict__.update(kwargs)
        print(user.__dict__)
        db.session.commit()

假设我要更改管理员密码...

print(UserModel.get_user('admin'))
UserModel.update_user('admin', password='new_password')
print(UserModel.get_user('admin'))

输出看起来像这样...

{'id': 1, 'username': 'admin', 'password': '1234', 'email': 'asd@qwe.com', 'registration_date': datetime.datetime(2018, 12, 1, 19, 58, 35, 216025), 'reputation': 1}
{'password': 'new_password'}
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x000001FEE907F128>, 'id': 1, 'registration_date': datetime.datetime(2018, 12, 1, 19, 58, 35, 216025), 'email': 'asd@qwe.com', 'username': 'admin', 'reputation': 1, 'password': 'new_password'}
{'id': 1, 'username': 'admin', 'password': '1234', 'email': 'asd@qwe.com', 'registration_date': datetime.datetime(2018, 12, 1, 19, 58, 35, 216025), 'reputation': 1}

当我打印user.__dict__时,它表明密码已更新,但未反映到数据库中。这就是为什么当我再次查询记录时,它会显示旧密码。我在这里做什么错了?

1 个答案:

答案 0 :(得分:2)

SQLAlchemy commit changes to object modified through __dict__建议使用__dict__并不是进行更新的好方法。

您可以通过迭代dict.update来模拟kwargs

@staticmethod
def update_user(_username, **kwargs):
    user = UserModel.query.filter_by(username=_username).first()
    print(kwargs)

    for key, value in kwargs.items():  # `kwargs.iteritems()` in Python 2
        setattr(user, key, value) 

    print(user.__dict__)
    db.session.commit()