It would be great for declarative to resolve a conflict (perhaps with
a warning) if the column definitions are exactly the same - though I
can see this getting complicated with nested ForeignKey objects, etc.
That said, I really like the idea of exposing the conflict resolution
mechanism to the user. Perhaps, it could even be made simpler by
adding a kwarg to the Column definition:

class MyMixin(object):
    @declared_attr
    def target_id(cls):
        return Column(Integer, ForeignKey('target.id'),
replace_existing=True)

On Apr 18, 7:11 am, Michael Bayer <[email protected]> wrote:
> On Apr 17, 2012, at 8:23 PM, Amos wrote:
>
> > Thanks for the clarification. I did play around with __abstract__ but
> > like you said it doesn't work in the middle of the inheritance chain.
> > The main idea behind this approach is the DRY concept - define the
> > columns/relationships only once and use them interchangeably in any of
> > the derived STI models. This workaround sort of accomplishes that but
> > at the same time restricts you to a hierarchical model, whereas using
> > mixins is much more flexible.
>
> the issue with mixins here is that you essentially have two mixins saying 
> something that conflicts, they both create a Column object with the same 
> name.   One could have a different "info" dict than the other, for example - 
> it would be a surprise for declarative to just pick one, and discard the 
> other.   For declarative to compare them is also something I'd rather not get 
> into as again things like the "info" dict and custom subclasses of Column 
> couldn't necessarily be compared.
>
> But I thought of a possible way to give this capability to you, a new method 
> __conflicts__, like this:
>
> class MyMixin(object):
>     @declared_attr
>     def target_id(cls):
>         return Column(Integer, ForeignKey('target.id'))
>
>     @classmethod
>     def __conflicts__(cls, key, existing, new):
>         if key == 'target_id':
>             return existing
>         else:
>            return None
>
> so basically, instead of declarative raising "column x conflicts with 
> existing" it will first call __conflicts__ on your class (which could be 
> anywhere in the hierarchy), giving your code a chance to resolve.
>
> What I like about this is that declarative's behavioral contract doesn't 
> change at all for anybody, it doesn't have to get into comparing or silent 
> guessing, and the feature itself, which would be very rarely used as this is 
> not a typical use case, would have a decent place for documenting under the 
> "special methods" section of declarative and also be a very simple, two line 
> feature.

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

Reply via email to