Skip to content

Instantly share code, notes, and snippets.

@storborg
Created October 26, 2011 02:33
Show Gist options
  • Select an option

  • Save storborg/1315240 to your computer and use it in GitHub Desktop.

Select an option

Save storborg/1315240 to your computer and use it in GitHub Desktop.
from sqlalchemy import MetaData, Column
from sqlalchemy.types import Integer, String
from sqlalchemy.orm import create_session, composite
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.mutable import MutableComposite
metadata = MetaData('sqlite://')
Base = declarative_base(metadata=metadata)
class MyComposite(MutableComposite):
def __init__(self, a, b):
self.a = a
self.b = b
def __composite_values__(self):
return (self.a, self.b)
def __getstate__(self):
return self.__composite_values__()
def __setstate__(self, state):
(self.a, self.b) = state
def __setattr__(self, key, value):
object.__setattr__(self, key, value)
self.changed()
class Foo(Base):
__tablename__ = 'foos'
id = Column(Integer, primary_key=True)
name = Column(String(50))
comp = composite(MyComposite,
Column('a', String(50)),
Column('b', String(50)))
metadata.create_all()
sess = create_session()
print "loading data"
foo = Foo()
sess.add(foo)
sess.flush()
sess.expunge_all()
##########
print "testing"
foo = sess.query(Foo).get(1)
print "before flush, _parents is %r" % foo.comp._parents.items()
foo.name = 'changed'
sess.flush()
print "after flush, _parents is %r" % foo.comp._parents.items()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment