【发布时间】:2015-07-17 06:14:22
【问题描述】:
我的 models.py 文件有两个模型,用户和作业。
每个作业都有多个与之关联的用户。
一个用户可以关联多个工作。
我需要能够做类似 job.getUsers() --> 用户对象列表
我尝试使用 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 = []
这是我奇怪的输出
>>> 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 中传播,请参阅此 MutableDict 配方variable-scope.com/posts/…
标签: python json sqlalchemy