this is an incorrect __eq__() method: def __eq__(self, other): if not isinstance(other, SiteVersion): raise NotImplementedError('Expect %s instance, got %s' % (SiteVersion, other))
suppose I have a custom object Foo: class Foo(object): def __eq__(self, other): return other is self then I make one: f = Foo() is it not valid to say this ? >>> f == 5 False therefore __eq__() cannot raise an exception if the incoming object is of a different type. a simple change: def __eq__(self, other): if not isinstance(other, SiteVersion): return False and your script runs fine. On Dec 4, 2012, at 6:26 AM, Dmitry Bogun wrote: > I have tried to create some custom SA type. And got in situation when I can't > find correct wayout. Minimal test case in attach. > > My app have class SiteVersion, it can be used as regular object and as SA > mmaped object. When I use only SiteVesionDeco(see attach) all works fine, > except propagating updates to DB. When I have tried to add SiteVersionWatch, > everything failed down: > > $ ~/tmp/z/z.py > 2012-12-04 13:15:10,134 INFO sqlalchemy.engine.base.Engine PRAGMA > table_info("my_data") > 2012-12-04 13:15:10,134 INFO sqlalchemy.engine.base.Engine () > 2012-12-04 13:15:10,134 INFO sqlalchemy.engine.base.Engine > CREATE TABLE my_data ( > id INTEGER NOT NULL, > data VARCHAR, > PRIMARY KEY (id) > ) > > > 2012-12-04 13:15:10,135 INFO sqlalchemy.engine.base.Engine () > 2012-12-04 13:15:10,135 INFO sqlalchemy.engine.base.Engine COMMIT > 2012-12-04 13:15:10,135 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) > 2012-12-04 13:15:10,136 INFO sqlalchemy.engine.base.Engine INSERT INTO > my_data (data) VALUES (?) > 2012-12-04 13:15:10,136 INFO sqlalchemy.engine.base.Engine ('1.0',) > 2012-12-04 13:15:10,136 INFO sqlalchemy.engine.base.Engine COMMIT > 2012-12-04 13:15:10,137 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) > 2012-12-04 13:15:10,137 INFO sqlalchemy.engine.base.Engine SELECT my_data.id > AS my_data_id, my_data.data AS my_data_data > FROM my_data > WHERE my_data.id = ? > 2012-12-04 13:15:10,137 INFO sqlalchemy.engine.base.Engine (1,) > 2012-12-04 13:15:10,137 INFO sqlalchemy.engine.base.Engine ROLLBACK > Traceback (most recent call last): > File "/home/surabujin/tmp/z/z.py", line 172, in <module> > main() > File "/home/surabujin/tmp/z/z.py", line 169, in main > dbs.commit() > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", > line 703, in commit > self.transaction.commit() > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", > line 361, in commit > self._prepare_impl() > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", > line 340, in _prepare_impl > self.session.flush() > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", > line 1718, in flush > self._flush(objects) > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", > line 1789, in _flush > flush_context.execute() > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", > line 331, in execute > rec.execute(self) > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", > line 475, in execute > uow > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", > line 54, in save_obj > table, states_to_update) > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", > line 326, in _collect_update_commands > attributes.PASSIVE_NO_INITIALIZE) > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", > line 1249, in get_state_history > return state.get_history(key, passive) > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/state.py", > line 104, in get_history > return self.manager[key].impl.get_history(self, self.dict, passive) > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", > line 533, in get_history > self, state, dict_.get(self.key, NO_VALUE)) > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", > line 1150, in from_scalar_attribute > elif attribute.is_equal(current, original) is True: > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/types.py", > line 750, in compare_values > return self.impl.compare_values(x, y) > File > "/home/surabujin/devel/DORS/env/local/lib/python2.7/site-packages/sqlalchemy/types.py", > line 84, in compare_values > return x == y > File "/home/surabujin/tmp/z/z.py", line 77, in __eq__ > raise NotImplementedError('Expect %s instance, got %s' % (SiteVersion, > other)) > NotImplementedError: Expect <class '__main__.SiteVersion'> instance, got > <symbol 'NO_VALUE> > > Why it try to make SA specific comparison before converting object into > built-in type String? How can I fix it? > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To view this discussion on the web visit > https://groups.google.com/d/msg/sqlalchemy/-/Cdl5FTQOAE0J. > To post to this group, send email to sqlalchemy@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > <z.py> -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.