默认情况下,SQLAlchemy 仅跟踪值本身的更改,这对于简单值(例如整数和字符串)“按预期”工作:
alice.name = "Alice"
alice.age = 8
当您将新值分配给“复杂类型”的列(例如 dict 或 list)时,它也适用:
alice.toys = ['doll', 'teddy bear']
但是,如果您修改列表中的元素之一或追加/删除值,SQLAlchemy 不会注意到更改:
alice.toys[0] = 'teapot'
alice.toys.append('lego bricks')
为了使这项工作有效,您可以确保每次都分配一个新列表:
toys = alice.toys[:] # makes a "clone" of the existing list
toys[0] = 'teapot'
toys.append('lego bricks')
alice.toys = toys
或者阅读以下内容突变追踪 http://docs.sqlalchemy.org/en/latest/orm/extensions/mutable.htmlSQLAlchemy 文档中的一章了解如何对列表或字典进行子类化,以便它们跟踪其元素的修改。
另外,既然你提到你正在使用 Postgres - 有一个专门的ARRAY http://docs.sqlalchemy.org/en/rel_0_9/dialects/postgresql.html#sqlalchemy.dialects.postgresql.array输入 Postgres,您可以使用它来代替JSON
如果您只需要存储列表。然而,上面所说的关于突变跟踪的内容适用于ARRAY
也打字。