[Sqlalchemy-commits] [1351] sqlalchemy/branches/schema/lib/sqlalchemy/orm: added auto polymorphic_id
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-04-28 22:33:44
|
<!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>[1351] sqlalchemy/branches/schema/lib/sqlalchemy/orm: added auto polymorphic_ident setting</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1351</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-04-28 17:33:36 -0500 (Fri, 28 Apr 2006)</dd> </dl> <h3>Log Message</h3> <pre>added auto polymorphic_ident setting</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemaexamplespolymorphpolymorphpy">sqlalchemy/branches/schema/examples/polymorph/polymorph.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormmapperpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemaexamplespolymorphpolymorphpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/examples/polymorph/polymorph.py (1350 => 1351)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/examples/polymorph/polymorph.py 2006-04-28 22:11:52 UTC (rev 1350) +++ sqlalchemy/branches/schema/examples/polymorph/polymorph.py 2006-04-28 22:33:36 UTC (rev 1351) </span><span class="lines">@@ -16,7 +16,8 @@ </span><span class="cx"> people = Table('people', db, </span><span class="cx"> Column('person_id', Integer, primary_key=True), </span><span class="cx"> Column('company_id', Integer, ForeignKey('companies.company_id')), </span><del>- Column('name', String(50))).create() </del><ins>+ Column('name', String(50)), + Column('type', String(30))).create() </ins><span class="cx"> </span><span class="cx"> engineers = Table('engineers', db, </span><span class="cx"> Column('person_id', Integer, ForeignKey('people.person_id'), primary_key=True), </span><span class="lines">@@ -56,28 +57,38 @@ </span><span class="cx"> # create a union that represents both types of joins. we have to use </span><span class="cx"> # nulls to pad out the disparate columns. </span><span class="cx"> person_join = select( </span><del>- [ - people, - managers.c.status, - managers.c.manager_name, - null().label('engineer_name'), - null().label('primary_language'), - column("'manager'").label('type') - ], - people.c.person_id==managers.c.person_id).union_all( - select( - [ - people, - engineers.c.status, - null().label('').label('manager_name'), - engineers.c.engineer_name, - engineers.c.primary_language, - column("'engineer'").label('type') - ], - people.c.person_id==engineers.c.person_id)).alias('pjoin') </del><ins>+ [ + people, + managers.c.status, + managers.c.manager_name, + null().label('engineer_name'), + null().label('primary_language'), + ], + people.c.person_id==managers.c.person_id + ).union_all( + select( + [ + people, + engineers.c.status, + null().label('').label('manager_name'), + engineers.c.engineer_name, + engineers.c.primary_language, + ], + people.c.person_id==engineers.c.person_id + ).union_all( + select( + [ + people, + null().label('').label('status'), + null().label('').label('manager_name'), + null().label('engineer_name'), + null().label('primary_language'), + ], + ) + ) + ).alias('pjoin') </ins><span class="cx"> </span><del>- -person_mapper = mapper(Person, people, select_table=person_join, polymorphic_on=person_join.c.type) </del><ins>+person_mapper = mapper(Person, people, select_table=person_join, polymorphic_on=person_join.c.type, polymorphic_ident='person') </ins><span class="cx"> mapper(Engineer, engineers, inherits=person_mapper, polymorphic_ident='engineer') </span><span class="cx"> mapper(Manager, managers, inherits=person_mapper, polymorphic_ident='manager') </span><span class="cx"> </span><span class="lines">@@ -89,6 +100,7 @@ </span><span class="cx"> c = Company(name='company1') </span><span class="cx"> c.employees.append(Manager(name='pointy haired boss', status='AAB', manager_name='manager1')) </span><span class="cx"> c.employees.append(Engineer(name='dilbert', status='BBA', engineer_name='engineer1', primary_language='java')) </span><ins>+c.employees.append(Person(name='joesmith', status='HHH')) </ins><span class="cx"> c.employees.append(Engineer(name='wally', status='CGG', engineer_name='engineer2', primary_language='python')) </span><span class="cx"> c.employees.append(Manager(name='jsmith', status='ABA', manager_name='manager2')) </span><span class="cx"> session.save(c) </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py (1350 => 1351)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py 2006-04-28 22:11:52 UTC (rev 1350) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py 2006-04-28 22:33:36 UTC (rev 1351) </span><span class="lines">@@ -133,12 +133,19 @@ </span><span class="cx"> self.inherits = inherits </span><span class="cx"> if polymorphic_ident is not None: </span><span class="cx"> inherits.add_polymorphic_mapping(polymorphic_ident, self) </span><ins>+ self.polymorphic_ident = polymorphic_ident + if self.polymorphic_on is None: + self.effective_polymorphic_on = inherits.effective_polymorphic_on + else: + self.effective_polymorphic_on = self.polymorphic_on </ins><span class="cx"> else: </span><span class="cx"> self._synchronizer = None </span><span class="cx"> self.inherits = None </span><span class="cx"> self.mapped_table = self.local_table </span><span class="cx"> if polymorphic_ident is not None: </span><del>- raise ArgumentError("'polymorphic_ident' argument can only be used with inherits=<somemapper>") </del><ins>+ self.add_polymorphic_mapping(polymorphic_ident, self) + self.polymorphic_ident = polymorphic_ident + self.effective_polymorphic_on = self.polymorphic_on </ins><span class="cx"> </span><span class="cx"> if select_table is not None: </span><span class="cx"> self.select_table = select_table </span><span class="lines">@@ -596,6 +603,12 @@ </span><span class="cx"> value = self._getattrbycolumn(obj, col) </span><span class="cx"> if value is not None: </span><span class="cx"> params[col.key] = value </span><ins>+ elif self.effective_polymorphic_on is not None and col.original is self.effective_polymorphic_on.original: + print "YA YA ITS", self.polymorphic_ident + if isinsert: + value = self.polymorphic_ident + if col.default is None or value is not None: + params[col.key] = value </ins><span class="cx"> else: </span><span class="cx"> # column is not a primary key ? </span><span class="cx"> if not isinsert: </span><span class="lines">@@ -760,7 +773,6 @@ </span><span class="cx"> </span><span class="cx"> if self.polymorphic_on is not None: </span><span class="cx"> discriminator = row[self.polymorphic_on] </span><del>- print self.polymorphic_map </del><span class="cx"> mapper = self.polymorphic_map[discriminator] </span><span class="cx"> if mapper is not self: </span><span class="cx"> row = self.translate_row(mapper, row) </span></span></pre> </div> </div> </body> </html> |