[Sqlalchemy-commits] [1195] sqlalchemy/trunk/examples/polymorph: got some support for mapping to a s
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-03-25 02:26:13
|
<!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>[1195] sqlalchemy/trunk/examples/polymorph: got some support for mapping to a select that only selects some of the columns of an underlying table</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1195</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-24 20:25:59 -0600 (Fri, 24 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>got some support for mapping to a select that only selects some of the columns of an underlying table</pre> <h3>Modified Paths</h3> <ul> <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="#sqlalchemytrunklibsqlalchemymappingunitofworkpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/unitofwork.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkexamplespolymorphpolymorph2py"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/examples/polymorph/polymorph2.py (1194 => 1195)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/examples/polymorph/polymorph2.py 2006-03-25 01:58:27 UTC (rev 1194) +++ sqlalchemy/trunk/examples/polymorph/polymorph2.py 2006-03-25 02:25:59 UTC (rev 1195) </span><span class="lines">@@ -94,8 +94,6 @@ </span><span class="cx"> return False </span><span class="cx"> else: </span><span class="cx"> return True </span><del>- - </del><span class="cx"> </span><span class="cx"> people_mapper = mapper(Person, person_join, extension=PersonLoader()) </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1194 => 1195)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-25 01:58:27 UTC (rev 1194) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-25 02:25:59 UTC (rev 1195) </span><span class="lines">@@ -18,6 +18,11 @@ </span><span class="cx"> # a dictionary mapping classes to their primary mappers </span><span class="cx"> mapper_registry = weakref.WeakKeyDictionary() </span><span class="cx"> </span><ins>+# a constant returned by _getattrbycolumn to indicate +# this mapper is not handling an attribute for a particular +# column +NO_ATTRIBUTE = object() + </ins><span class="cx"> class Mapper(object): </span><span class="cx"> """Persists object instances to and from schema.Table objects via the sql package. </span><span class="cx"> Instances of this class should be constructed through this package's mapper() or </span><span class="lines">@@ -534,19 +539,25 @@ </span><span class="cx"> params = {} </span><span class="cx"> return self.instances(statement.execute(**params), **kwargs) </span><span class="cx"> </span><del>- def _getpropbycolumn(self, column): </del><ins>+ def _getpropbycolumn(self, column, raiseerror=True): </ins><span class="cx"> try: </span><span class="cx"> prop = self.columntoproperty[column.original] </span><span class="cx"> except KeyError: </span><span class="cx"> try: </span><span class="cx"> prop = self.props[column.key] </span><ins>+ if not raiseerror: + return None </ins><span class="cx"> raise InvalidRequestError("Column '%s.%s' is not available, due to conflicting property '%s':%s" % (column.table.name, column.name, column.key, repr(prop))) </span><span class="cx"> except KeyError: </span><ins>+ if not raiseerror: + return None </ins><span class="cx"> raise InvalidRequestError("No column %s.%s is configured on mapper %s..." % (column.table.name, column.name, str(self))) </span><span class="cx"> return prop[0] </span><span class="cx"> </span><del>- def _getattrbycolumn(self, obj, column): - prop = self._getpropbycolumn(column) </del><ins>+ def _getattrbycolumn(self, obj, column, raiseerror=True): + prop = self._getpropbycolumn(column, raiseerror) + if prop is None: + return NO_ATTRIBUTE </ins><span class="cx"> return prop.getattr(obj) </span><span class="cx"> </span><span class="cx"> def _setattrbycolumn(self, obj, column, value): </span><span class="lines">@@ -615,7 +626,9 @@ </span><span class="cx"> # doing an UPDATE ? get the history for the attribute, with "passive" </span><span class="cx"> # so as not to trigger any deferred loads. if there is a new </span><span class="cx"> # value, add it to the bind parameters </span><del>- prop = self._getpropbycolumn(col) </del><ins>+ prop = self._getpropbycolumn(col, False) + if prop is None: + continue </ins><span class="cx"> history = prop.get_history(obj, passive=True) </span><span class="cx"> if history: </span><span class="cx"> a = history.added_items() </span><span class="lines">@@ -629,7 +642,9 @@ </span><span class="cx"> # default. if its None and theres no default, we still might </span><span class="cx"> # not want to put it in the col list but SQLIte doesnt seem to like that </span><span class="cx"> # if theres no columns at all </span><del>- value = self._getattrbycolumn(obj, col) </del><ins>+ value = self._getattrbycolumn(obj, col, False) + if value is NO_ATTRIBUTE: + continue </ins><span class="cx"> if col.default is None or value is not None: </span><span class="cx"> params[col.key] = value </span><span class="cx"> </span><span class="lines">@@ -682,13 +697,16 @@ </span><span class="cx"> clause.clauses.append(p == self._getattrbycolumn(obj, p)) </span><span class="cx"> row = table.select(clause).execute().fetchone() </span><span class="cx"> for c in table.c: </span><del>- if self._getattrbycolumn(obj, c) is None: </del><ins>+ if self._getattrbycolumn(obj, c, False) is None: </ins><span class="cx"> self._setattrbycolumn(obj, c, row[c]) </span><span class="cx"> else: </span><span class="cx"> for c in table.c: </span><span class="cx"> if c.primary_key or not params.has_key(c.name): </span><span class="cx"> continue </span><del>- if self._getattrbycolumn(obj, c) != params.get_original(c.name): </del><ins>+ v = self._getattrbycolumn(obj, c, False) + if v is NO_ATTRIBUTE: + continue + elif v != params.get_original(c.name): </ins><span class="cx"> self._setattrbycolumn(obj, c, params.get_original(c.name)) </span><span class="cx"> </span><span class="cx"> def delete_obj(self, objects, uow): </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingunitofworkpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/unitofwork.py (1194 => 1195)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/unitofwork.py 2006-03-25 01:58:27 UTC (rev 1194) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/unitofwork.py 2006-03-25 02:25:59 UTC (rev 1195) </span><span class="lines">@@ -737,7 +737,7 @@ </span><span class="cx"> def _repr_task(task): </span><span class="cx"> if task.mapper is not None: </span><span class="cx"> if task.mapper.__class__.__name__ == 'Mapper': </span><del>- name = task.mapper.class_.__name__ + "/" + task.mapper.primarytable.id + "/" + str(id(task.mapper)) </del><ins>+ name = task.mapper.class_.__name__ + "/" + str(task.mapper.primarytable) + "/" + str(id(task.mapper)) </ins><span class="cx"> else: </span><span class="cx"> name = repr(task.mapper) </span><span class="cx"> else: </span></span></pre> </div> </div> </body> </html> |