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

flask_sqlalchemy UPDATE row details not updating mySQL database

我有一个烧瓶应用程序和一个连接到它的 mySQL 数据库。我正在使用 POSTMAN 向烧瓶端点发送 GET/POST 请求以进行用户添加、更新和删除。我能够成功地将用户添加到数据库中,但是当我更新 flask 应用程序时不会抛出任何错误,因为邮递员也显示成功的 JSON 响应 "User updated!!!" 但是当我执行 SELECT * FROM Users 在我的操作中 SQL Workbench 详细信息未更新。

我的实现如下—— 我创建了一个包含两列 usernamepassword.

的模型 User

用户更新 API 看起来像 -

from flask_restful import Resource
from flask_sqlalchemy import SQLAlchemy
from model import User


class Update_User(Resource):
    def post(self):
        data = request.get_json(force=True)
        usr = User.query.filter_by(username=data['username']).first()
        print(1, usr.username, usr.password)
        
        usr.password = data['new_password']
        print(2, usr.username, usr.password)

        db.session.commit()
        db.session.close()

        return {"res": "User updated!!!!"}

烧瓶输出:

1 Ash 12345
2 Ash 00000

只是为了更好地理解,用什么比较好? Python SQL炼金术还是烧瓶自己的SQL炼金术?因为在其他情况下我也遇到了麻烦,比如使用 add_all()

同时更新两行

您需要将对象添加到会话中以告诉 SQLAlchemy 您想要进行更改(更新之后,提交之前):

usr.password = data['new_password']
db.session.add(usr)
db.session.commit()

在 SQLAlchemy 文档中查看更多详细信息:https://docs.sqlalchemy.org/en/13/orm/tutorial.html#adding-and-updating-objects

经过一番努力,我发现了我错在哪里,遇到问题的其他人可以尝试以下方法。

对我有用的 -

usr.password = data['new_password']
db.session.merge(usr)
db.session.commit()

尽管有一些 Whosebug 问题的答案,但对我不起作用的事情 -

usr.data["password"] = data['new_password']
db.session.commit()
--------------------------------------------
usr.password = data['new_password']
db.session.add(usr)
db.session.commit()
--------------------------------------------
usr.data = { "password": data['new_password'] }
db.session.commit()

希望对您有所帮助!