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 [email protected]<javascript:>
> .
> To unsubscribe from this group, send email to
> [email protected] <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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.