【发布时间】:2013-10-21 23:51:20
【问题描述】:
我有一个项目,我想在关系数据库 (Postgres) 中存储一个大型结构(嵌套对象)。它是一个更大结构的一部分,我并不真正关心序列化格式——我很高兴它成为列中的一个 blob——我只是希望能够相当快地坚持和恢复它。
就我的目的而言,SQLAlchemy PickleType 主要完成这项工作。我遇到的问题是我希望脏检查起作用(可变类型用于此目的)。我希望它们不仅可以在我更改路径中的信息,而且还可以在边界(位于另一个级别)中工作。
class Group(Base):
__tablename__ = 'group'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
paths = Column(types.PickleType)
class Path(object):
def __init__(self, style, bounds):
self.style = style
self.bounds = bounds
class Bound(object):
def __init__(self, l, t, r, b):
self.l = l
self.t = t
self.r = r
self.b = b
# this is all fine
g = Group(name='g1', paths=[Path('blah', Bound(1,1,2,3)),
Path('other_style', Bound(1,1,2,3)),])
session.add(g)
session.commit()
# so is this
g.name = 'g2'
assert g in session.dirty
session.commit()
# but this won't work without some sort of tracking on the deeper objects
g.paths[0].style = 'something else'
assert g in session.dirty # nope
我尝试过使用 Mutable 类型试图让它工作,但没有任何运气。在其他地方,我确实将可变类型用于 json 列,这很好 - 以一种看起来更简单的方式,因为使用这些类,您也需要跟踪对象内对象的更改。
任何想法表示赞赏。
【问题讨论】:
标签: python postgresql sqlalchemy persistence mutable