Hello,

I'm having trouble testing my code which uses SQLAlchemy with nose[1].
I'm using SA 0.3.11.

My DB is wrapped in a class called DB. I use this class as follows:

# prepare DB
mydb = DB('sqlite', db='/path/to/sqlite/db')
mydb.createTables()

# perform tests on DB

# tear down DB
mydb.dropTables()
os.remove('/path/to/sqlite/db')

The idea is to have a clean DB for each individual test, so the DB
preparation steps are in my setup() and teardown() methods. The problem
occurs when I have two classes in the same file which have this code;
the second class run by nose gives me a long traceback[2].

What happens in the DB class __init__(), createTables() and dropTables()
methods? (The complete source can be viewed online[3].)

The __init__() method creates a BoundMetaData object for sqlite with
SingletonThreadPool pool class, defines the tables and mappers and
creates a session context.

import sqlalchemy as sa

def __init__(self, db, entity_name=None):
    engine_src = 'sqlite:///%s' % db
    self.ctx = None
    self.metadata = sa.BoundMetaData(engine_src, \
                                 poolclass=sa.pool.SingletonThreadPool)
    self.entity_name = entity_name
    self._defineTables()

def _defineTables(self):
    appglobals = sa.Table('appglobals', self.metadata,
        sa.Column('agid', sa.Integer, primary_key=True,
autoincrement=True),
        sa.Column('kname', sa.String(20)),
        sa.Column('kvalue', sa.String(255)),
        sa.Column('ngid', sa.Integer),
        mysql_engine='InnoDB')
    # etc ...
    self._assignMappers()

def _assignMappers(self):
    self.ctx = SessionContext(sa.create_session)
    # mappers have been created, do nothing
    from sqlalchemy.orm.mapper import ClassKey
    if sa.orm.mapper_registry.has_key(ClassKey(ReposHaveKits, \
                                               self.entity_name)):
        return

    repos_have_kits = sa.Table('repos_have_kits', self.metadata,
                               autoload=True)
    assign_mapper(self.ctx, ReposHaveKits, repos_have_kits,
                  entity_name=self.entity_name)
    # etc ...

The createTables() method calls metadata.create_all(). The dropTables()
method calls metadata.drop_all() and deletes the current session
context.

def createTables(self):
    self.metadata.create_all()

def dropTables(self):
    self.metadata.drop_all()

    # need to destroy the current session which may still contain old data
    self.ctx.del_current()

How can I realize this concept of a completely new and isolated DB
environment for each single test case that's being run?

The test source is also available[4][5].

Thanks in advance,
Mike

[1] http://www.somethingaboutorange.com/mrl/projects/nose/
[2] http://rafb.net/p/f1GuIK83.html
[3]
http://svn.osgdc.org/browse/kusu/kusu/trunk/src/modules/core/src/lib/database.py?r=3169
[4]
http://svn.osgdc.org/browse/kusu/sandbox/mike/kusu-mmm/src/modules/kits/src/test/kits_test.py?r=3213
[5]
http://svn.osgdc.org/browse/kusu/sandbox/mike/kusu-mmm/src/modules/kits/src/test/tool_test.py?r=3213

--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to