Oh, whoops.  Also I figured out why my solution of deleting, making
transient, then re-adding appeared not to work.   It actually did
work, I just had some dead rows in the parent table that needed to be
weeded out.  Now I can stop with this refactoring / migration madness
and get back to developing!  Meanwhile the alternative solution in
sa's SQL Expression language turned out to be far simpler too,
required 5 lines of code instead of ~20.

Thanks again!


On Jan 2, 11:32 pm, Eric Ongerth <ericonge...@gmail.com> wrote:
> Right, you made that clear before.
>
> I was no longer talking about setting the discriminator column here in
> 0.6.5.  I was talking about deleting, making transient, and then re-
> adding all of the objects in question.  And how this worked on some of
> them but not all.
>
> And your reasons for not bothering with multiple inheritance in sa are
> great, thanks for describing them.
>
> On Jan 2, 11:09 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
>
> > On Jan 3, 2011, at 2:02 AM, Eric Ongerth wrote:
>
> > > So I tried my solution of deleting and then re-adding each object
> > > (row) in question.  Didn't work quite like that; instead I had to
> > > delete, make_transient(), and then re-add.  Still didn't quite work;
> > > for rows that had sa relationships via FKs to other tables, in order
> > > to avoid errors I had to give the objects thus related a similar
> > > treatment, calling make_transient() and then re-associating them.
>
> > > Lo and behold, for tables that fit that description it worked and the
> > > discriminator is set properly now.  But for the rest of the tables,
> > > those which did not have relationships that needed taking care of in
> > > that way to avoid errors, their rows still aren't getting the
> > > discriminator set.  I tried using "instance_state(obj).modified =
> > > True" on them before flush, but that didn't help either.  Still
> > > haven't found a solution for the rest of those.
>
> > > I don't mean to annoy you in persisting with this approach when it's
> > > not to your liking.   It's just that at this point I'm trying to work
> > > it all the way through in this manner just to come to a better
> > > understanding of the ORM's workings.
>
> > You can't set the discriminator column in 0.6 with the ORM.   The mapper 
> > will ignore it.   You need to forego the ORM or use 0.7.
>
> > > On Jan 2, 9:55 pm, Eric Ongerth <ericonge...@gmail.com> wrote:
> > >> Ah!  I did it again.  You may or may not remember I asked you a
> > >> different question yielding the same answer a couple of months ago!
> > >> I've got to put a stop to that trend.
>
> > >> To quote from your blog post:
>
> > >> ===
> > >> In fact, while this table scheme is exactly joined table inheritance,
> > >> and we could certainly go the "straight" route of creating an
> > >> Addressable base class and mapper from which the User and Order
> > >> classes/mappers derive, then creating the traditional SA "polymorphic
> > >> mapping" using UNION ALL (or whatever surprise 0.4 has in store) with
> > >> a relationship to Address, here we're going to do it differently.
> > >> Namely, because we are still going to look at this association as a
> > >> "cross-cutting concern" rather than an "is-a" relationship, and also
> > >> because SA's explicit inheritance features only support single
> > >> inheritance, and we'd rather not occupy the "inherits" slot with a
> > >> relationship that is at best a mixin, not an "is-a".
> > >> ===
>
> > >> I actually started modeling this exactly the way you're suggesting in
> > >> that post.  I added a "trackable_id" column to each of the six tables,
> > >> as a foreign key to a table of association objects.  But then I
> > >> reasoned as follows: (1) great, now I have two unique ID columns in
> > >> each of these tables and that's almost never a good thing.  (2) great,
> > >> now I'm going to have to add more program logic to explicitly create
> > >> an association object every time I add a row to any of these tables.
> > >> Clunky.
>
> > >> Your blog post shows how to fix problem (2) there with some very cool
> > >> python magic.  Ok, it's not even magic, it's clear enough.  But as
> > >> I've noticed before, I still haven't absorbed your level of comfort
> > >> with throwing that stuff around.  I understand it well enough, but
> > >> when I see underscores I start thinking "can't this be done another
> > >> way without wizardry"?
>
> > >> I suppose even that point is moot when I recognize that my solution
> > >> using inheritance actually calls upon a lot of very clever programming
> > >> within the guts of sqlalchemy.
>
> > >> Your most salient point of all, for me, is where you note that that
> > >> there's currently only one "slot" for inheritance and there isn't a
> > >> very strong case for occupying it with a cross-cutting concern that is
> > >> "at best a mix-in, not an 'is-a'. "
>
> > >> So now I'm curious, have you given much thought to advancing the
> > >> possibility of supporting multiple inheritance with SA's explicit
> > >> inheritance features?  Or is that just too dangerous (or just too much
> > >> of a pain to work out).  Or too tempting for people to brew up all
> > >> manner of ridiculous and unnecessary schema with it.
>
> > >> Thank you for your thoughts.
>
> > >> On Jan 2, 9:18 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
>
> > >>> On Jan 2, 2011, at 11:25 PM, Eric Ongerth wrote:
>
> > >>>> On Jan 2, 7:59 am, Michael Bayer <mike...@zzzcomputing.com> wrote:
> > >>>>> Curious here is what kind of scheme you have that requires a manual 
> > >>>>> setting of the discriminator.
>
> > >>>> Forgive me, I tried to indicate that it doesn't, this is just a one-
> > >>>> time thing I have to do to get this database fixed up.  Here's the
> > >>>> whole story in a nutshell.  I had six tables (person, company,
> > >>>> product, item, etc.) that had little to do with each other.
> > >>>> Eventually I decided that the objects symbolized by the rows in those
> > >>>> tables had a cross-cutting concern: I want to be able to attach action
> > >>>> tickets (sort of like in Trac) and notes to them.  The project I'm
> > >>>> working on has a certain limited amount of CRM/ERP type stuff as part
> > >>>> of its scope, thus tickets, notes, and so on.
>
> > >>>> So where these tables originally each had their own unique primary key
> > >>>> "id" columns, I realized that in order to be able to affix notes
> > >>>> equally to a person, a company, a product, etc., I wanted to have all
> > >>>> of these disparate tables pull their IDs from a common table holding a
> > >>>> single column, a column of "trackable object IDs".  Sort of like the
> > >>>> POID concept used for certain concerns 
> > >>>> inhttp://www.agiledata.org/essays/mappingObjects.html.
>
> > >>>> Seemed to me a simple way to make that work, without having to build a
> > >>>> bunch of ungainly trigger machinery, is make all of these tables
> > >>>> inherit from that common ID table; thus a joined table inheritance
> > >>>> setup.  I successfully scripted all of the changes necessary so that
> > >>>> instead of their old ID columns, each table's ID column now is still
> > >>>> its primary key but is also a foreign key to the common ID table.
>
> > >>> oh.   OK no, I wouldn't use "joined inheritance" for a "cross-cutting" 
> > >>> concern.  This is the polymorphic association pattern, which from a 
> > >>> database table perspective, looks the same in fact.   But the "cross 
> > >>> cutting" concern is modeled at the ORM level via relationship.  The 
> > >>> blog post is extremely old at this point but it should get the idea 
> > >>> across:  
> > >>> http://techspot.zzzeek.org/2007/05/29/polymorphic-associations-with-s...
>
> > >>> Also if the question about "using the ORM or not" refers to just the 
> > >>> activity of migrating the data to the new structure, I'd possibly skip 
> > >>> the ORM for a migration, since its a single operation that has to work 
> > >>> only once.   It sort of depends on what seems more straightforward and 
> > >>> also the number of rows in play (if it were millions, the migration 
> > >>> might need to be composed entirely as SQL statements without any need 
> > >>> to load into memory, for example).
>
> > >>>> At that point I had sort of "Frankensteined" a joined-table
> > >>>> inheritance situation... I had managed to do all of the constraint
> > >>>> dropping and adding that was needed, I managed to keep all of the rows
> > >>>> in most of the tables (only had to rebuild some of them), and
> > >>>> everything was peachy.  Now a given ID of any row within any of these
> > >>>> six tables, is unique over all six of the tables.  Thus notes,
> > >>>> tickets, whatever other cross-cutting deals, can be attached to such
> > >>>> unique IDs or groups thereof.
>
> > >>>> The only remaining problem was that the parent table actually needs
> > >>>> more than just the ID column.  It needs the discriminator column if
> > >>>> I'm going to really handle this as joined-table inheritance.
> > >>>> Everything else is in place except the discriminator column is not set
> > >>>> for any of my existing rows that made it through this refactoring.
> > >>>> The new setup works perfectly for newly added people, companies,
> > >>>> items, products, etc... the ID is assigned and inherited, the
> > >>>> discriminator is assigned.  (Of course.)  But I need a way to get in
> > >>>> there and set the discriminator column for my _existing_ rows that
> > >>>> came through from before.
>
> > >>>> I suppose I could just go with Concrete Table inheritance, but the
> > >>>> added difficulties with relationships are less enticing.  Intuitively
> > >>>> the joined table idea seems to fit.
>
> > >>>> Should I just take a deep breath and get this done without the ORM?  I
> > >>>> appreciate your answer regarding pre-0.7 vs. 0.7 approaches, that's
> > >>>> the sort of stuff I was looking for when I went ahead and asked this
> > >>>> question rather than quietly working around it.
>
> > >>>> Your answer also just jogged my brain in a way that I failed to do
> > >>>> last night.  I could just delete and re-insert each of these pre-
> > >>>> existing rows that I need to fix up... now that's blindingly obvious.
> > >>>> I welcome any commentary, though, on the sanity or insanity of my
> > >>>> above paragraphs.  Sqlalchemy rocks...
>
> > >>>> Thanks!
> > >>>> Eric
>
> > >>>>> On Jan 1, 2011, at 9:52 PM, Eric Ongerth wrote:
>
> > >>>>>> I must be doing something wrong but can't find it.
>
> > >>>>>> I'm doing some database refactoring and found a situation where I had
> > >>>>>> to set up a joined-table
>
> ...
>
> read more »

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to