Python Flask Postgresql数组未永久更新

Python Flask Postgresql数组未永久更新,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我正在做一个使用Flask和PostgreSQL数据库以及SQLAlchemy的项目 我有组对象,这些对象具有组成员的用户ID列表。由于某些原因,当我尝试向组中添加ID时,它将无法正确保存 如果我尝试members.append(user\u id),它似乎根本不起作用。但是,如果我尝试members+=[user\u id],该id将显示在列出所有组的视图中,但是如果我重新启动服务器,则附加值不存在。但是,初始值为 相关代码: 最初将组添加到数据库: db = SQLAlchemy(app)

我正在做一个使用Flask和PostgreSQL数据库以及SQLAlchemy的项目

我有
对象,这些对象具有组成员的
用户ID列表。由于某些原因,当我尝试向组中添加ID时,它将无法正确保存

如果我尝试
members.append(user\u id)
,它似乎根本不起作用。但是,如果我尝试
members+=[user\u id]
,该id将显示在列出所有组的视图中,但是如果我重新启动服务器,则附加值不存在。但是,初始值为

相关代码:

最初将组添加到数据库:

db = SQLAlchemy(app)
# ...
g = Group(request.form['name'], user_id)
db.session.add(g)
db.session.commit()
小组课:

from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.postgresql import ARRAY

class Group(db.Model):
    __tablename__ = "groups"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128))
    leader = db.Column(db.Integer)

    # list of the members in the group based on user id
    members = db.Column(ARRAY(db.Integer))

    def __init__(self, name, leader):
        self.name = name
        self.leader = leader
        self.members = [leader]

    def __repr__(self):
        return "Name: {}, Leader: {}, Members: {}".format(self.name, self.leader, self.members)

    def add_user(self, user_id):
        self.members += [user_id]
用于更新组的我的测试功能:

def add_2_to_group():
    g = Group.query.all()[0]
    g.add_user(2)
    db.session.commit()
    return redirect(url_for('show_groups'))

谢谢你的帮助

对未来的任何人来说:因此,通过SQLAlchemy的数组是不可变的。因此,一旦它们在数据库中初始化,它们就不能更改大小。也许有一种方法可以做到这一点,但有更好的方法来做我们正在努力做的事情

As,sqlalchemy中的
数组
数据类型是不可变的。这意味着一旦对数组进行了初始化,就不可能将新数据添加到数组中

要解决此问题,请创建类
MutableList

from sqlalchemy.ext.mutable import Mutable

class MutableList(Mutable, list):
    def append(self, value):
        list.append(self, value)
        self.changed()

    @classmethod
    def coerce(cls, key, value):
        if not isinstance(value, MutableList):
            if isinstance(value, list):
                return MutableList(value)
            return Mutable.coerce(key, value)
        else:
            return value
此代码段允许您扩展列表以向其添加可变性。因此,现在可以使用上面的类创建可变数组类型,如:

class Group(db.Model):
    ...
    members = db.Column(MutableList.as_mutable(ARRAY(db.Integer)))
    ...
您可以使用该函数将属性标记为已更改。在本例中,您可以将
add_user
方法更改为:

from sqlalchemy.orm.attributes import flag_modified

# ~~~

    def add_user(self, user_id):
        self.members += [user_id]
        flag_modified(self, 'members')

这是一个黑客解决方案,但您可以做的是:

  • 暂时存储现有阵列
  • 将列值设置为“无”
  • 将列值设置为现有临时数组
  • 例如:

    g = Group.query.all()[0]
    temp_array = g.members
    g.members = None
    db.session.commit()
    db.session.refresh(g)
    g.members = temp_array
    db.session.commit()
    

    数组
    不是不可变的。默认情况下,它只是不跟踪对它的更改,因此SQLA不知道会话中的数据已经更改,需要刷新/提交。