Lui*_*njo 9 python json sqlalchemy
我的models.py文件有两个模型,User和Job.
每个作业都有多个与之关联的用户.
用户可以与多个作业相关联.
我需要能够执行类似job.getUsers() - > User对象列表的操作
我尝试使用TypeDecorators在我的Job表中存储JSON int数组.每个int代表一个用户的pk,我稍后可以使用它来查找db中的正确行.
乍一看,这工作正常,但我得到了一些奇怪的错误(帖子的底部,在我的代码之后).
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 = []
Run Code Online (Sandbox Code Playgroud)
这是我奇怪的输出
>>> 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]
Run Code Online (Sandbox Code Playgroud)
在这一点上,它看起来一切都好.当我尝试在列表中添加第二个项目时,事情开始出错.
>>> 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] # !!!!!!!!!!!!!!!!!!!??????????????????????/
Run Code Online (Sandbox Code Playgroud)
如果你知道我做错了什么,请告诉我.或者,让我知道是否有更好的方法来代替JSON TypeDecorator.谢谢!
All*_*Lin 13
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()
Run Code Online (Sandbox Code Playgroud)
我刚刚遇到了同样的问题,如果 json 文件在 python 中具有相同的 id,似乎 SQLAlchemy 的更新将不会被执行。
所以我的解决方案是为 json 字段分配一个新对象。下面的代码应该可以工作:
job.workers = job.workers + [2, ]
db_session.add(job)
db_session.save()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1415 次 |
| 最近记录: |