我正在使用Flask和PostgreSQL数据库,使用SQLAlchemy进行项目。
我有Group
个对象,其中包含User
个ID列表,这些ID是该组的成员。出于某种原因,当我尝试向组添加ID时,它将无法正确保存。
如果我尝试members.append(user_id)
,它似乎根本不起作用。但是,如果我尝试members += [user_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'))
感谢您的帮助!
答案 0 :(得分:2)
作为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)))
...
答案 1 :(得分:1)
对未来的任何人:所以事实证明,通过SQLAlchemy的数组是不可变的。因此,一旦他们在数据库中初始化,他们就无法改变大小。可能有一种方法可以做到这一点,但有更好的方法来做我们尝试做的事情。
答案 2 :(得分:1)
您可以使用flag_modified
函数将属性标记为已更改。在此示例中,您可以将add_user
方法更改为:
from sqlalchemy.orm.attributes import flag_modified
# ~~~
def add_user(self, user_id):
self.members += [user_id]
flag_modified(self, 'members')
答案 3 :(得分:0)
这是一个骇人听闻的解决方案,但是您可以做的是:
例如:
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()