Responding to myself.  As I wrote the first message, I started thinking 
how just deleting the FK after metadata.create_all() wouldn't be so bad 
and now I think that's a pretty good solution.

Randall

Randall Smith wrote:
> Michael Bayer wrote:
>> I should learn to explain better what "syncrules" are about, so heres
>> an attempt:
>>
>> when you have a table A and a table B, and then a mapping relationship
>> between A and B, theres a join condition set up between the two tables.
>>  By default, it draws from the foreign keys of the tables.
>> Alternatively, you can send "primaryjoin" and optionally
>> "secondaryjoin" (if you have a secondary association table in the
>> middle) to specify this join condition manually.
>>
>> Lets take a join condition of A.a_id=B.a_id.   That means when I create
>> an instance mapped to table "A", it will have a primary key attribute
>> "a_id".  An instance mapped to table "B" will have an attribute "a_id"
>> as well which contains the id of its related "A" object.
>>
>> The syncrule generated for this relationship is then "after saving an
>> instance of "A", copy the value of its "a_id" attribute to the "a_id"
>> attribute on all the "B" elements attached to it".  The syncrule is
>> generated in the sqlalchemy.orm.sync module, and traverses across the
>> join conditions (i.e. the "primaryjoin") in order to generate the rule.
>>
>> If the syncrules execute and dont manage to find any rules that map
>> attributes from "A" to "B", its clear that the mapper has no way of
>> relating in the database the "A"/"B" relationship.  So for now, it
>> assumes that its an error.  Since if you have made a relation() from A
>> to B, the mapper needs to be able to persist it.
>>
>> So when you get that error message, it means the join conditions are
>> not taking into account the two tables involved in such a way that the
>> syncrules can figure it out, usually because the two tables are related
>> via an intermediary table which is stuck in the middle of the join (it
>> doesnt handle that).
> 
> I have a setup similar to this and would prefer not to use an 
> association table.
> 
> A, B and C are tables.
> 
> A  <-FK  B(intermediate)  ->  C
> 
> C could possibly be truncated and restored so I don't want an FK 
> deleting or restricting records in B.
> 
> Table B does not have a Foreign Key defined for C because I don't want 
> changes in C to affect B. Is there a way to define the foreign key such 
> that it doesn't add a FK constraint to the database, but understands the 
> relationship?
> 
> I'm creating A and B via metadata.create_all() and I don't want a FK for 
> B->C created, but do want sqlalchemy to know about the relationship so 
> that I could define it like:
> 
>       mapper(AClass, A, properties={'C' : relation(C, secondary=B)})
> 
> So the only difference is that there would be no Database FK, but I 
> don't want to resort to manually deleting it if I dont' have to. Is 
> there a nice way to do this?
> 
> Randall
> 
> 
>> The syncrules are only needed for saving objects, not loading them,
>> which is why I added the "viewonly" flag to relations in case you
>> really want a relation() that uses an unusual join, and you dont care
>> about the mapper being able to persist it.
>>
>>
> 
> 
> > 
> 


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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