On 7/3/14, 6:15 PM, Mike Bayer wrote:
> On 7/3/14, 5:45 PM, Paul Molodowitch wrote:
>> I noticed that sqlalchemy now properly sets the onpudate / ondelete
>> properties of foreign keys when reflecting tables:
>>
>> https://bitbucket.org/zzzeek/sqlalchemy/issue/2183/support-on-delete-update-in-foreign-key
>>
>> However, it doesn't seem to set the cascade properties of
>> relationships to reflect these properties. ie, if the Child table
>> references the Parent table with a foreign key that has "ON DELETE
>> CASCADE", and the reference column does not allow NULL, when you
>> delete a parent table that has children, you will get an error,
>> because sqlalchemy will try to set the child's ref to NULL.
>>
>> ideally we should add "delete" in the relationship's cascade
>> properties (and probably delete-orphan as well), and then set
>> passive_updates=True.
>>
>> Or am I missing something obvious  / doing something wrong / etc?
> the configuration of a Column or ForeignKey has never been directly
> linked to how relationship() gets configured.   passive_updates in
> particular is a thorny one as not every database supports ON UPDATE
> CASCADE, but for that matter not every database even supports ON DELETE
> CASCADE.   There's also lots of variants to ON UPDATE and ON DELETE and
> SQLAlchemy has no awareness of any of these directly.
>
> If we were to explore some automatic configuration of relationship based
> on these attributes of ForeignKey, it would take place within the
> automap extension: see
> http://docs.sqlalchemy.org/en/rel_0_9/orm/extensions/automap.html. 
>
> There are also recipes such that both relationship() and ForeignKey()
> are generated at once, these are also good places for this kind of thing
> to happen.  See
> https://bitbucket.org/zzzeek/pycon2014_atmcraft/src/a6d96575bc497ce0c952bb81db9c05d054c98bb5/atmcraft/model/meta/orm.py?at=master
> for an example of this, I still am thinking of a way recipes like this
> could also be integrated into SQLAlchemy, possibly as an enhancement to
> declarative.

or a flag like "autoconfigure=True" on relationship().   this would also
set up innerjoin=True for joined eager loading if the FK is not null.  
if the primaryjoin condition is too complex (has mulitple FKs),
autoconfigure would raise an exception.


-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to