I finally got the chance to upgrade my application to use SA 0.2. Yay!!

However, I have found a regression. After a session is cleared objects loaded by that session can no longer load related objects. Example:

>>> s = create_session()
>>> user = s.get(User, 8)
>>> s.clear()
>>> user.addresses
[]

The user should actually have 3 addresses, but since the session was cleared the user object is not associated with a session and cannot load its addresses. Is this a bug or did something change that requires objects to be disassociated from their session when the session is cleared? A test is attached.

~ Daniel


from testbase import AssertMixin
import testbase
import unittest, sys, datetime

import sqlalchemy.databases.sqlite as sqllite

import tables
from tables import *

db = testbase.db
from sqlalchemy import *
from sqlalchemy.engine import ResultProxy, RowProxy


# test merging a composed object.

# test that when cascading an operation, like "merge", lazy-loaded scalar and list attributes that werent already loaded on the given object remain not loaded.

# test putting an object in session A, "moving" it to session B, insure its in B and not in A


class SessionTest(AssertMixin):
    
    def setUpAll(self):
        db.echo = False
        tables.create()
        tables.data()
        db.echo = testbase.echo
    def tearDownAll(self):
        db.echo = False
        tables.drop()
        db.echo = testbase.echo
    def tearDown(self):
        clear_mappers()
    def setUp(self):
        pass
        
    def test_object_session_after_clear_session(self):
        import sqlalchemy.orm.session
        get_session = sqlalchemy.orm.session.object_session
        
        mapper(User, users)
        s = create_session()
        u = s.get(User, 8)

        assert get_session(u) is s # before clear
        s.clear()
        assert get_session(u) is s # after clear
        
    def test_relation_after_clear_session(self):
        import sqlalchemy.orm.session
        get_session = sqlalchemy.orm.session.object_session
        
        mapper(User, users, properties={
            'addresses': relation(mapper(Address, addresses), backref="user")})
        s = create_session()

        addrs = s.query(Address).select(Address.c.user_id == 8)
        user = s.get(User, 8)

        assert len(addrs) == 3
        s.clear()
        assert len(user.addresses) == 3

        
if __name__ == "__main__":    
    testbase.main()
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to