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': '[email protected]', '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': '[email protected]', 'username': 'admin', 'reputation': 1, 'password': 'new_password'}
{'id': 1, 'username': 'admin', 'password': '1234', 'email': '[email protected]', 'registration_date': datetime.datetime(2018, 12, 1, 19, 58, 35, 216025), 'reputation': 1}

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

杜尚马加尔

SQLAlchemy 提交对通过 __dict__ 修改的对象的更改表明 using__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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Flask / SQLAlchemy插入数据库

来自分类Dev

Flask-SQLAlchemy 不保存数据库更新

来自分类Dev

陈旧数据 Flask/SqlAlchemy 的问题

来自分类Dev

Flask-SQLAlchemy 会话对象没有看到对数据库的更改?

来自分类Dev

Flask-SQLAlchemy create_all不起作用

来自分类Dev

PUT请求不起作用,Flask-RESTful,SQLAlchemy

来自分类Dev

flask sqlalchemy唯一约束不起作用

来自分类Dev

使用SQLAlchemy在Flask中创建表不起作用

来自分类Dev

Flask-SQLAlchemy create_all不起作用

来自分类Dev

Flask-SQLAlchemy-Backref不起作用,值为None

来自分类Dev

保存到Flask-SQLAlchemy会话之外的数据库

来自分类Dev

从flask-sqlalchemy数据库获取所有模型

来自分类Dev

在Flask中使用SQLAlchemy创建数据库

来自分类Dev

使用flask-sqlalchemy动态链接到数据库

来自分类Dev

Flask SQLAlchemy无法创建记录(DateTimeField)

来自分类Dev

使用Flask和SQLAlchemy在Celery任务中未更新数据库

来自分类Dev

flask_sqlalchemy UPDATE行详细信息不更新mySQL数据库

来自分类Dev

Flask-SQLAlchemy更新整个对象

来自分类Dev

使用 Flask SQLAlchemy 更新特定行

来自分类Dev

如何更新 Flask-SQLAlchemy 关联表?

来自分类Dev

Flask-SQLAlchemy数据类型

来自分类Dev

Flask-SQLAlchemy .like()方法引发NotImplementedError

来自分类Dev

Flask SQLAlchemy自定义方法

来自分类Dev

Flask-SQLAlchemy .like()方法引发NotImplementedError

来自分类Dev

Flask-SQLAlchemy更新一对多记录

来自分类Dev

Flask SQLAlchemy分页错误

来自分类Dev

Flask SQLAlchemy关系

来自分类Dev

Flask-SQLAlchemy TimeoutError

来自分类Dev

Flask/SQLAlchemy Insert Into Database