Sorry for the double thread. I was waiting for it to show up for hours. Please remove one of them. Thanks
On Nov 9, 4:44 pm, Torsten Engelbrecht <torsten.engelbre...@googlemail.com> wrote: > Hi, > > I need to use dynamic table names in a project (though for the same > object). Now I got the following problem: > - I fetch data from an RSS feed to fill my database. Its an RSS feed > with many pages, each page has around 100 items > - I fetch the first page and create a table + mapper for a dynamic id > (called "my_id" below) > - then I do session.add and session.commit for each item in the feed, > everything ok so far > - after I fetch the second page ("my_id" is the same), I attempt to > recreate table and mapper (see code below) or simply readd them if > they already exist, that seems working as well > - I do the same for each item in the feed as the first time, but this > time it raise the following exception: > "sqlalchemy.orm.exc.FlushError: Instance <MyModel at 0x1bc1590> has a > NULL identity key. Check if this flush is occuring at an > inappropriate time, such as during a load operation." > > Here my data model (simplified) and the code to simply save a new item > from the feed: > > === > import sqlalchemy > from sqlalchemy import import orm > > mymetadata = sqlalchemy.MetaData() > > class MyModel(object): > def __init__(self, **kwargs): > title = kwargs.get('title') > body = kwargs.get('body') > > class MyModelTable(object): > def __init__(self, my_id): > metadata = mymetadata > table_name = 'mymodel_%s' % my_id > self.table = sqlalchemy.Table(table_name, metadata, > sqlalchemy.Column('id', sqlalchemy.Integer, > primary_key=True), > sqlalchemy.Column('title', sqlalchemy.String(255), > index=True), > sqlalchemy.Column('body', sqlalchemy.Text), > useexisiting=True) > self.table.create(get_engine(), checkfirst=True) #get_engine() > is helper function to retrieve the engine (not listed here) > orm.mapper(MyModel, self.table) > > def save_items(my_id, items): #assuming items is already parsed and > saved in a list > model_table = MyModelTable(my_id) > session = orm.sessionmaker(bind=get_engine(), autocommit=False, > autoflush=True) > for item in items: > item_data = dict(title=item['title'], > body=item['description']) > new_model_instance = MyModel(**item_data) > session.add(new_model_instance) > session.commit() > session.close() > orm.clear_mappers() #to avoid the exception when mapping the same > object to anoher ot the same table > === > > Here is the whole traceback after the commit: > === > File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.6.5- > py2.6.egg/sqlalchemy/orm/session.py", line 623, in commit > self.transaction.commit() > File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.6.5- > py2.6.egg/sqlalchemy/orm/session.py", line 385, in commit > self._prepare_impl() > File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.6.5- > py2.6.egg/sqlalchemy/orm/session.py", line 369, in _prepare_impl > self.session.flush() > File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.6.5- > py2.6.egg/sqlalchemy/orm/session.py", line 1397, in flush > self._flush(objects) > File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.6.5- > py2.6.egg/sqlalchemy/orm/session.py", line 1487, in _flush > flush_context.finalize_flush_changes() > File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.6.5- > py2.6.egg/sqlalchemy/orm/unitofwork.py", line 320, in > finalize_flush_changes > self.session._register_newly_persistent(state) > File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.6.5- > py2.6.egg/sqlalchemy/orm/session.py", line 1056, in > _register_newly_persistent > 'operation.' % mapperutil.state_str(state)) > sqlalchemy.orm.exc.FlushError: Instance <MyModel at 0x1bc1590> has a > NULL identity key. Check if this flush is occuring at an > inappropriate time, such as during a load operation. > === > > save_items() is called each time a new page is fetched (either for the > same "my_id") or another one. > This FlushError only happens when I have more than one page for the > same "my_id" and they are saved one after another. I also never > happens for the first page, neither for different "my_id"'s when > staying with one page. > According to the release notes of SQLAlchemy 0.6.5 this exception > raises when > === > "Added an assertion during flush which ensures > that no NULL-holding identity keys were generated > on "newly persistent" objects. > This can occur when user defined code inadvertently > triggers flushes on not-fully-loaded objects. " > === > Though I don't see why it happens in my example. I appreaciate any > help. Thanks -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@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.