there's other edges too, like a custom Column subclass, and contents within the 
open-ended info dict, so __conflicts__ keeps this simple.

I've added ticket 2472 for this.


On Apr 19, 2012, at 4:31 PM, Amos wrote:

> 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.
> 

-- 
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