heres how im running it:

z-eeks-Computer:~/dev/sqlalchemy classic$ export PYTHONPATH=./lib/:./ test/ z-eeks-Computer:~/dev/sqlalchemy classic$ python threadlocal- association.py
testdelete (__main__.AssociationTest) ... ok
testinsert (__main__.AssociationTest) ... ok
testmodify (__main__.AssociationTest) ... ok
testreplace (__main__.AssociationTest) ... ok

----------------------------------------------------------------------
Ran 4 tests in 0.353s

OK
z-eeks-Computer:~/dev/sqlalchemy classic$

or postgres:

z-eeks-Computer:~/dev/sqlalchemy classic$ python threadlocal- association.py --db postgres
testdelete (__main__.AssociationTest) ... ok
testinsert (__main__.AssociationTest) ... ok
testmodify (__main__.AssociationTest) ... ok
testreplace (__main__.AssociationTest) ... ok

----------------------------------------------------------------------
Ran 4 tests in 1.488s

OK

if you run with --verbose, that will show all the SQL and print statements, maybe you can get a better view of whats going wrong.

script is attached....

import testbase

from sqlalchemy import *

class AssociationTest(testbase.PersistTest):
    def setUpAll(self):
        self.install_threadlocal()
        global items, item_keywords, keywords, metadata, Item, Keyword, KeywordAssociation
        metadata = BoundMetaData(testbase.db)
        items = Table('items', metadata, 
            Column('item_id', Integer, primary_key=True),
            Column('name', String(40)),
            )
        item_keywords = Table('item_keywords', metadata,
            Column('item_id', Integer, ForeignKey('items.item_id')),
            Column('keyword_id', Integer, ForeignKey('keywords.keyword_id')),
            Column('data', String(40))
            )
        keywords = Table('keywords', metadata,
            Column('keyword_id', Integer, primary_key=True),
            Column('name', String(40))
            )
        metadata.create_all()
        
        class Item(object):
            def __init__(self, name):
                self.name = name
            def __repr__(self):
                return "Item id=%d name=%s keywordassoc=%s" % (self.item_id, self.name, repr(self.keywords))
        class Keyword(object):
            def __init__(self, name):
                self.name = name
            def __repr__(self):
                return "Keyword id=%d name=%s" % (self.keyword_id, self.name)
        class KeywordAssociation(object):
            def __init__(self, keyword, data):
                self.keyword = keyword
                self.data = data
            def __repr__(self):
                return "KeywordAssociation itemid=%d keyword=%s data=%s" % (self.item_id, repr(self.keyword), self.data)
        
        mapper(Keyword, keywords)
        mapper(KeywordAssociation, item_keywords, properties={
            'keyword':relation(Keyword, lazy=False)
        }, primary_key=[item_keywords.c.item_id, item_keywords.c.keyword_id], order_by=[item_keywords.c.data])
        mapper(Item, items, properties={
            'keywords' : relation(KeywordAssociation, association=Keyword)
        })
        
    def tearDown(self):
        for t in metadata.table_iterator(reverse=True):
            t.delete().execute()
    def tearDownAll(self):
        clear_mappers()
        metadata.drop_all()
        
    def testinsert(self):
        item1 = Item('item1')
        item2 = Item('item2')
        item1.keywords.append(KeywordAssociation(Keyword('blue'), 'blue_assoc'))
        item1.keywords.append(KeywordAssociation(Keyword('red'), 'red_assoc'))
        item2.keywords.append(KeywordAssociation(Keyword('green'), 'green_assoc'))
        objectstore.save(item2)
        objectstore.flush()
        saved = repr([item1, item2])
        objectstore.clear()
        l = objectstore.query(Item).select()
#        l = Item.select()
        loaded = repr(l)
        print saved
        print loaded
        self.assert_(saved == loaded)

    def testreplace(self):
        item1 = Item('item1')
        item1.keywords.append(KeywordAssociation(Keyword('blue'), 'blue_assoc'))
        item1.keywords.append(KeywordAssociation(Keyword('red'), 'red_assoc'))
#        sess.save(item1)
        objectstore.flush()
        
        red_keyword = item1.keywords[1].keyword
        del item1.keywords[1]
        item1.keywords.append(KeywordAssociation(red_keyword, 'new_red_assoc'))
        objectstore.flush()
        saved = repr([item1])
        objectstore.clear()
        l = objectstore.query(Item).select()
#        l = Item.select()
        loaded = repr(l)
        print saved
        print loaded
        self.assert_(saved == loaded)

    def testmodify(self):
        item1 = Item('item1')
        item2 = Item('item2')
        item1.keywords.append(KeywordAssociation(Keyword('blue'), 'blue_assoc'))
        item1.keywords.append(KeywordAssociation(Keyword('red'), 'red_assoc'))
        item2.keywords.append(KeywordAssociation(Keyword('green'), 'green_assoc'))
#        sess.save(item1)
#        sess.save(item2)
        objectstore.flush()
        
        red_keyword = item1.keywords[1].keyword
        del item1.keywords[0]
        del item1.keywords[0]
        purple_keyword = Keyword('purple')
        item1.keywords.append(KeywordAssociation(red_keyword, 'new_red_assoc'))
        item2.keywords.append(KeywordAssociation(purple_keyword, 'purple_item2_assoc'))
        item1.keywords.append(KeywordAssociation(purple_keyword, 'purple_item1_assoc'))
        item1.keywords.append(KeywordAssociation(Keyword('yellow'), 'yellow_assoc'))
        
        objectstore.flush()
        saved = repr([item1, item2])
        objectstore.clear()
        l = objectstore.query(Item).select()
        loaded = repr(l)
        print saved
        print loaded
        self.assert_(saved == loaded)

    def testdelete(self):
        item1 = Item('item1')
        item2 = Item('item2')
        item1.keywords.append(KeywordAssociation(Keyword('blue'), 'blue_assoc'))
        item1.keywords.append(KeywordAssociation(Keyword('red'), 'red_assoc'))
        item2.keywords.append(KeywordAssociation(Keyword('green'), 'green_assoc'))
#        sess.save(item1)
#        sess.save(item2)
        objectstore.flush()
        self.assert_(item_keywords.count().scalar() == 3)

        objectstore.delete(item1)
        objectstore.delete(item2)
        objectstore.flush()
        self.assert_(item_keywords.count().scalar() == 0)

        
if __name__ == "__main__":
    testbase.main()        



On Jun 28, 2006, at 3:24 AM, Raul Garcia wrote:

Michael Bayer [mailto:[EMAIL PROTECTED]

heres a diff.  the test framework has the "threadlocal" thing turned
off by default and also plays some games with it.

you should be able to remove all the "save()" statements from the
tests and everything should keep working; with threadlocal running,
new objects automatically get added to the session.

All right, I've done that and the tests keep failing. I've run the patched test module against sqlite and postgres (on my windows setup) but to no
avail.

also, when you say Item.select(), it looks like youre looking for
"assign_mapper()" functionality, which tacks on a bunch of
methods to
each class that automatically talk to its mapper; this is something
of a SQLObject-compatibility hack.  in that case, use assign_mapper
(class, table) instead of mapper(class, table).

Yes, thanks a lot. The real code is full of selects like this (from the
SQLObject model) and it seems that the threadlocal is the fastest way
to convert. Also, the model has to be used into a threaded CherryPy
application, so the threadlocal strategy seems the best one for this
case (one thread per request, one default connection/session per thread).

Regards,

Raúl García.



Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel? cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to