Can anyone help me with this interesting (to me) relationship definition in 
sqla.


I have some already defined data, not by me, that has, for each user, a 
foreign table of contact numbers, where the highest contact number is the 
one to use. 


For example, users:

Harry, 1081, and Bob 1082

mobiles:

1081;"0412590410", 1082;"0426236245", 1082;"0416253647"


With:

SELECT u.id, u.first_name, m1.mobile

  FROM model.tbl_users as u

  JOIN model.tbl_mobiles as m1

  ON m1.id = (select max(m2.id) from model.tbl_mobiles as m2 where 
m2.user_id = u.id)


gives:


1081;"Harry";"0412590410"

1082;"Bob";"0416253647"


What I want to do is model a relationship on the user (eventually with 
no_list) where the field is simply the highest number.


I have been hacking away at a try:


mobile = relationship("Mobile",

                               primaryjoin="Mobile.id == 
select([func.max(Mobile.id)]).where(Mobile.user_id == User.id).as_scalar()",

                              viewonly=True)


but I can't seem to get the join right. I always get:


ArgumentError: Relationship User.mobile could not determine any unambiguous 
local/remote column pairs based on join condition and remote_side 
arguments. Consider using the remote() annotation to accurately mark those 
elements of the join condition that are on the remote side of the 
relationship.


I have tried all sorts of somewhat random remote() and foriegn() bits 
around the query to no avail.


I have a complete example here:

https://gist.github.com/mianos/42cf15928f27cc9dfde9996d2e593e78


Ideas? I am sure it's possible. At the moment I am just using a "orderby 
desc" on the relationship and using [0] to get the first.

-- 
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 https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to