To make this script run, I had to remove "from smisk.config" since I don't have access to that, and also replace "get_db_url()" with a plain SQLite URL. The script also doesn't include any data so I added a row that matches the particular delete you're doing.
The line that redefines the elixir session doesn't appear to work properly (keep in mind I don't work with Elixir), as Elixir seems to grab onto elixir.session separately before you change it's definition here. The scoped_session() being made here doesn't appear to be used, so I changed it to: elixir.session().autoflush=False metadata.bind = create_engine("sqlite://", echo=True) metadata.bind.recycle = 14400 # not sure what this is for, there's no "recycle" param on engine setup_all(True) m1 = Media(id="someid", status="Deleted", project_id=u'pf2u32e') elixir.session.commit() elixir.session.close() media = Media.query.filter(Media.status == u'Deleted').filter_by(project_id=u'pf2u32e').all() for m in media: m.delete() session.commit() the output is then what's expected, starting after the table creates, below. Can you modify the attached script and ensure it reproduces your error ? This is SQLAlchemy 0.7.5. 2012-02-27 09:47:00,092 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 2012-02-27 09:47:00,093 INFO sqlalchemy.engine.base.Engine INSERT INTO media (id, project_id, status, row_type) VALUES (?, ?, ?, ?) 2012-02-27 09:47:00,093 INFO sqlalchemy.engine.base.Engine ('someid', u'pf2u32e', 'Deleted', 'media') 2012-02-27 09:47:00,093 INFO sqlalchemy.engine.base.Engine COMMIT 2012-02-27 09:47:00,094 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 2012-02-27 09:47:00,094 INFO sqlalchemy.engine.base.Engine SELECT media.id AS media_id, media.project_id AS media_project_id, media.status AS media_status, media.row_type AS media_row_type FROM media WHERE media.status = ? AND media.project_id = ? 2012-02-27 09:47:00,094 INFO sqlalchemy.engine.base.Engine (u'Deleted', u'pf2u32e') 2012-02-27 09:47:00,097 INFO sqlalchemy.engine.base.Engine SELECT media_variants.id AS media_variants_id, media_variants.original_id AS media_variants_original_id, media_variants.row_type AS media_variants_row_type FROM media_variants WHERE media_variants.original_id = ? 2012-02-27 09:47:00,097 INFO sqlalchemy.engine.base.Engine (u'someid',) 2012-02-27 09:47:00,098 INFO sqlalchemy.engine.base.Engine SELECT media_attributes.media_id AS media_attributes_media_id, media_attributes.attr_key AS media_attributes_attr_key, media_attributes.attr_value AS media_attributes_attr_value FROM media_attributes WHERE media_attributes.media_id = ? 2012-02-27 09:47:00,098 INFO sqlalchemy.engine.base.Engine (u'someid',) 2012-02-27 09:47:00,099 INFO sqlalchemy.engine.base.Engine DELETE FROM media WHERE media.id = ? 2012-02-27 09:47:00,099 INFO sqlalchemy.engine.base.Engine (u'someid',) 2012-02-27 09:47:00,099 INFO sqlalchemy.engine.base.Engine COMMIT On Feb 27, 2012, at 8:07 AM, Jakob D. wrote: > Sure, I thought that might be something obvious. > > Here's runnable test which gives the above error: > > import elixir > from elixir import * > from elixir.events import * > from sqlalchemy.orm import scoped_session, sessionmaker > from smisk.config import config > > class Project(Entity): > using_options(tablename='projects') > id = Field(String(100), primary_key=True) > media = OneToMany('Media', cascade='all, delete') > > class Media(Entity): > using_options(tablename='media', inheritance='multi') > id = Field(String(50), primary_key=True) > project = ManyToOne('Project') > variants = OneToMany('MediaVariant', cascade='all, delete') > attributes = OneToMany('MediaAttribute', cascade='all, delete') > status = Field(String(20), nullable=True) > > class MediaAttribute(Entity): > using_options(tablename='media_attributes') > media = ManyToOne('Media', primary_key=True) > attr_key = Field(String(100), primary_key=True) > attr_value = Field(Unicode(255)) > > class MediaVariant(Entity): > using_options(tablename='media_variants', inheritance='multi') > id = Field(Integer, primary_key=True, autoincrement=True) > original = ManyToOne('Media') > > class Image(Media): > using_options(tablename='images', inheritance='multi') > width = Field(Integer, nullable=False, default=0) > height = Field(Integer, nullable=False, default=0) > > class ImageVariant(MediaVariant): > using_options(tablename='image_variants', inheritance='multi') > width = Field(Integer, nullable=False, default=0) > height = Field(Integer, nullable=False, default=0) > > elixir.session = scoped_session(sessionmaker(autoflush=False, > transactional=True)) > metadata.bind = get_db_url() > metadata.bind.recycle = 14400 > setup_all(True) > > media = Media.query.filter(Media.status == > u'Deleted').filter_by(project_id=u'pf2u32e').all() > > for m in media: > m.delete() > > elixir.session.commit() > > > > On Friday, 24 February 2012 22:04:22 UTC+1, Michael Bayer wrote: > > On Feb 24, 2012, at 12:37 PM, Jakob D. wrote: > > I wrote a small script to clean up the db of old entries. > > > > So when I do obj.delete() I get this error. I also do a session.update(obj) > > right before to make sure the object is present in the session. > > > > File "deletor.py", line 95, in delete > > m.delete() > > File "/usr/lib/python2.5/site-packages/elixir/entity.py", line 963, in > > delete > > return object_session(self).delete(self, *args, **kwargs) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/session.py", line > > 961, in delete > > for c, m in _cascade_iterator('delete', instance): > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/session.py", line > > 1253, in _cascade_iterator > > for (o, m) in mapper.cascade_iterator(cascade, instance._state, > > **kwargs): > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/mapper.py", line > > 1335, in cascade_iterator > > instance, instance_mapper, corresponding_state = iterator.next() > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/properties.py", > > line 451, in cascade_iterator > > instances = attributes.get_as_list(state, self.key, passive=passive) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/attributes.py", > > line 1151, in get_as_list > > x = attr.get(state, passive=passive) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/attributes.py", > > line 279, in get > > value = callable_() > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/strategies.py", > > line 466, in __call__ > > result = q.all() > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/query.py", line > > 878, in all > > return list(self) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/query.py", line > > 1017, in iterate_instances > > context.attributes.get(('populating_mapper', ii), > > _state_mapper(ii))._post_instance(context, ii) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/mapper.py", line > > 1517, in _post_instance > > p(state.obj(), **kwargs) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/mapper.py", line > > 1547, in post_execute > > self.populate_instance(selectcontext, instance, row, isnew=False, > > instancekey=identitykey, ispostselect=True, only_load_props=only_load_props) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/mapper.py", line > > 1484, in populate_instance > > (newpop, existingpop, post_proc) = selectcontext.exec_with_path(self, > > prop.key, prop.create_row_processor, selectcontext, self, row) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/query.py", line > > 1703, in exec_with_path > > return fn(*args, **kwargs) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/interfaces.py", > > line 532, in create_row_processor > > return > > self._get_context_strategy(selectcontext).create_row_processor(selectcontext, > > mapper, row) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/strategies.py", > > line 75, in create_row_processor > > elif self.columns[0] in row: > > TypeError: argument of type 'NoneType' is not iterable > > > > > > Can I get a hint to what might be wrong? > > > I can give you a hint if you give us one .... a short, self-contained and > runnable test script illustrating how you're getting it to do this ? > > > > > > > On Friday, 24 February 2012 22:04:22 UTC+1, Michael Bayer wrote: > > On Feb 24, 2012, at 12:37 PM, Jakob D. wrote: > > I wrote a small script to clean up the db of old entries. > > > > So when I do obj.delete() I get this error. I also do a session.update(obj) > > right before to make sure the object is present in the session. > > > > File "deletor.py", line 95, in delete > > m.delete() > > File "/usr/lib/python2.5/site-packages/elixir/entity.py", line 963, in > > delete > > return object_session(self).delete(self, *args, **kwargs) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/session.py", line > > 961, in delete > > for c, m in _cascade_iterator('delete', instance): > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/session.py", line > > 1253, in _cascade_iterator > > for (o, m) in mapper.cascade_iterator(cascade, instance._state, > > **kwargs): > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/mapper.py", line > > 1335, in cascade_iterator > > instance, instance_mapper, corresponding_state = iterator.next() > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/properties.py", > > line 451, in cascade_iterator > > instances = attributes.get_as_list(state, self.key, passive=passive) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/attributes.py", > > line 1151, in get_as_list > > x = attr.get(state, passive=passive) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/attributes.py", > > line 279, in get > > value = callable_() > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/strategies.py", > > line 466, in __call__ > > result = q.all() > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/query.py", line > > 878, in all > > return list(self) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/query.py", line > > 1017, in iterate_instances > > context.attributes.get(('populating_mapper', ii), > > _state_mapper(ii))._post_instance(context, ii) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/mapper.py", line > > 1517, in _post_instance > > p(state.obj(), **kwargs) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/mapper.py", line > > 1547, in post_execute > > self.populate_instance(selectcontext, instance, row, isnew=False, > > instancekey=identitykey, ispostselect=True, only_load_props=only_load_props) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/mapper.py", line > > 1484, in populate_instance > > (newpop, existingpop, post_proc) = selectcontext.exec_with_path(self, > > prop.key, prop.create_row_processor, selectcontext, self, row) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/query.py", line > > 1703, in exec_with_path > > return fn(*args, **kwargs) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/interfaces.py", > > line 532, in create_row_processor > > return > > self._get_context_strategy(selectcontext).create_row_processor(selectcontext, > > mapper, row) > > File "/var/lib/python-support/python2.5/sqlalchemy/orm/strategies.py", > > line 75, in create_row_processor > > elif self.columns[0] in row: > > TypeError: argument of type 'NoneType' is not iterable > > > > > > Can I get a hint to what might be wrong? > > > I can give you a hint if you give us one .... a short, self-contained and > runnable test script illustrating how you're getting it to do this ? > > > > > > > -- > 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/-/yBNZuGed_h8J. > 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.
-- 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.
On Feb 27, 2012, at 8:07 AM, Jakob D. wrote:
|
import elixir from elixir import * from elixir.events import * from sqlalchemy.orm import scoped_session, sessionmaker, Session from sqlalchemy import create_engine class Project(Entity): using_options(tablename='projects') id = Field(String(100), primary_key=True) media = OneToMany('Media', cascade='all, delete') class Media(Entity): using_options(tablename='media', inheritance='multi') id = Field(String(50), primary_key=True) project = ManyToOne('Project') variants = OneToMany('MediaVariant', cascade='all, delete') attributes = OneToMany('MediaAttribute', cascade='all, delete') status = Field(String(20), nullable=True) class MediaAttribute(Entity): using_options(tablename='media_attributes') media = ManyToOne('Media', primary_key=True) attr_key = Field(String(100), primary_key=True) attr_value = Field(Unicode(255)) class MediaVariant(Entity): using_options(tablename='media_variants', inheritance='multi') id = Field(Integer, primary_key=True, autoincrement=True) original = ManyToOne('Media') class Image(Media): using_options(tablename='images', inheritance='multi') width = Field(Integer, nullable=False, default=0) height = Field(Integer, nullable=False, default=0) class ImageVariant(MediaVariant): using_options(tablename='image_variants', inheritance='multi') width = Field(Integer, nullable=False, default=0) height = Field(Integer, nullable=False, default=0) elixir.session().autoflush=False metadata.bind = create_engine("sqlite://", echo=True) metadata.bind.recycle = 14400 setup_all(True) m1 = Media(id="someid", status="Deleted", project_id=u'pf2u32e') elixir.session.commit() elixir.session.close() media = Media.query.filter(Media.status == u'Deleted').filter_by(project_id=u'pf2u32e').all() for m in media: m.delete() session.commit()