Thread: [SQLObject] What is 'The Way' to do many-to-many self references?
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Soni B. <be...@ai...> - 2006-01-18 01:13:59
|
Hello, I'm tinkering with many-to-many relationships and more specific with self references. Let's stick with a bunch of Tradesmen (just as an example). One Tradesman knows several suppliers and purchasers. And all of them are tradesmen. This gives us the following scheme: ------------- * purchaser | Tradesman |----------- ------------- | *| | supplier | | ------------------ My solution so far is: class Tradesman(SQLObject): name = StringCol(alternateID = True) suppliers = RelatedJoin('Tradesman', addRemoveName = 'Supplier', joinColumn = 'purchaser', otherColumn = 'supplier') purchasers = RelatedJoin('Tradesman', addRemoveName = 'Purchaser', joinColumn = 'supplier', otherColumn = 'purchaser') This way it seems to work smoothly. The only drawback is that table creation fails with an error due to the attempt to create the table 'tradesman_tradesman' twice. Is this the most convenient way to do self references, and if yes, is there a way to prevent the second attempt to create 'tradesman_tradesman'? Cheers, -- Soni Bergraj (I'm puzzled if the 'How can I join a table with itself?' from the FAQ is intended to address this, i did not find anything about Alias on the SQLBuilder docs) |
From: j.kartnaller <j.k...@ro...> - 2006-01-18 06:49:32
|
Soni Bergraj wrote: > Hello, > I'm tinkering with many-to-many relationships and more specific with > self references. > > Let's stick with a bunch of Tradesmen (just as an example). One > Tradesman knows several suppliers and purchasers. And all of them are > tradesmen. > > This gives us the following scheme: > > ------------- * purchaser > | Tradesman |----------- > ------------- | > *| | > supplier | | > ------------------ > > My solution so far is: > > class Tradesman(SQLObject): > name = StringCol(alternateID = True) > > suppliers = RelatedJoin('Tradesman', > addRemoveName = 'Supplier', > joinColumn = 'purchaser', otherColumn = 'supplier') > > purchasers = RelatedJoin('Tradesman', > addRemoveName = 'Purchaser', > joinColumn = 'supplier', otherColumn = 'purchaser') > > This way it seems to work smoothly. The only drawback is that table > creation fails with an error due to the attempt to create the table > 'tradesman_tradesman' twice. > > Is this the most convenient way to do self references, and if yes, is > there a way to prevent the second attempt to create 'tradesman_tradesman'? Use intermediateTable to tell sqlobject to use a different table name. Jürgen |
From: Oleg B. <ph...@ma...> - 2006-01-18 10:03:29
|
On Wed, Jan 18, 2006 at 02:21:31AM +0100, Soni Bergraj wrote: > Is this the most convenient way to do self references, and if yes, is One of. The other one is Alias. > there a way to prevent the second attempt to create 'tradesman_tradesman'? How do you create tables? > (I'm puzzled if the 'How can I join a table with itself?' from the FAQ > is intended to address this, i did not find anything about Alias on the > SQLBuilder docs) Because the FAQ is the only place where Alias is documented. Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Soni B. <be...@ai...> - 2006-01-18 15:11:59
|
ph...@ma... wrote: > On Wed, Jan 18, 2006 at 02:21:31AM +0100, Soni Bergraj wrote: > >>Is this the most convenient way to do self references, and if yes, is > > > One of. The other one is Alias. I like the idea to have some random_tradesman and get its customers and suppliers just with random_tradesman.customers and random_tradesman.suppliers. This is not to achieve with Alias, right? >>there a way to prevent the second attempt to create 'tradesman_tradesman'? > > > How do you create tables? tg-admin sql create, I think this delegates to sqlobject-admin) > Because the FAQ is the only place where Alias is documented. > > Oleg. The FAQ (http://sqlobject.org/FAQ.html#how-can-i-join-a-table-with-itself) misses the point, this section of the main docs (http://sqlobject.org/SQLObject.html#how-can-i-join-a-table-with-itself) is more useful on the topic :) Cheers, -- Soni Bergraj |
From: Oleg B. <ph...@ma...> - 2006-01-18 15:25:26
|
On Wed, Jan 18, 2006 at 04:11:29PM +0100, Soni Bergraj wrote: > I like the idea to have some random_tradesman and get its customers and > suppliers just with random_tradesman.customers and > random_tradesman.suppliers. Create properties. Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Soni B. <be...@ai...> - 2006-01-26 00:49:17
|
> Create properties. Finally i learned (from the source) that there is indeed a solution to my problem. Using createRelatedTable=False with RelatedJoin works just fine. Is there any particular reason that this is not documented or shall i fill a bug? Cheers, -- Soni Bergraj |
From: Oleg B. <ph...@ph...> - 2006-01-26 09:43:45
|
On Thu, Jan 26, 2006 at 01:48:32AM +0100, Soni Bergraj wrote: > Is there any particular reason that this is not documented There are many things that aren't documented yet. Most people - either SQLObject developers or users prefer to write code instead of documentation. > shall i fill a bug? Better file a documentation patch! Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |