gpt4 book ai didi

python - 在 sqlalchemy 中使用 postgresql JSON 类型的列表

转载 作者:太空狗 更新时间:2023-10-29 20:54:02 25 4
gpt4 key购买 nike

我正在使用带有 sqlalchemy、pyramid_tm 和 postgresql 的 Pyramid 来测试它。

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()


class MyList(Base):
id = Column(Integer, primary_key=True)
lst = Column(JSON)

我正在使用 postgresql 9.3+ 并使用 JSON 类型。当我这样做时

mylst = MyList(lst=[])

我也可以看到在数据库上创建了空 [] 列表,并且

def view(request):
mylst = DBSession.query(MyList).get(1)
mylst.lst.append('45')
print(DBSession.is_active, DBSession.is_modified(mylst))

我可以在数据库中看到 ['45'],并打印返回

True, True

在下一个请求时从上面继续[编辑](上面已经提交)

def view(request):
mylst = DBSession.query(MyList).get(1)
mylst.lst.append('65')
print(DBSession.is_active, DBSession.is_modified(mylst))

数据库不会更新,它仍然是 ['45'] 并且打印返回

True, False

我做错了什么还是这是一个错误?

最佳答案

默认情况下,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

或者阅读 Mutation Tracking SQLAlchemy 文档中的章节,了解如何将列表或字典子类化,以便它们跟踪其元素的修改。

此外,由于您提到您正在使用 Postgres - 有一个专用的 ARRAY输入 Postgres,如果您只需要存储列表,您可以使用它代替 JSON。然而,上面所说的突变跟踪也适用于 ARRAY 类型的列。

关于python - 在 sqlalchemy 中使用 postgresql JSON 类型的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25300447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com