Timo | 29 Dec 2011 00:25
Picon

Fwd: Reference to one of multiple tables

Sorry, forwarding to list. Overlooked the reply-all button in Gmail interface.


2011/12/28 Petr Jakeš <petr.jakes <at> tpc.cz>

I'm stuck at a part of my program, but I'm not sure if this is the right place to ask. Excuses if it's not.

I have a DVD object which can have different statusses, like "on loan", "sold", etc... A dvd can only have 1 status at the time, but I'm confused about how to link it to 1 table only so I can access the correct status with dvd.status .

Here's an example:

class DVD(SQLObject):
    status = ???? # Should be sold or onloan data
    # ... special "dvd" data

class Sold(SQLObject):
    dvd = ForeignKey('DVD')
    # ... special "sold" data

class OnLoan(SQLObject):
    dvd = ForeignKey('DVD')
    # ... special "on loan" data

Why not just one table and the sqlmeta?

connection = connectionForURI('sqlite:/:memory:')

class DVD(SQLObject):
    _connection = connection
    title = StringCol(default="")
    inShelve = BoolCol(default=True)
    sold = BoolCol(default=False)
    onLoan = BoolCol(default=False)
    def _get_statuss(self):
        if self.sold:
            return "sold"
        elif self.onLoan:
            return "onLoan"
        elif self.inShelf:
            return "inShelf"
DVD.createTable()           
myFirstDVD = DVD(title="Timo")
print myFirstDVD.statuss


The statusses have all kind of information too, like price and buyer for sold dvd's and return date for example in the loaned status.
But your example got me thinking. Is something like the following valid? (working example)
from sqlobject import *


connection = connectionForURI('sqlite:/:memory:')

class Sold(SQLObject):
    _connection = connection

    dvd = ForeignKey('DVD')
    buyer = StringCol(default="")

class OnLoan(SQLObject):
    _connection = connection

    dvd = ForeignKey('DVD')
    returnDate = DateCol(default=None)


class DVD(SQLObject):
    _connection = connection
    title = StringCol(default="")
    inShelve = BoolCol(default=True)
    sold = SingleJoin('Sold', joinColumn='dvd')
    onLoan = SingleJoin('OnLoan', joinColumn='dvd')
    def _get_statuss(self):
        if self.inShelf:
            return
        elif self.sold is not None:
            return self.sold
        elif self.onLoan is not None:
            return self.onLoan
DVD.createTable() 
Sold.createTable()
OnLoan.createTable()     
myFirstDVD = DVD(title="Timo")
s = Sold(dvd=myFirstDVD)
print myFirstDVD.statuss

But then I should handle the inShelve bool value whenever self.sold or self.onLoan are changed.

Greets and thanks,
Timo
 
HTH

Petr


------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual 
desktops for less than the cost of PCs and save 60% on VDI infrastructure 
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
_______________________________________________
sqlobject-discuss mailing list
sqlobject-discuss <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss
Petr Jakeš | 29 Dec 2011 06:05
Picon

Re: Fwd: Reference to one of multiple tables


But your example got me thinking. Is something like the following valid? (working example)
from sqlobject import *

If it is working, then it is (IMHO) valid :D
The DB structure is completely up to you of course. But think twice about the DB model. When the production data is in the database already, it is a pain to change the DB structure.
 


But then I should handle the inShelve bool value whenever self.sold or self.onLoan are changed.

To keep the logic in the database is up to you. Of course you can automatize it some way (directly in the DB, using DB machinery - computed columns in the Firebird for example, which is IMHO not the best way to go but it works)

Or maybe you can try something using:

def _set_soldCarefully(self, value):
    self.sold = True
    self.onLoan = False
    self.inShelve = False

Regards

Petr


------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual 
desktops for less than the cost of PCs and save 60% on VDI infrastructure 
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
_______________________________________________
sqlobject-discuss mailing list
sqlobject-discuss <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss
Timo | 29 Dec 2011 15:25
Picon

Re: Fwd: Reference to one of multiple tables


2011/12/29 Petr Jakeš <petr.jakes <at> tpc.cz>

But your example got me thinking. Is something like the following valid? (working example)
from sqlobject import *

If it is working, then it is (IMHO) valid :D
The DB structure is completely up to you of course. But think twice about the DB model. When the production data is in the database already, it is a pain to change the DB structure.
Hehe, that was what I meant with "valid". I wrote this application about 2 years ago (without SQLObject), and has become a great mess. So I'm trying to start over and do /the right thing/.
 
 


But then I should handle the inShelve bool value whenever self.sold or self.onLoan are changed.

To keep the logic in the database is up to you. Of course you can automatize it some way (directly in the DB, using DB machinery - computed columns in the Firebird for example, which is IMHO not the best way to go but it works)

Or maybe you can try something using:
I think I'm going for the _set_status() and _get_status() approach. Write some code which gets and sets the correct table in these methods, so I can set/get the status in the program without hassle.

Thanks for your help,
Timo
 

def _set_soldCarefully(self, value):
    self.sold = True
    self.onLoan = False
    self.inShelve = False

Regards

Petr



------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual 
desktops for less than the cost of PCs and save 60% on VDI infrastructure 
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
_______________________________________________
sqlobject-discuss mailing list
sqlobject-discuss <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss
Frank Wagner | 29 Dec 2011 15:48
Picon

Re: Fwd: Reference to one of multiple tables

Hi,

i think the way to do this is described in:
http://sqlobject.org/Inheritance.html

class Status(InheritableSQLObject):
    # ... general status info

class Sold(Status):
    #... sold-specific info

class OnLoan(Status):
    #... onloan-specific info

class DVD(SQLObject):
    status = ForeignKey("Status")
    # ... special "dvd" data

does this help?

Regards,
Frank

On Thu, Dec 29, 2011 at 15:25, Timo <timomlists <at> gmail.com> wrote:
>
> 2011/12/29 Petr Jakeš <petr.jakes <at> tpc.cz>
>>
>>
>>> But your example got me thinking. Is something like the following valid?
>>> (working example)
>>> from sqlobject import *
>>>
>> If it is working, then it is (IMHO) valid :D
>> The DB structure is completely up to you of course. But think twice about
>> the DB model. When the production data is in the database already, it is a
>> pain to change the DB structure.
>
> Hehe, that was what I meant with "valid". I wrote this application about 2
> years ago (without SQLObject), and has become a great mess. So I'm trying to
> start over and do /the right thing/.
>
>>
>>
>>>
>>>
>>>
>>> But then I should handle the inShelve bool value whenever self.sold or
>>> self.onLoan are changed.
>>
>>
>> To keep the logic in the database is up to you. Of course you can
>> automatize it some way (directly in the DB, using DB machinery - computed
>> columns in the Firebird for example, which is IMHO not the best way to go
>> but it works)
>>
>> Or maybe you can try something using:
>
> I think I'm going for the _set_status() and _get_status() approach. Write
> some code which gets and sets the correct table in these methods, so I can
> set/get the status in the program without hassle.
>
> Thanks for your help,
> Timo
>
>>
>>
>> def _set_soldCarefully(self, value):
>>     self.sold = True
>>     self.onLoan = False
>>     self.inShelve = False
>>
>> Regards
>>
>> Petr
>>
>>
>>
>>
>>
>
>
> ------------------------------------------------------------------------------
> Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
> infrastructure or vast IT resources to deliver seamless, secure access to
> virtual desktops. With this all-in-one solution, easily deploy virtual
> desktops for less than the cost of PCs and save 60% on VDI infrastructure
> costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
> _______________________________________________
> sqlobject-discuss mailing list
> sqlobject-discuss <at> lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss
>

------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual 
desktops for less than the cost of PCs and save 60% on VDI infrastructure 
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
_______________________________________________
sqlobject-discuss mailing list
sqlobject-discuss <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss

Gmane