2017-03-15 65 views
0

我在使用SQLAlchemy提交數據庫更改時遇到問題,但我找不到原因。SQLAlchemy沒有對postgres提交更改

這裏是有問題的數據模型:

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中使用數組類型,但面臨同樣的確切問題。

+1

您需要的[可變擴展(HTTP://docs.sqlalchemy。組織/ EN /最新/ ORM /擴展/ mutable.html)。 – univerio

+0

[使用postgresql JSON類型與sqlalchemy列表]的可能重複(http://stackoverflow.com/questions/25300447/using-list-on-postgresql-json-type-with-sqlalchemy) – neuront

回答

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')