Sorry, my fault. I was not enough attentive while read this 
http://docs.python.org/2.7/reference/datamodel.html?highlight=__eq__#object.__eq__
 
part of documentation. I somehow thought that comparison method must wait 
NotImplementedError in case of impassible comparison. But now, when you 
point me on my error I see, that documentation say about returgnin 
NotImplemented singleton, from not implemented comparison methods. 

Sorry, I very ashamed. Thanks for clarification.

PS Is there a more simpler method to mark an attribute of mapped instance 
as "dirty"?

On Tuesday, December 4, 2012 5:35:27 PM UTC+2, Michael Bayer wrote:
>
> 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 sqlal...@googlegroups.com<javascript:>
> .
> To unsubscribe from this group, send email to 
> sqlalchemy+...@googlegroups.com <javascript:>.
> 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 view this discussion on the web visit 
https://groups.google.com/d/msg/sqlalchemy/-/d_Exgo5E_QwJ.
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.

Reply via email to