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].
> 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.
> <z.py>
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
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.