[Sqlalchemy-commits] [1262] sqlalchemy/trunk/test: added explicit "session" argument to get(), selec
Brought to you by:
zzzeek
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1262] sqlalchemy/trunk/test: added explicit "session" argument to get(), select_whereclause in mapper, as well as throughout the call-chain for those.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1262</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-04-06 14:01:14 -0500 (Thu, 06 Apr 2006)</dd> </dl> <h3>Log Message</h3> <pre>added explicit "session" argument to get(), select_whereclause in mapper, as well as throughout the call-chain for those. lazy loader honors the "session" of the parent object, + added simple unit test</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkexamplesadjacencytreebyroot_treepy">sqlalchemy/trunk/examples/adjacencytree/byroot_tree.py</a></li> <li><a href="#sqlalchemytrunkexamplespolymorphpolymorph2py">sqlalchemy/trunk/examples/polymorph/polymorph2.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingpropertiespy">sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyutilpy">sqlalchemy/trunk/lib/sqlalchemy/util.py</a></li> <li><a href="#sqlalchemytrunktestmapperpy">sqlalchemy/trunk/test/mapper.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkexamplesadjacencytreebyroot_treepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/examples/adjacencytree/byroot_tree.py (1261 => 1262)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/examples/adjacencytree/byroot_tree.py 2006-04-06 14:54:16 UTC (rev 1261) +++ sqlalchemy/trunk/examples/adjacencytree/byroot_tree.py 2006-04-06 19:01:14 UTC (rev 1262) </span><span class="lines">@@ -45,6 +45,7 @@ </span><span class="cx"> def __iter__(self): </span><span class="cx"> return iter(self.values()) </span><span class="cx"> </span><ins>+ </ins><span class="cx"> class TreeNode(object): </span><span class="cx"> """a hierarchical Tree class, which adds the concept of a "root node". The root is </span><span class="cx"> the topmost node in a tree, or in other words a node whose parent ID is NULL. </span></span></pre></div> <a id="sqlalchemytrunkexamplespolymorphpolymorph2py"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/examples/polymorph/polymorph2.py (1261 => 1262)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/examples/polymorph/polymorph2.py 2006-04-06 14:54:16 UTC (rev 1261) +++ sqlalchemy/trunk/examples/polymorph/polymorph2.py 2006-04-06 19:01:14 UTC (rev 1262) </span><span class="lines">@@ -86,12 +86,12 @@ </span><span class="cx"> else: </span><span class="cx"> return Person() </span><span class="cx"> </span><del>- def populate_instance(self, mapper, instance, row, identitykey, imap, isnew): </del><ins>+ def populate_instance(self, mapper, session, instance, row, identitykey, imap, isnew): </ins><span class="cx"> if row[person_join.c.type] =='engineer': </span><del>- Engineer.mapper.populate_instance(instance, row, identitykey, imap, isnew, frommapper=mapper) </del><ins>+ Engineer.mapper.populate_instance(session, instance, row, identitykey, imap, isnew, frommapper=mapper) </ins><span class="cx"> return False </span><span class="cx"> elif row[person_join.c.type] =='manager': </span><del>- Manager.mapper.populate_instance(instance, row, identitykey, imap, isnew, frommapper=mapper) </del><ins>+ Manager.mapper.populate_instance(session, instance, row, identitykey, imap, isnew, frommapper=mapper) </ins><span class="cx"> return False </span><span class="cx"> else: </span><span class="cx"> return sqlalchemy.mapping.EXT_PASS </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1261 => 1262)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-04-06 14:54:16 UTC (rev 1261) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-04-06 19:01:14 UTC (rev 1262) </span><span class="lines">@@ -301,6 +301,9 @@ </span><span class="cx"> def instances(self, cursor, *mappers, **kwargs): </span><span class="cx"> limit = kwargs.get('limit', None) </span><span class="cx"> offset = kwargs.get('offset', None) </span><ins>+ session = kwargs.get('session', None) + if session is None: + session = objectstore.get_session() </ins><span class="cx"> populate_existing = kwargs.get('populate_existing', False) </span><span class="cx"> </span><span class="cx"> result = util.HistoryArraySet() </span><span class="lines">@@ -314,32 +317,34 @@ </span><span class="cx"> row = cursor.fetchone() </span><span class="cx"> if row is None: </span><span class="cx"> break </span><del>- self._instance(row, imap, result, populate_existing=populate_existing) </del><ins>+ self._instance(session, row, imap, result, populate_existing=populate_existing) </ins><span class="cx"> i = 0 </span><span class="cx"> for m in mappers: </span><del>- m._instance(row, imap, otherresults[i]) </del><ins>+ m._instance(session, row, imap, otherresults[i]) </ins><span class="cx"> i+=1 </span><span class="cx"> </span><span class="cx"> # store new stuff in the identity map </span><span class="cx"> for value in imap.values(): </span><del>- objectstore.get_session().register_clean(value) </del><ins>+ session.register_clean(value) </ins><span class="cx"> </span><span class="cx"> if mappers: </span><span class="cx"> result = [result] + otherresults </span><span class="cx"> return result </span><span class="cx"> </span><del>- def get(self, *ident): </del><ins>+ def get(self, *ident, **kwargs): </ins><span class="cx"> """returns an instance of the object based on the given identifier, or None </span><span class="cx"> if not found. The *ident argument is a </span><span class="cx"> list of primary key columns in the order of the table def's primary key columns.""" </span><span class="cx"> key = objectstore.get_id_key(ident, self.class_, self.entity_name) </span><span class="cx"> #print "key: " + repr(key) + " ident: " + repr(ident) </span><del>- return self._get(key, ident) </del><ins>+ return self._get(key, ident, **kwargs) </ins><span class="cx"> </span><del>- def _get(self, key, ident=None, reload=False): </del><ins>+ def _get(self, key, ident=None, reload=False, session=None): </ins><span class="cx"> if not reload and not self.always_refresh: </span><span class="cx"> try: </span><del>- return objectstore.get_session()._get(key) </del><ins>+ if session is None: + session = objectstore.get_session() + return session._get(key) </ins><span class="cx"> except KeyError: </span><span class="cx"> pass </span><span class="cx"> </span><span class="lines">@@ -352,7 +357,7 @@ </span><span class="cx"> i += 1 </span><span class="cx"> try: </span><span class="cx"> statement = self._compile(self._get_clause) </span><del>- return self._select_statement(statement, params=params, populate_existing=reload)[0] </del><ins>+ return self._select_statement(statement, params=params, populate_existing=reload, session=session)[0] </ins><span class="cx"> except IndexError: </span><span class="cx"> return None </span><span class="cx"> </span><span class="lines">@@ -552,9 +557,9 @@ </span><span class="cx"> else: </span><span class="cx"> return self.select_whereclause(whereclause=arg, **kwargs) </span><span class="cx"> </span><del>- def select_whereclause(self, whereclause=None, params=None, **kwargs): </del><ins>+ def select_whereclause(self, whereclause=None, params=None, session=None, **kwargs): </ins><span class="cx"> statement = self._compile(whereclause, **kwargs) </span><del>- return self._select_statement(statement, params=params) </del><ins>+ return self._select_statement(statement, params=params, session=session) </ins><span class="cx"> </span><span class="cx"> def count(self, whereclause=None, params=None, **kwargs): </span><span class="cx"> s = self.table.count(whereclause) </span><span class="lines">@@ -856,7 +861,7 @@ </span><span class="cx"> def _identity_key(self, row): </span><span class="cx"> return objectstore.get_row_key(row, self.class_, self.pks_by_table[self.table], self.entity_name) </span><span class="cx"> </span><del>- def _instance(self, row, imap, result = None, populate_existing = False): </del><ins>+ def _instance(self, session, row, imap, result = None, populate_existing = False): </ins><span class="cx"> """pulls an object instance from the given row and appends it to the given result </span><span class="cx"> list. if the instance already exists in the given identity map, its not added. in </span><span class="cx"> either case, executes all the property loaders on the instance to also process extra </span><span class="lines">@@ -865,18 +870,20 @@ </span><span class="cx"> # including modifying any of its related items lists, as its already </span><span class="cx"> # been exposed to being modified by the application. </span><span class="cx"> </span><ins>+ if session is None: + session = objectstore.get_session() + </ins><span class="cx"> populate_existing = populate_existing or self.always_refresh </span><span class="cx"> identitykey = self._identity_key(row) </span><del>- sess = objectstore.get_session() - if sess.has_key(identitykey): - instance = sess._get(identitykey) </del><ins>+ if session.has_key(identitykey): + instance = session._get(identitykey) </ins><span class="cx"> </span><span class="cx"> isnew = False </span><del>- if populate_existing or sess.is_expired(instance, unexpire=True): </del><ins>+ if populate_existing or session.is_expired(instance, unexpire=True): </ins><span class="cx"> if not imap.has_key(identitykey): </span><span class="cx"> imap[identitykey] = instance </span><span class="cx"> for prop in self.props.values(): </span><del>- prop.execute(instance, row, identitykey, imap, True) </del><ins>+ prop.execute(session, instance, row, identitykey, imap, True) </ins><span class="cx"> if self.extension.append_result(self, row, imap, result, instance, isnew, populate_existing=populate_existing) is EXT_PASS: </span><span class="cx"> if result is not None: </span><span class="cx"> result.append_nohistory(instance) </span><span class="lines">@@ -893,7 +900,7 @@ </span><span class="cx"> # plugin point </span><span class="cx"> instance = self.extension.create_instance(self, row, imap, self.class_) </span><span class="cx"> if instance is EXT_PASS: </span><del>- instance = self.class_(_mapper_nohistory=True, _sa_entity_name=self.entity_name) </del><ins>+ instance = self.class_(_mapper_nohistory=True, _sa_entity_name=self.entity_name, _sa_session=session) </ins><span class="cx"> imap[identitykey] = instance </span><span class="cx"> isnew = True </span><span class="cx"> else: </span><span class="lines">@@ -904,8 +911,8 @@ </span><span class="cx"> </span><span class="cx"> # call further mapper properties on the row, to pull further </span><span class="cx"> # instances from the row and possibly populate this item. </span><del>- if self.extension.populate_instance(self, instance, row, identitykey, imap, isnew) is EXT_PASS: - self.populate_instance(instance, row, identitykey, imap, isnew) </del><ins>+ if self.extension.populate_instance(self, session, instance, row, identitykey, imap, isnew) is EXT_PASS: + self.populate_instance(session, instance, row, identitykey, imap, isnew) </ins><span class="cx"> if self.extension.append_result(self, row, imap, result, instance, isnew, populate_existing=populate_existing) is EXT_PASS: </span><span class="cx"> if result is not None: </span><span class="cx"> result.append_nohistory(instance) </span><span class="lines">@@ -923,17 +930,17 @@ </span><span class="cx"> newrow[c] = newrow[c.key] </span><span class="cx"> return newrow </span><span class="cx"> </span><del>- def populate_instance(self, instance, row, identitykey, imap, isnew, frommapper=None): </del><ins>+ def populate_instance(self, session, instance, row, identitykey, imap, isnew, frommapper=None): </ins><span class="cx"> if frommapper is not None: </span><span class="cx"> row = frommapper.translate_row(self, row) </span><span class="cx"> </span><span class="cx"> for prop in self.props.values(): </span><del>- prop.execute(instance, row, identitykey, imap, isnew) </del><ins>+ prop.execute(session, instance, row, identitykey, imap, isnew) </ins><span class="cx"> </span><span class="cx"> class MapperProperty(object): </span><span class="cx"> """an element attached to a Mapper that describes and assists in the loading and saving </span><span class="cx"> of an attribute on an object instance.""" </span><del>- def execute(self, instance, row, identitykey, imap, isnew): </del><ins>+ def execute(self, session, instance, row, identitykey, imap, isnew): </ins><span class="cx"> """called when the mapper receives a row. instance is the parent instance </span><span class="cx"> corresponding to the row. """ </span><span class="cx"> raise NotImplementedError() </span><span class="lines">@@ -1054,7 +1061,7 @@ </span><span class="cx"> return EXT_PASS </span><span class="cx"> else: </span><span class="cx"> return self.next.append_result(mapper, row, imap, result, instance, isnew, populate_existing) </span><del>- def populate_instance(self, mapper, instance, row, identitykey, imap, isnew): </del><ins>+ def populate_instance(self, mapper, session, instance, row, identitykey, imap, isnew): </ins><span class="cx"> """called right before the mapper, after creating an instance from a row, passes the row </span><span class="cx"> to its MapperProperty objects which are responsible for populating the object's attributes. </span><span class="cx"> If this method returns True, it is assumed that the mapper should do the appending, else </span><span class="lines">@@ -1062,14 +1069,14 @@ </span><span class="cx"> </span><span class="cx"> Essentially, this method is used to have a different mapper populate the object: </span><span class="cx"> </span><del>- def populate_instance(self, mapper, instance, row, identitykey, imap, isnew): - othermapper.populate_instance(instance, row, identitykey, imap, isnew, frommapper=mapper) </del><ins>+ def populate_instance(self, mapper, session, instance, row, identitykey, imap, isnew): + othermapper.populate_instance(session, instance, row, identitykey, imap, isnew, frommapper=mapper) </ins><span class="cx"> return True </span><span class="cx"> """ </span><span class="cx"> if self.next is None: </span><span class="cx"> return EXT_PASS </span><span class="cx"> else: </span><del>- return self.next.populate_instance(mapper, instance, row, identitykey, imap, isnew) </del><ins>+ return self.next.populate_instance(mapper, session, instance, row, identitykey, imap, isnew) </ins><span class="cx"> def before_insert(self, mapper, instance): </span><span class="cx"> """called before an object instance is INSERTed into its table. </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py (1261 => 1262)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-04-06 14:54:16 UTC (rev 1261) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/properties.py 2006-04-06 19:01:14 UTC (rev 1262) </span><span class="lines">@@ -46,7 +46,7 @@ </span><span class="cx"> if parent._is_primary_mapper(): </span><span class="cx"> #print "regiser col on class %s key %s" % (parent.class_.__name__, key) </span><span class="cx"> objectstore.uow().register_attribute(parent.class_, key, uselist = False) </span><del>- def execute(self, instance, row, identitykey, imap, isnew): </del><ins>+ def execute(self, session, instance, row, identitykey, imap, isnew): </ins><span class="cx"> if isnew: </span><span class="cx"> #print "POPULATING OBJ", instance.__class__.__name__, "COL", self.columns[0]._label, "WITH DATA", row[self.columns[0]], "ROW IS A", row.__class__.__name__, "COL ID", id(self.columns[0]) </span><span class="cx"> instance.__dict__[self.key] = row[self.columns[0]] </span><span class="lines">@@ -95,7 +95,7 @@ </span><span class="cx"> return lazyload </span><span class="cx"> def setup(self, key, statement, **options): </span><span class="cx"> pass </span><del>- def execute(self, instance, row, identitykey, imap, isnew): </del><ins>+ def execute(self, session, instance, row, identitykey, imap, isnew): </ins><span class="cx"> if isnew: </span><span class="cx"> if not self.is_primary(): </span><span class="cx"> objectstore.global_attributes.create_history(instance, self.key, False, callable_=self.setup_loader(instance)) </span><span class="lines">@@ -533,7 +533,7 @@ </span><span class="cx"> self._synchronize(obj, child, None, True) </span><span class="cx"> uowcommit.register_object(child, isdelete=self.private) </span><span class="cx"> </span><del>- def execute(self, instance, row, identitykey, imap, isnew): </del><ins>+ def execute(self, session, instance, row, identitykey, imap, isnew): </ins><span class="cx"> if self.is_primary(): </span><span class="cx"> return </span><span class="cx"> #print "PLAIN PROPLOADER EXEC NON-PRIAMRY", repr(id(self)), repr(self.mapper.class_), self.key </span><span class="lines">@@ -595,6 +595,7 @@ </span><span class="cx"> def lazyload(): </span><span class="cx"> params = {} </span><span class="cx"> allparams = True </span><ins>+ session = objectstore.get_session(instance) </ins><span class="cx"> #print "setting up loader, lazywhere", str(self.lazywhere) </span><span class="cx"> for col, bind in self.lazybinds.iteritems(): </span><span class="cx"> params[bind.key] = self.parent._getattrbycolumn(instance, col) </span><span class="lines">@@ -608,14 +609,14 @@ </span><span class="cx"> ident = [] </span><span class="cx"> for primary_key in self.mapper.pks_by_table[self.mapper.table]: </span><span class="cx"> ident.append(params[primary_key._label]) </span><del>- return self.mapper.get(*ident) </del><ins>+ return self.mapper.get(session=session, *ident) </ins><span class="cx"> elif self.order_by is not False: </span><span class="cx"> order_by = self.order_by </span><span class="cx"> elif self.secondary is not None and self.secondary.default_order_by() is not None: </span><span class="cx"> order_by = self.secondary.default_order_by() </span><span class="cx"> else: </span><span class="cx"> order_by = False </span><del>- result = self.mapper.select_whereclause(self.lazywhere, order_by=order_by, params=params) </del><ins>+ result = self.mapper.select_whereclause(self.lazywhere, order_by=order_by, params=params, session=session) </ins><span class="cx"> else: </span><span class="cx"> result = [] </span><span class="cx"> if self.uselist: </span><span class="lines">@@ -627,7 +628,7 @@ </span><span class="cx"> return None </span><span class="cx"> return lazyload </span><span class="cx"> </span><del>- def execute(self, instance, row, identitykey, imap, isnew): </del><ins>+ def execute(self, session, instance, row, identitykey, imap, isnew): </ins><span class="cx"> if isnew: </span><span class="cx"> # new object instance being loaded from a result row </span><span class="cx"> if not self.is_primary(): </span><span class="lines">@@ -780,7 +781,7 @@ </span><span class="cx"> value.setup(key, statement, eagertable=self.eagertarget) </span><span class="cx"> </span><span class="cx"> </span><del>- def execute(self, instance, row, identitykey, imap, isnew): </del><ins>+ def execute(self, session, instance, row, identitykey, imap, isnew): </ins><span class="cx"> """receive a row. tell our mapper to look for a new object instance in the row, and attach </span><span class="cx"> it to a list on the parent instance.""" </span><span class="cx"> </span><span class="lines">@@ -791,11 +792,11 @@ </span><span class="cx"> </span><span class="cx"> if not self.uselist: </span><span class="cx"> if isnew: </span><del>- h.setattr_clean(self._instance(row, imap)) </del><ins>+ h.setattr_clean(self._instance(session, row, imap)) </ins><span class="cx"> else: </span><span class="cx"> # call _instance on the row, even though the object has been created, </span><span class="cx"> # so that we further descend into properties </span><del>- self._instance(row, imap) </del><ins>+ self._instance(session, row, imap) </ins><span class="cx"> </span><span class="cx"> return </span><span class="cx"> elif isnew: </span><span class="lines">@@ -803,7 +804,7 @@ </span><span class="cx"> else: </span><span class="cx"> result_list = getattr(instance, self.key) </span><span class="cx"> </span><del>- self._instance(row, imap, result_list) </del><ins>+ self._instance(session, row, imap, result_list) </ins><span class="cx"> </span><span class="cx"> def _create_decorator_row(self): </span><span class="cx"> class DecoratorDict(object): </span><span class="lines">@@ -823,7 +824,7 @@ </span><span class="cx"> map[parent.name] = c </span><span class="cx"> return DecoratorDict </span><span class="cx"> </span><del>- def _instance(self, row, imap, result_list=None): </del><ins>+ def _instance(self, session, row, imap, result_list=None): </ins><span class="cx"> """gets an instance from a row, via this EagerLoader's mapper.""" </span><span class="cx"> # since the EagerLoader makes an Alias of its mapper's table, </span><span class="cx"> # we translate the actual result columns back to what they </span><span class="lines">@@ -833,7 +834,7 @@ </span><span class="cx"> # (which is what mappers use) as well as its "label" (which might be what </span><span class="cx"> # user-defined code is using) </span><span class="cx"> row = self._row_decorator(row) </span><del>- return self.mapper._instance(row, imap, result_list) </del><ins>+ return self.mapper._instance(session, row, imap, result_list) </ins><span class="cx"> </span><span class="cx"> class GenericOption(MapperOption): </span><span class="cx"> """a mapper option that can handle dotted property names, </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyutilpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/util.py (1261 => 1262)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-04-06 14:54:16 UTC (rev 1261) +++ sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-04-06 19:01:14 UTC (rev 1262) </span><span class="lines">@@ -294,6 +294,8 @@ </span><span class="cx"> else: </span><span class="cx"> self.data = [] </span><span class="cx"> self.readonly=readonly </span><ins>+# def __iter__(self): +# return iter([k for k in self.records if self.records[k] is not False]) </ins><span class="cx"> def __getattr__(self, attr): </span><span class="cx"> """proxies unknown HistoryArraySet methods and attributes to the underlying </span><span class="cx"> data array. this allows custom list classes to be used.""" </span></span></pre></div> <a id="sqlalchemytrunktestmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/mapper.py (1261 => 1262)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/mapper.py 2006-04-06 14:54:16 UTC (rev 1261) +++ sqlalchemy/trunk/test/mapper.py 2006-04-06 19:01:14 UTC (rev 1262) </span><span class="lines">@@ -124,6 +124,13 @@ </span><span class="cx"> objectstore.refresh(u) </span><span class="cx"> self.assert_sql_count(db, go, 1) </span><span class="cx"> </span><ins>+ def testsessionpropigation(self): + sess = objectstore.Session() + m = mapper(User, users, properties={'addresses':relation(mapper(Address, addresses), lazy=True)}) + u = m.get(7, session=sess) + assert objectstore.get_session(u) is sess + assert objectstore.get_session(u.addresses[0]) is sess + </ins><span class="cx"> def testexpire(self): </span><span class="cx"> m = mapper(User, users, properties={'addresses':relation(mapper(Address, addresses), lazy=False)}) </span><span class="cx"> u = m.get(7) </span></span></pre> </div> </div> </body> </html> |