- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的 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/
我在我的 postgresql 数据库中使用 xml,我需要一个自定义类型来处理 SQLAlchemy 中的 xml 数据。 所以我制作了 XMLType 类与 xml.etree 进行通信,但它并没
我最近遇到了一个问题,非常感谢任何见解。圣诞节前,我在 PerlMonks 上发布了一个类似的问题,并提供了一些关于从 MooseX::Declare ([http://www.perlmonks.o
我正在尝试向 ORM 类成员添加自定义方法,以使其处理与该成员相关的事情。试图跟随 documentation . class EnhDateTime(types.TypeDecorator):
我正在使用 TypeDecorator 进行 Json 提取,而另一个模型将其用于其列之一。我正在使用这个 TypeDecorator 存储 python 列表对象。 def process_bind
有没有一种方法可以让枚举类在创建新数据库时自动创建,就像标准枚举一样,但也可以将它连接到运行 process_bind_param< 的 TypeDecorator/? 第一个代码块创建了一个 Enu
以前,我能够使用 Reflect 元数据获取组件的元数据。现在元数据已移动到附加到组件的一些注释。 读取元数据 type['__annotations__'][0].selector 绝对是一个 ha
我为 sqlalchemy 定义了以下自定义类型: class EnumColumnType(TypeDecorator): impl = Integer def __init__(s
我的 models.py 文件有两个模型,User 和 Job。 每个作业都将关联多个用户。 一个用户可以与多个作业相关联。 我需要能够执行类似 job.getUsers() 的操作 --> 用户对象
这个错误已经发生一天多了,但我不知道为什么。 应用程序模块 import {NgModule} from "@angular/core"; import {BrowserModule} from "@
我是一名优秀的程序员,十分优秀!