Hi again Oleg.

This must be a problem between my chair and my keyboard. :/

Anyway, I managed to have the results I wanted with the following code:
#############################
# -*- coding: utf-8 -*-
import sqlobject


class A (sqlobject.SQLObject):
    name = sqlobject.StringCol ()
    b = sqlobject.RelatedJoin ('B')

class B (sqlobject.SQLObject):
    name = sqlobject.StringCol ()
    a = sqlobject.RelatedJoin ('A', intermediateTable='b_a')
    aa = sqlobject.ManyToMany ('A', intermediateTable='b_a')

if __name__ == "__main__":
    # Use the same DB connection for all the thread.
    sqlobject.sqlhub.threadConnection = sqlobject.connectionForURI
('sqlite:///tmp/testa.db')
    A.createTable ()
    B.createTable ()

    a1 = A (name='a1')
    a2 = A (name='a2')
    a3 = A (name='a2')
    b1 = B (name='b1')

    a1.addB (b1)
    b1.addA (a2)
    b1.addA (a3)

    b = B.selectBy (name='b1').getOne ()
    print ("a1 = " + str (a1))
    print ("b = " + str (b))
    print ("b.a = " + str (b.a))
    print ("b.aa = " + str (b.aa))
#############################

Running it results in the following output:
a1 = <A 1 name='a1'>
b = <B 1 name='b1'>
b.a = [<A 2 name='a2'>, <A 3 name='a2'>]
b.aa = SELECT a.id, a.name FROM a, b_a WHERE (((a.id) = (b_a.a_id))
AND ((b_a.b_id) = (1)))

The scheme in the database is:
CREATE TABLE a (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE a_b (a_id INT NOT NULL, b_id INT NOT NULL);
CREATE TABLE b (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE b_a (b_id INT NOT NULL, a_id INT NOT NULL);

Which is what I expected it to be.

The trick I'm using is defining ManyToMany and RelatedJoin to use the
same intermediate table. It's not pretty, but it works.

Do I really have to use such trick? Or am I miss reading the documentation?

Thanks in advance,

Miguel Tavares

2009/8/12 Oleg Broytmann <p...@phd.pp.ru>:
> On Wed, Aug 12, 2009 at 02:43:50PM +0100, Miguel Tavares wrote:
>> a1 = A ()
>> a2 = A ()
>> a3 = A ()
>> b1 = B ()
>>
>> a1.add (b1)
>> b1.add (a2)
>> b1.add (a3)
>
> a1 = A()
> a2 = A()
> a3 = A()
> b1 = B()
>
> a1.addB1(b1)
> b1.addA1(a1)
> b1.addA2(a2)
>
>  5/QueryR  :  INSERT INTO a VALUES (NULL)
>  6/QueryR  :  SELECT NULL FROM a WHERE ((a.id) = (1))
>  7/QueryR  :  INSERT INTO a VALUES (NULL)
>  8/QueryR  :  SELECT NULL FROM a WHERE ((a.id) = (2))
>  9/QueryR  :  INSERT INTO a VALUES (NULL)
> 10/QueryR  :  SELECT NULL FROM a WHERE ((a.id) = (3))
> 11/QueryR  :  INSERT INTO b VALUES (NULL)
> 12/QueryR  :  SELECT NULL FROM b WHERE ((b.id) = (1))
> 13/QueryR  :  INSERT INTO a1_b1 (a_id, b_id) VALUES (1, 1)
> 14/QueryR  :  INSERT INTO a1_b1 (b_id, a_id) VALUES (1, 1)
> 15/QueryR  :  INSERT INTO a2_b2 (b_id, a_id) VALUES (1, 2)
>
>   M?
>
> Oleg.
> --
>     Oleg Broytmann            http://phd.pp.ru/            ...@phd.pp.ru
>           Programmers don't die, they just GOSUB without RETURN.
>
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
> trial. Simplify your report design, integration and deployment - and focus on
> what you do best, core application coding. Discover what's new with
> Crystal Reports now.  http://p.sf.net/sfu/bobj-july
> _______________________________________________
> sqlobject-discuss mailing list
> sqlobject-discuss@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss
>

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
sqlobject-discuss mailing list
sqlobject-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss

Reply via email to