What you are saying makes perfect sense.  Thank you for showing me the
light.  The code below incorporates what I think you were saying and
allows me to still test it easily.  Thanks again.  A+++ for the
SQLAlchemy community!!!

class SA_Model(Base):
    __tablename__ = 'test0'
    id = Column(Integer, primary_key=True)
    title = Column(String)
    def __init__(self, title):
        self.title=title

class Model():
    def __init__(self, *args):
        self.session=Session()
        if type(args[0])==int:
            self.instance=self.session.query(SA_Model).get(args[0])
        elif type(args[0])==str:
            self.instance = SA_Model(args[0])
    def commit(self):
        self.session.add(self.instance)
        self.session.commit()

model1=Model('test1')
model1.commit()
id=model1.instance.id
del model1

model2=Model(id)
model2.instance.title='text2'
model2.commit()





On Jan 15, 8:49 pm, "Jackson, Cameron"
<cameron.jack...@thalesgroup.com.au> wrote:
> In the MVC architecture, the application class I mentioned is your 
> controller, and the session is part of it.
>
>
>
>
>
>
>
> -----Original Message-----
> From: sqlalchemy@googlegroups.com [mailto:sqlalchemy@googlegroups.com] On 
> Behalf Of Jackson, Cameron
> Sent: Monday, 16 January 2012 12:45 PM
> To: sqlalchemy@googlegroups.com
> Subject: RE: [sqlalchemy] Re: Initialize model by its primary key.
>
> You are correct that an object should initialise itself, but don't take that 
> to mean that Test0 should be responsible for every use case where a Test0 is 
> going to be created. If you need some logic that says, for example, 'If a 
> Test0 already exists with id x, then return it, otherwise create a new Test0 
> with id x', then that kind of comparison and object creation should be 
> managed outside the class.
>
> The philosophy behind this is that any given Test0 instance shouldn't really 
> have too much control or knowledge of anything outside of its own internal 
> values. Let some other object (your own application class) maintain the 
> collection of objects in memory, and another object again (the session) 
> control the flow of data to/from the database.
>
> Sorry, I'm not sure if I'm being clear here or if I'm rambling a bit. Does 
> any of that make sense to you?
>
> -----Original Message-----
> From: sqlalchemy@googlegroups.com [mailto:sqlalchemy@googlegroups.com] On 
> Behalf Of gpitel
> Sent: Monday, 16 January 2012 12:27 PM
> To: sqlalchemy
> Subject: [sqlalchemy] Re: Initialize model by its primary key.
>
> Thanks for the quick response. I am not a programmer by trade, so your
> insight is a great help.
>
> My program is split up into a model, a view, and a controller.
>
> I have been validating my model using unit testing ( from what I have
> read testing the controller and view is debatable). The reason I have
> a session inside the model, is because initialization sometimes
> depends on the existing table -> query -> session.  Model
> initialization should ( I thought) remain on the model side, so one
> could easily test the model.
>
> Bayer's link/recipe was scary for a noob like me, so  I may have not
> other choice but to move session outside of the model. I will post my
> example when I get it working.
>
> ~Grant
>
> On Jan 15, 6:42 pm, "Jackson, Cameron"
> <cameron.jack...@thalesgroup.com.au> wrote:
> > Putting a session inside a model seems like an odd thing to want to do. 
> > Changes in session A won't show up in session B until you commit() A and 
> > rollback() B (which of course will destroy changes you may have made in B).
>
> > I think your Test0 constructor should just be:
>
> >     def __init__(self, title='');
> >         self.title = title
>
> > And then you can move the other logic out of the model:
> >     class MyApplication(object):
>
> >         def __init__(self):
> >             self.session = Session()
>
> >         def GetOrCreateTest0(id):
> >                 test0 = self.session.query(Test0).filter_by(id=id).first():
> >             if not test0:
> >                 test0 = Test0()
> >                 self.session.add(test0)
> >             return test0
>
> > I may have misunderstood exactly what you were trying to accomplish, but 
> > does that help?
>
> > -----Original Message-----
> > From: sqlalchemy@googlegroups.com [mailto:sqlalchemy@googlegroups.com] On 
> > Behalf Of gpitel
> > Sent: Sunday, 15 January 2012 11:46 PM
> > To: sqlalchemy
> > Subject: [sqlalchemy] Initialize model by its primary key.
>
> > I am trying to setup my model initialization in two different ways.
> > 1.) Initialize normally by creating an instance, e.g.,
> > test0=Test0('Title')
> > 2.) Initialize by query, using an input integer as the primary key,
> > e.g., test0=Test(32)
>
> > This posses two questions.  Is it common practice to put a session
> > inside the model? Google Code search seems to say no, but I don't see
> > any other option. When I query inside the model, the attributes show
> > up inside the class but not outside of it.  How do I fix this?  I have
> > included some example code and output.
>
> > Thanks for your help.
>
> > ~Grant
>
> > == CODE ==
>
> > class Test0(Base):
> >     __tablename__ = 'test0'
> >     id = Column(Integer, primary_key=True)
> >     title = Column(String)
> >     session=Session()
> >     def __init__(self, *args):
> >         if type(args[0])==int:
> >             test=self.session.query(Test0).get(args[0])
> >             self=self.session.merge(test)
> >             self.session.add(self)
> >         elif type(args[0])==str:
> >             self.title=args[0]
> >             self.session.add(self)
> >     def commit(self):
> >         self.session.commit()
>
> > test0a=Test0('This is a test.')
> > test0a.commit()
> > test0b=Test0(test0a.id)
> > print 'test0a title=' + str(test0a.title)
> > print 'test0b title=' + str(test0b.title)
> > test0b.title='CHANGED'
> > test0b.commit()
>
> > == OUTPUT ==
> > test0a title=This is a test.
> > test0b title=None=
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "sqlalchemy" group.
> > To post to this group, send email to sqlalchemy@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > sqlalchemy+unsubscr...@googlegroups.com.
> > For more options, visit this group 
> > athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> > -------------------------------------------------------------------------
> > DISCLAIMER: This e-mail transmission and any documents, files and
> > previous e-mail messages attached to it are private and confidential.
> > They may contain proprietary or copyright material or information that
> > is subject to legal professional privilege.  They are for the use of
> > the intended recipient only.  Any unauthorised viewing, use, disclosure,
> > copying, alteration, storage or distribution of, or reliance on, this
> > message is strictly prohibited.  No part may be reproduced, adapted or
> > transmitted without the written permission of the owner.  If you have
> > received this transmission in error, or are not an authorised recipient,
> > please immediately notify the sender by return email, delete this
> > message and all copies from your e-mail system, and destroy any printed
> > copies.  Receipt by anyone other than the intended recipient should not
> > be deemed a waiver of any privilege or protection.  Thales Australia
> > does not warrant or represent that this e-mail or any documents, files
> > and previous e-mail messages attached are error or virus free.
>
> > -------------------------------------------------------------------------
>
> --
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group 
> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> -------------------------------------------------------------------------
> DISCLAIMER: This e-mail transmission and any documents, files and
> previous e-mail messages attached to it are private and confidential.
> They may contain proprietary or copyright material or information that
> is subject to legal professional privilege.  They are for the use of
> the intended recipient only.  Any unauthorised viewing, use, disclosure,
> copying, alteration, storage or distribution of, or reliance on, this
> message is strictly prohibited.  No part may be reproduced, adapted or
> transmitted without the written permission of the owner.  If you have
> received this transmission in error, or are not an authorised recipient,
> please immediately notify the sender by return email, delete this
> message and all copies from your e-mail system, and destroy any printed
> copies.  Receipt by anyone other than the intended recipient should not
> be deemed a waiver of any privilege or protection.  Thales Australia
> does not warrant or represent that this e-mail or any documents, files
> and previous e-mail messages attached are error or virus free.
>
> -------------------------------------------------------------------------
>
> --
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group 
> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> -------------------------------------------------------------------------
> DISCLAIMER: This e-mail transmission and any documents, files and
> previous e-mail messages attached to it are private and confidential.
> They may contain proprietary or copyright material or information that
> is subject to legal professional privilege.  They are for the use of
> the intended recipient only.  Any unauthorised viewing, use, disclosure,
> copying, alteration, storage or distribution of, or reliance on, this
> message is strictly prohibited.  No part may be reproduced, adapted or
> transmitted without the written permission of the owner.  If you have
> received this transmission in error, or are not an authorised recipient,
> please immediately notify the sender by return email, delete this
> message and all copies from your e-mail system, and destroy any printed
> copies.  Receipt by anyone other than the intended recipient should not
> be deemed a waiver of any privilege or protection.  Thales Australia
> does not warrant or represent that this e-mail or any documents, files
> and previous e-mail messages attached are error or virus free.
>
> -------------------------------------------------------------------------

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to