[sqlalchemy] Re: change of discriminator column apparently not saved by session?

2011-01-03 Thread Eric Ongerth
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.

  

[sqlalchemy] Re: change of discriminator column apparently not saved by session?

2011-01-02 Thread Eric Ongerth
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 in 
http://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.

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 inheritance structure after the fact, with
  some of the tables already populated.  I created (successfully) a
  script that got all of the primary and foreign keys right on all the
  child tables and the parent table, and now I just need to correctly
  populate the discriminator column on the parent table.

  Each row of the parent table is referenced by exactly one row from one
  of the six child tables.  So i'm iterating through all child objects
  (yes, doing this via the sa ORM) and setting the value of the
  discriminator appropriately.  Then I commit the Session.  Afterward, I
  go and look at the parent table directly using pgAdmin and I see that
  the new values in the discriminator column were not saved.  That's
  strange because I didn't get an error either, nor am I doing anything
  that would mask an error.

  So I thought maybe the discriminator column on the parent table in a
  joined-table inheritance scenario is just not watched by the Session /
  UOW.  I thought maybe it assumes that this column would only,
  normally, be set during object instantiation and would typically not
  change for the lifetime of the object and its associated database
  rows.  So I tried manually dirtying the object using
  instance_state(obj).modified=True before committing the Session.
  Still no success, 

Re: [sqlalchemy] Re: change of discriminator column apparently not saved by session?

2011-01-02 Thread Michael Bayer

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 in 
 http://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-sqlalchemy/

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 inheritance structure after the fact, with
 some of the tables already populated.  I created (successfully) a
 script that got all of the primary and foreign keys right on all the
 child tables and the parent table, and now I just need to correctly
 populate the discriminator column on the parent 

[sqlalchemy] Re: change of discriminator column apparently not saved by session?

2011-01-02 Thread Eric Ongerth
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 

[sqlalchemy] Re: change of discriminator column apparently not saved by session?

2011-01-02 Thread Eric Ongerth
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.


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 

Re: [sqlalchemy] Re: change of discriminator column apparently not saved by session?

2011-01-02 Thread Michael Bayer

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, 

[sqlalchemy] Re: change of discriminator column apparently not saved by session?

2011-01-02 Thread Eric Ongerth
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.