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"
<[email protected]> 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: [email protected] [mailto:[email protected]] 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 [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> 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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to