python - Flask Postgresql 数组不会永久更新

标签 python flask sqlalchemy flask-sqlalchemy

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

我有 Group 对象,其中包含属于该组成员的 User ID 列表。出于某种原因,当我尝试将 ID 添加到群组时,它无法正确保存。

如果我尝试 members.append(user_id),它似乎根本不起作用。但是,如果我尝试 members += [user_id],id 将显示在列出所有组的 View 中,但如果我重新启动服务器,添加的值将不那里。然而,初始值是。

相关代码:

最初将组添加到数据库:

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

感谢您的帮助!

最佳答案

作为you have mentioned ,sqlalchemy 中的 ARRAY 数据类型是不可变的。这意味着一旦初始化就不可能将新数据添加到数组中。

要解决这个问题,请创建类 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)))
    ...

关于python - Flask Postgresql 数组不会永久更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28710520/

相关文章:

python - 在 Python 中使用 Is 运算符检查对象和值

Python线程测试不起作用

python - 寻找最大不连续的长度

python - 如何使 declarative_base 派生类符合接口(interface)?

python - 是否有基于类属性创建 __init__ 函数的快捷方式?

python - 如何在 SQLAlchemy 中过滤列上的 SQL 查询?

python - 如何在不使用其他功能的情况下进行 GroupBy?

postgresql - 用于数据库连接的 Flask before_request 和 teardown_request

flask - 实现日期选择器和 Flask-WTForms

python - Flask 应用程序中的数据未提交到数据库