【问题标题】:Flask-SQLAlchemy update record method doesn't work on database [duplicate]Flask-SQLAlchemy 更新记录方法不适用于数据库[重复]
【发布时间】:2019-05-03 13:14:33
【问题描述】:

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

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__时,显示密码已更新,但未反映到数据库中。这就是为什么当我再次查询记录时,它会显示旧密码。我在这里做错了什么?

【问题讨论】:

  • 谢谢,这解决了我的问题,但失去了 dict.update(kwargs) 的优雅:/

标签: python sql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

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

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

@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()

【讨论】:

    猜你喜欢
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多