Hi David -
"version_id_col" needs to point to an actual Column instance, not a
string.
- mike
On Sep 1, 2007, at 12:39 PM, Nachtrabe wrote:
>
> Let me prefix this by saying that I am a newbie to SA, though not to
> ORMs in general. So far I've really enjoyed using SA: its an amazing
> package for working with databases.
>
> Presently I am trying to create a GM tool for Shadowrun 4th Edition,
> where I am trying to model this concept called a "Data Bomb." The
> Data Bomb works by detonating and doing damage to the hacker and then
> potentially deleting the file it sits on. There is also some
> associated metadata that I would like to store, so I have modeled the
> data bombs as being in a separate table from the files. The database
> is currently sqlite, but I may switch later to another system that is
> a little more robust at a later date.
>
> The system is MacOS X 10.4.10, Python 2.5.1 Stackless 3.1b3 060516
> (python-2.51:55546, May 24 2007, 08:50:09). I am calling the
> following from inside of a unit test, and no tasklets or threads of
> any sort are involved in this part of the app.
>
> When I attempt to delete an object it generates an exception and then
> appears to corrupt the session, such that further save statements
> generate the same exception.
>
> These are the table definitions I am presently using:
>
> file_table = Table('files', dbutil.metadata,
> Column('id', Integer, primary_key=True),
> Column('securable_id', Integer,
> ForeignKey('securable.id')),
> Column('node_id', Integer, ForeignKey('nodes.id')),
> Column('name', String(32), nullable=False),
> Column('content', String(), nullable=False),
> Column('version', Integer),
> Column('encryption', Integer, default=0)
> )
>
> bomb_table = Table('data_bombs', dbutil.metadata,
> Column('id', Integer, primary_key=True),
> Column('name', String(16), default="None"),
> Column('strength', Integer,
> CheckConstraint('strength >= 0'), nullable=False),
> Column('destroy_chance', Float(2), nullable=False),
> Column('file_id', Integer, ForeignKey('files.id'),
> unique=True),
> Column('version', Integer)
> )
>
> The mapper calls:
>
> mapper(DataBomb, bomb_table, version_id_col='version',
> properties={
> 'file':relation(File, backref='bomb')
> })
>
> mapper(File, file_table, version_id_col='version', inherits=Securable,
> polymorphic_identity='file',
> properties={
>
> 'node':relation(node.Node, backref='files',
> primaryjoin=node.node_table.c.id == file_table.c.node_id)
> }
> )
>
> The classes are right now just acting as data stores with a few
> utility functions. The data bomb takes the file as an argument when
> it is being created.
>
> I have created a DAO for both tables, but for the sake of debugging I
> have moved the pieces generating the error out into the test
> function. The DAO uses the "with" statement with begin_nested().
>
> The first unit test that is running:
>
> * Creates a file
> * Creates a data bomb that is associated to that file.
> * Deletes the data bomb in a separate transaction.
>
> The code for the test is as follows:
>
> def testBomb(self):
>
> session = dbutil.create_session()
>
>
> filetest = file_dao.create('green', 'maho')
>
> bomb = bomb_dao.create(filetest, 10)
>
> with session.begin():
>
> session.delete(bomb)
>
> When it flushes/commits after the deletion, it generates the
> following:
>
> ======================================================================
> ERROR: testBomb (nodefile.FileTests)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/Users/raven/Documents/AoW/workspace/ShadowMatrix/src/
> shadowmatrix/model/nodefile.py", line 172, in testBomb
> session.delete(bomb)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> session.py", line 256, in __exit__
> self.commit()
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> session.py", line 211, in commit
> self.session.flush()
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> session.py", line 665, in flush
> self.uow.flush(self, objects)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 202, in flush
> flush_context.execute()
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 414, in execute
> UOWExecutor().execute(self, head)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1035, in execute
> self.execute_delete_steps(trans, task)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1056, in execute_delete_steps
> self.execute_childtasks(trans, task, True)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1070, in execute_childtasks
> self.execute(trans, child, isdelete)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1035, in execute
> self.execute_delete_steps(trans, task)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1056, in execute_delete_steps
> self.execute_childtasks(trans, task, True)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1070, in execute_childtasks
> self.execute(trans, child, isdelete)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1035, in execute
> self.execute_delete_steps(trans, task)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1058, in execute_delete_steps
> self.delete_objects(trans, task)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1041, in delete_objects
> task.mapper.delete_obj(task.polymorphic_todelete_objects, trans)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> mapper.py", line 1253, in delete_obj
> params[mapper.version_id_col.key] = mapper.get_attr_by_column(obj,
> mapper.version_id_col)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> mapper.py", line 949, in get_attr_by_column
> prop = self._getpropbycolumn(column, raiseerror)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> mapper.py", line 933, in _getpropbycolumn
> prop = self.columntoproperty[column]
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> util.py", line 101, in __getitem__
> return super(TranslatingDict,
> self).__getitem__(self.__translate_col(col))
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> util.py", line 94, in __translate_col
> ourcol = self.selectable.corresponding_column(col, keys_ok=False,
> raiseerr=False)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> sql/
> expression.py", line 1605, in corresponding_column
> for c in column.orig_set:
> AttributeError: 'str' object has no attribute 'orig_set'
>
> The second test that runs just generates the file, retrieves it by
> name, and then makes sure that name is the same coming out as it is
> going in:
> def testCreate(self):
> file_dao.create('purple', 'foo')
>
> filetest = file_dao.get('purple')
>
> self.assertEqual(filetest.name, 'purple')
>
> After the prior testBomb runs, it generates the following error:
>
> ======================================================================
> ERROR: testCreate (nodefile.FileTests)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/Users/raven/Documents/AoW/workspace/ShadowMatrix/src/
> shadowmatrix/model/nodefile.py", line 149, in testCreate
> file_dao.create('purple', 'foo')
> File "/Users/raven/Documents/AoW/workspace/ShadowMatrix/src/
> shadowmatrix/database/dao.py", line 60, in create
> session.save(obj)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> session.py", line 256, in __exit__
> self.commit()
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> session.py", line 211, in commit
> self.session.flush()
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> session.py", line 665, in flush
> self.uow.flush(self, objects)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 202, in flush
> flush_context.execute()
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 414, in execute
> UOWExecutor().execute(self, head)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1035, in execute
> self.execute_delete_steps(trans, task)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1056, in execute_delete_steps
> self.execute_childtasks(trans, task, True)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1070, in execute_childtasks
> self.execute(trans, child, isdelete)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1035, in execute
> self.execute_delete_steps(trans, task)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1056, in execute_delete_steps
> self.execute_childtasks(trans, task, True)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1070, in execute_childtasks
> self.execute(trans, child, isdelete)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1035, in execute
> self.execute_delete_steps(trans, task)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1058, in execute_delete_steps
> self.delete_objects(trans, task)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> unitofwork.py", line 1041, in delete_objects
> task.mapper.delete_obj(task.polymorphic_todelete_objects, trans)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> mapper.py", line 1253, in delete_obj
> params[mapper.version_id_col.key] = mapper.get_attr_by_column(obj,
> mapper.version_id_col)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> mapper.py", line 949, in get_attr_by_column
> prop = self._getpropbycolumn(column, raiseerror)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> mapper.py", line 933, in _getpropbycolumn
> prop = self.columntoproperty[column]
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> util.py", line 101, in __getitem__
> return super(TranslatingDict,
> self).__getitem__(self.__translate_col(col))
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> orm/
> util.py", line 94, in __translate_col
> ourcol = self.selectable.corresponding_column(col, keys_ok=False,
> raiseerr=False)
> File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/site-packages/SQLAlchemy-0.4.0beta4-py2.5.egg/sqlalchemy/
> sql/
> expression.py", line 1605, in corresponding_column
> for c in column.orig_set:
> AttributeError: 'str' object has no attribute 'orig_set'
>
>
> If I reverse the order, changing the name of testBomb to testDataBomb,
> testCreate will run correctly, but testDataBomb will generate the
> same error as above.
>
> testCreate (nodefile.FileTests) ... ok
> testDataBomb (nodefile.FileTests) ... ERROR
>
> Any ideas? Any help is appreciated.
>
> Sincerely,
> David
>
>
> >
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---