SQLAlchemy没有对postgres进行更改

时间:2017-03-15 22:10:25

标签: python postgresql sqlalchemy

我无法使用SQLAlchemy提交数据库更改,我无法弄清楚原因。

以下是有问题的数据模型:

class EmailGroup(db.Model):
    __tablename__ = 'email_group'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(), unique=True, nullable=False)
    data = db.Column(db.JSON)

def __init__(self, name):
    self.name = name
    self.data = {u'members': []}

def addUser(self, username):
    data = self.data
    if username not in data[u'members']:
        data[u'members'].append(username)
        self.data = data

这是服务器代码:

@app.route('/emailgroup/<groupid>/adduser/<userid>', methods=['POST'])
@jwt_required()
def emailGroupAddUser(groupid, userid):
    emailgroup = EmailGroup.query.filter_by(id=groupid).first()
    if not emailgroup:
        return 'Group with id ' + groupid + ' does not exist.', status.HTTP_400_BAD_REQUEST
    user = User.query.filter_by(id=userid).first()
    if not user:
        return 'User with id ' + userid + ' does not exist.', status.HTTP_400_BAD_REQUEST
    emailgroup.addUser(user.username)
    print emailgroup.dumps() # Is correctly updated here
    db.session.add(emailgroup)
    db.session.commit()
    print emailgroup.dumps() # Changes did not go through!
    return jsonify(emailgroup.dumps())

我还尝试使用db.session.flush()而不是add/commit,这使得两个打印语句打印出正确的输出,但实际上并没有更新数据库。

编辑:我也尝试在SQLAlchemy中使用Array类型,但遇到了同样的问题。

1 个答案:

答案 0 :(得分:1)

在处理JSON列时,您可以调用flag_modified而不是尝试在任意级别的嵌套上使用可变扩展:

from sqlalchemy.orm.attributes import flag_modified

def addUser(self, username):
    data = self.data
    if username not in data[u'members']:
        data[u'members'].append(username)
        flag_modified(self, 'data')