Hey guys,
I've been exploring how the `Mutation` class works and I was just wondering
if I could get an explanation of a couple of things. First of all, in the
documentation for Mutation Tracking there is an example of the
`JSONEncodedDict` using the `MutableDict`. As far as I can tell, this only
works when you mutate a key of that dictionary and if you mutate nested
structures these changes are ignored. Below I have an example of this.
Base = declarative_base()
engine = create_engine('sqlite:///:memory:', echo=True)
class Model(Base):
__tablename__ = 'model'
id = Column(Integer, primary_key=True)
blob = Column(MutableDict.as_mutable(JSONEncodedDict),
nullable=False)
Base.metadata.create_all(engine)
model = Model(blob={'foo': 'bar'})
session = sessionmaker(bind=engine)()
session.add(model)
session.commit()
model.blob['foo'] = {'bar': 'foobar'}
session.commit()
session = sessionmaker(bind=engine)()
model = session.query(Model).one()
assert model.blob == {'foo': {'bar': 'foobar'}}
model.blob['foo']['bar'] = {'foobar': 'barfoo'}
session.commit()
session = sessionmaker(bind=engine)()
model = session.query(Model).one()
print model.blob
assert model.blob == {'foo': {'bar': {'foobar': 'barfoo'}}}
I create new sessions each time just to make sure the session isn't caching
anything behind the scenes. The output of this looks like:
2013-03-27 21:34:58,825 INFO sqlalchemy.engine.base.Engine PRAGMA
table_info("model")
2013-03-27 21:34:58,825 INFO sqlalchemy.engine.base.Engine ()
2013-03-27 21:34:58,826 INFO sqlalchemy.engine.base.Engine
CREATE TABLE model (
id INTEGER NOT NULL,
blob VARCHAR NOT NULL,
PRIMARY KEY (id)
)
2013-03-27 21:34:58,826 INFO sqlalchemy.engine.base.Engine ()
2013-03-27 21:34:58,826 INFO sqlalchemy.engine.base.Engine COMMIT
2013-03-27 21:34:58,827 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2013-03-27 21:34:58,828 INFO sqlalchemy.engine.base.Engine INSERT INTO
model (blob) VALUES (?)
2013-03-27 21:34:58,828 INFO sqlalchemy.engine.base.Engine ('{"foo":
"bar"}',)
2013-03-27 21:34:58,829 INFO sqlalchemy.engine.base.Engine COMMIT
2013-03-27 21:34:58,829 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2013-03-27 21:34:58,830 INFO sqlalchemy.engine.base.Engine SELECT model.id
AS model_id, model.blob AS model_blob
FROM model
WHERE model.id = ?
2013-03-27 21:34:58,830 INFO sqlalchemy.engine.base.Engine (1,)
2013-03-27 21:34:58,831 INFO sqlalchemy.engine.base.Engine UPDATE model SET
blob=? WHERE model.id = ?
2013-03-27 21:34:58,831 INFO sqlalchemy.engine.base.Engine ('{"foo":
{"bar": "foobar"}}', 1)
2013-03-27 21:34:58,831 INFO sqlalchemy.engine.base.Engine COMMIT
2013-03-27 21:34:58,831 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2013-03-27 21:34:58,832 INFO sqlalchemy.engine.base.Engine SELECT model.id
AS model_id, model.blob AS model_blob
FROM model
2013-03-27 21:34:58,832 INFO sqlalchemy.engine.base.Engine ()
2013-03-27 21:34:58,832 INFO sqlalchemy.engine.base.Engine COMMIT
2013-03-27 21:34:58,833 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2013-03-27 21:34:58,833 INFO sqlalchemy.engine.base.Engine SELECT model.id
AS model_id, model.blob AS model_blob
FROM model
2013-03-27 21:34:58,833 INFO sqlalchemy.engine.base.Engine ()
{u'foo': {u'bar': u'foobar'}}
Traceback (most recent call last):
File "mutability_tracking.py", line 279, in <module>
assert model.blob == {'foo': {'bar': {'foobar': 'barfoo'}}}
AssertionError
Upon further investigation the `Mutable` class has an property `_parents`
which I don't fully understand. Can I get an explanation of what the
desired use of the `Mutable` interface is? How exactly are mutations of
children supposed to be propagated to its parents? And is there an
interface for adding parents to the `_parents` property (as far as I can
tell, no)?
I have a solution that works, but I'm not convinced it is the right way to
do it, so I'll wait to see what people have to say about this before I
share.
Thanks!!!
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.