Julien Cigar <jci...@ulb.ac.be> wrote:

> On Sun, Mar 01, 2015 at 01:53:30PM +0100, Julien Cigar wrote:
>> On Fri, Feb 27, 2015 at 11:38:05PM -0500, Michael Bayer wrote:
>>>> On Feb 26, 2015, at 5:56 AM, Julien Cigar <jci...@ulb.ac.be> wrote:
>>>> 
>>>>> On Wed, Feb 25, 2015 at 06:10:55PM -0500, Michael Bayer wrote:
>>>>> 
>>>>> 
>>>>> Julien Cigar <jci...@ulb.ac.be> wrote:
>>>>> 
>>>>>>> On Thu, Feb 19, 2015 at 11:31:10AM -0500, Michael Bayer wrote:
>>>>>>> Julien Cigar <jci...@ulb.ac.be> wrote:
>>>>>>> 
>>>>>>>>> On Thu, Feb 19, 2015 at 02:45:43PM +0100, Julien Cigar wrote:
>>>>>>>>> Hello,
>>>>>>>>> 
>>>>>>>>> I'm using SQLAlchemy 0.9.8 with PostgreSQL and the reflection feature 
>>>>>>>>> of
>>>>>>>>> SQLAlchemy.
>>>>>>>>> 
>>>>>>>>> I have the following tables (only relevant parts are show):
>>>>>>>>> https://gist.github.com/silenius/390bb9937490730741f2
>>>>>>>>> 
>>>>>>>>> and the "problematic" mapper is the one of my association object:
>>>>>>>>> https://gist.github.com/silenius/1559a7db65ed30a1b079
>>>>>>>>> 
>>>>>>>>> SQLAlchemy complains with the following error:
>>>>>>>>> "sqlalchemy.exc.InvalidRequestError: One or more mappers failed to
>>>>>>>>> initialize - can't proceed with initialization of other mappers.
>>>>>>>>> Original exception was: Could not locate any simple equality 
>>>>>>>>> expressions
>>>>>>>>> involving locally mapped foreign key columns for primary join 
>>>>>>>>> condition
>>>>>>>>> 'pool_invite_result.pool_invite_pool_id = pool_invite.pool_id AND
>>>>>>>>> pool_invite.pool_id = pool.id' on relationship PoolAccountResult.pool.
>>>>>>>>> Ensure that referencing columns are associated with a ForeignKey or
>>>>>>>>> ForeignKeyConstraint, or are annotated in the join condition with the
>>>>>>>>> foreign() annotation. To allow comparison operators other than '==', 
>>>>>>>>> the
>>>>>>>>> relationship can be marked as viewonly=True."
>>>>>>>>> 
>>>>>>>>> The problem is that in the PoolAccountResult mapper I want a
>>>>>>>>> relationship to the Pool but the link is made through an intermediate
>>>>>>>>> table (pool_invite) ..
>>>>>>>>> 
>>>>>>>>> Any idea how to handle this with SQLAlchemy ?
>>>>>>>>> 
>>>>>>>>> Thanks :)
>>>>>>>>> 
>>>>>>>>> Julien
>>>>>>>> 
>>>>>>>> ... and I'm answering to myself: it seems to work with
>>>>>>>> https://gist.github.com/silenius/e7e59c96a7277fb5879f 
>>>>>>>> 
>>>>>>>> does it sound right ?
>>>>>>> 
>>>>>>> Sure.  Also, you could use automap which does figure these out in 
>>>>>>> simple cases: 
>>>>>>> http://docs.sqlalchemy.org/en/rel_0_9/orm/extensions/automap.html
>>>>>> 
>>>>>> always with this, any idea why SQLAlchemy inserts NULL and
>>>>>> NULL for my two relationship (line 51-79) instead of the pool_obj and
>>>>>> dup.owner ids (line 89-90), https://dpaste.de/1Trz ..?
>>>>> 
>>>>> getting a 404 on that link.
>>>> 
>>>> Hi Mike,
>>>> 
>>>> Thanks for your help!
>>>> 
>>>> I took the time to make a complete test case, available from here
>>>> https://gist.github.com/silenius/96d6ed2544d14753853f
>>> 
>>> That's a very strange use of secondary, and I'm not sure I understand the 
>>> rationale for an odd schema like this.   It should be pretty clear that 
>>> when a table is set up as secondary, it is only used as a linkage between 
>>> those immediate classes and there are no features to track the state of 
>>> this table otherwise as though it were a mapped class.   Using the same 
>>> secondary table in two unrelated relationships is not the intended use.  
>> 
>> It's true that the schema is a little odd, in SQL it translates as
>> https://gist.github.com/silenius/6a67edc9e78101faef96 (simplified).
>> 
>> The scenario is that an "account" can be invited to a "pool" (table
>> pool_invite at line 45-57) and can submit one (or more) "results" for 
>> that invitation (I have to record the submitted date too). This scenario
>> is a good candidate for an association object, the only thing is that
>> later someone can decide to remove all those submissions, but I have to
>> remember that there was an invitation. That's why I have references to
>> the table pool_invite in pool_invite_result (line 71-73) instead of pool
>> and result :)
>> 
>>> Nevertheless, if you manipulate between Pool and User, that has no impact 
>>> whatsoever on PoolInviteResult... Especially since we're dealing with a 
>>> "secondary" table and not a first class mapped entity.    You should add 
>>> event listeners as needed on attributes such that when an in-Python change 
>>> occurs between Pool and User, the desired change occurs for 
>>> PoolInviteResult as well.
>> 
>> It has impacts, if I remove a Pool or an User all invitations
>> (pool_invite) must be removed too, as well as all submissions
>> (pool_invite_result).
>> 
>> Anyway, I'll take a look at ORM Events :) thanks!
> 
> Another thing that is a little cloudy to me is why it doesn't work with
> an alternate primaryjoin condition, such as
> https://gist.github.com/silenius/300729e312dad6b9b847

the relationship() has a simple job. It is given table A and table B, and it
needs to locate where columns from A are matched up to columns from B. The
relationship in that gist does not have this pattern within the primary join
condition; it is injecting the “pool_invite” table as an association table,
which is what the “secondary” argument is used for. This argument tells
relationship() that instead of searching for direct column comparisons
between A and B, it should look for comparisons between A and ATOB, and ATOB
and B.



>>>> I'm using PostgreSQL, and I checked that all constraints are properly
>>>> created on server-side but I haven't checked with sqllite:// 
>>>> 
>>>>>> Thanks,
>>>>>> Julien
>>>>>> 
>>>>>> 
>>>>>>>>> -- 
>>>>>>>>> Julien Cigar
>>>>>>>>> Belgian Biodiversity Platform (http://www.biodiversity.be)
>>>>>>>>> PGP fingerprint: EEF9 F697 4B68 D275 7B11  6A25 B2BB 3710 A204 23C0
>>>>>>>>> No trees were killed in the creation of this message.
>>>>>>>>> However, many electrons were terribly inconvenienced.
>>>>>>>>> 
>>>>>>>>> -- 
>>>>>>>>> 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 sqlalchemy+unsubscr...@googlegroups.com.
>>>>>>>>> To post to this group, send email to sqlalchemy@googlegroups.com.
>>>>>>>>> Visit this group at http://groups.google.com/group/sqlalchemy.
>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> -- 
>>>>>>>> Julien Cigar
>>>>>>>> Belgian Biodiversity Platform (http://www.biodiversity.be)
>>>>>>>> PGP fingerprint: EEF9 F697 4B68 D275 7B11  6A25 B2BB 3710 A204 23C0
>>>>>>>> No trees were killed in the creation of this message.
>>>>>>>> However, many electrons were terribly inconvenienced.
>>>>>>>> 
>>>>>>>> -- 
>>>>>>>> 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 sqlalchemy+unsubscr...@googlegroups.com.
>>>>>>>> To post to this group, send email to sqlalchemy@googlegroups.com.
>>>>>>>> Visit this group at http://groups.google.com/group/sqlalchemy.
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>> 
>>>>>>> -- 
>>>>>>> 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 sqlalchemy+unsubscr...@googlegroups.com.
>>>>>>> To post to this group, send email to sqlalchemy@googlegroups.com.
>>>>>>> Visit this group at http://groups.google.com/group/sqlalchemy.
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>> 
>>>>>> -- 
>>>>>> Julien Cigar
>>>>>> Belgian Biodiversity Platform (http://www.biodiversity.be)
>>>>>> PGP fingerprint: EEF9 F697 4B68 D275 7B11  6A25 B2BB 3710 A204 23C0
>>>>>> No trees were killed in the creation of this message.
>>>>>> However, many electrons were terribly inconvenienced.
>>>>>> 
>>>>>> -- 
>>>>>> 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 sqlalchemy+unsubscr...@googlegroups.com.
>>>>>> To post to this group, send email to sqlalchemy@googlegroups.com.
>>>>>> Visit this group at http://groups.google.com/group/sqlalchemy.
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>> 
>>>>> -- 
>>>>> 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 sqlalchemy+unsubscr...@googlegroups.com.
>>>>> To post to this group, send email to sqlalchemy@googlegroups.com.
>>>>> Visit this group at http://groups.google.com/group/sqlalchemy.
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>> 
>>>> -- 
>>>> Julien Cigar
>>>> Belgian Biodiversity Platform (http://www.biodiversity.be)
>>>> PGP fingerprint: EEF9 F697 4B68 D275 7B11  6A25 B2BB 3710 A204 23C0
>>>> No trees were killed in the creation of this message.
>>>> However, many electrons were terribly inconvenienced.
>>>> 
>>>> -- 
>>>> 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 sqlalchemy+unsubscr...@googlegroups.com.
>>>> To post to this group, send email to sqlalchemy@googlegroups.com.
>>>> Visit this group at http://groups.google.com/group/sqlalchemy.
>>>> For more options, visit https://groups.google.com/d/optout.
>>> 
>>> -- 
>>> 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 sqlalchemy+unsubscr...@googlegroups.com.
>>> To post to this group, send email to sqlalchemy@googlegroups.com.
>>> Visit this group at http://groups.google.com/group/sqlalchemy.
>>> For more options, visit https://groups.google.com/d/optout.
>> 
>> -- 
>> Julien Cigar
>> Belgian Biodiversity Platform (http://www.biodiversity.be)
>> PGP fingerprint: EEF9 F697 4B68 D275 7B11  6A25 B2BB 3710 A204 23C0
>> No trees were killed in the creation of this message.
>> However, many electrons were terribly inconvenienced.
>> 
>> -- 
>> 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 sqlalchemy+unsubscr...@googlegroups.com.
>> To post to this group, send email to sqlalchemy@googlegroups.com.
>> Visit this group at http://groups.google.com/group/sqlalchemy.
>> For more options, visit https://groups.google.com/d/optout.
> 
> 
> 
> -- 
> Julien Cigar
> Belgian Biodiversity Platform (http://www.biodiversity.be)
> PGP fingerprint: EEF9 F697 4B68 D275 7B11  6A25 B2BB 3710 A204 23C0
> No trees were killed in the creation of this message.
> However, many electrons were terribly inconvenienced.
> 
> -- 
> 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 sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to