gpt4 book ai didi

python - SQLAlchemy JSON TypeDecorator 未正确保存,session.commit() 有问题

转载 作者:太空狗 更新时间:2023-10-29 20:12:22 24 4
gpt4 key购买 nike

我的 models.py 文件有两个模型,User 和 Job。

每个作业都将关联多个用户。

一个用户可以与多个作业相关联。

我需要能够执行类似 job.getUsers() 的操作 --> 用户对象列表

我尝试使用 TypeDecorators 在我的 Job 表中存储一个 JSON int 数组。每个 int 代表一个用户的 pk,稍后我可以使用它在数据库中找到正确的行。

乍一看,这工作正常,但我遇到了一些奇怪的错误(帖子底部,在我的代码之后)。

class Json(TypeDecorator):

impl = String

def process_bind_param(self, value, dialect):
return json.dumps(value)

def process_result_value(self, value, dialect):
return json.loads(value)


class Job(Base):
__tablename__ = 'jobs'
id = Column(Integer, primary_key=True)
date = Column(Date)
workers = Column(Json(128))

def __init__(self):
self.workers = []

这是我奇怪的输出

>>> db_session = scoped_session(sessionmaker(autocommit=False, autoflush=True, bind=engine))

>>> job = Job()
>>> job.workers
[]
>>> job.workers.append(1)
>>> job.workers
[1]
>>> db_session.add(job)
>>> job.workers
[1]
>>> db_session.commit()
>>> job.workers
[1]
>>> job = Job.query.filter(Job.id == 1).first()
>>> job.workers
[1]

此时,看起来一切正常。当我尝试向列表中添加第二个项目时,事情开始出错。

>>> job.workers.append(2) # let's try adding another item to the list.
>>> job.workers
[1, 2]
>>> db_session.add(job) # is this necessary? added for debugging purposes, seems to have no effect on anything
>>> job.workers
[1, 2]
>>> db_session.commit() # autoflush is on
>>> job.workers
[1] # !!!!!!!!!!!!!!!!!!!??????????????????????/

如果您知道我做错了什么,请告诉我。或者,让我知道是否有更好的方法来代替 JSON TypeDecorator。谢谢!

最佳答案

SQLAlchemy 在保留已更新的 JSON 方面存在问题。我遇到了同样令人沮丧的问题,但在这里找到了答案:

https://bashelton.com/2014/03/updating-postgresql-json-fields-via-sqlalchemy/

总之,使用 sqlalchemy.orm.attributes 中的 'flag_modified' 方法

from sqlalchemy.orm.attributes import flag_modified    

jobs.workers.append(2)
flag_modified(jobs, "workers")
db_session.commit()

关于python - SQLAlchemy JSON TypeDecorator 未正确保存,session.commit() 有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30088089/

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