[sqlalchemy] Re: Objects are wrongly getting removed/expunged from session

2011-01-15 Thread Tvrtko
On Jan 15, 11:56 am, Tvrtko qvx3...@gmail.com wrote:
 First, let me say that I'm using sqlalchemy version 0.5.8. We have a
 large and complex application and changing to sa 0.6 is expensive, so
 I would like, if possible, to find a solution for 0.5. I'm using
 sqlalchemy since version 0.1.

 Problem: objects are one moment inside a session an the other moment
 are not.

 Setup:

 Session is in weak_identity_map=False mode:

    maker = sessionmaker(autoflush=True, autocommit=False,
         weak_identity_map=False,
         extension=[ZopeTransactionExtension(), EpiSessionExtension()])
     DBSession = scoped_session(maker)

 All objects are immediately added to session:

     campaign = Campaign(...)
     DBSession.add(campaign)

 Plus, the reference to object is kept locally.
 Plus, the object is assigned to another relation property:

     qitem = QItem(campaign=campaign, ...)
     DBSession.add(qitem)

 Now, the problem occurs at two different random points. Both time
 the garbage collector is collecting the garbage before the problem
 presents itself. This may have nothing to do with a problem.

 Everything happens inside a single thread.

 First case:

     campaign = Campaign(...)
     DBSession.add(campaign)
     ...
     # called indirectly because of lots of queries
     DBSession.flush()
     print campaign.id  # 206

     # A: the (Campaign, 206) is inside the keys
     print DBSession.identity_map.keys()

     contact = DBSession.query(...).one()
     # garbage is collected while this runs
     # I can see it because of gc.set_debug(...)
     # However, campaign is referenced locally and gc
     # leaves it, but maybe some other internal SA object
     # is collected.

     # B: the (Campaign, 206) is no longer present
     print DBSession.identity_map.keys()

Actually, this case is the same as the second case, so let's just
ignore it.
The objects are not expunged from the session without a reason as the
example might suggest. Objects are removed because the automatic
`flush()`
inside `query()` failed and rolled back the transaction (and removed
objects from session). B print was done inside exception handler.

So, it really is the same case as the second one:

 Second case, very similar, but problem appears at a later point:

     campaign = Campaign(...)
     DBSession.add(campaign)
     DBSession.flush()
     print campaign.id  # 207
     contact = DBSession.query(...).one()

     # Also, assign campaign to relational property of `qitem`
     qitem = QItem(campaign=campaign, ...)
     DBSession.add(qitem)

     # The (Campaign, 207) is inside the keys
     print DBSession.identity_map.keys()

     DBSession.flush() # called via commit by web controller
     # DB raises exception CONTACT_ID cannot be NULL

Somehow, the `qitem.campaign` relation property behaves as if it
is not set at all, and SA doesn't prepare `QITEM.CAMPAIGN_ID`
properly.


 The exception is raised because the `campaign` object
 again got expunged from session for some reason, even
 though the `qitem` itself holds a reference to it.

Well, maybe it wasn't expunged at that point, I dont have a proof,
but the `CAMPAIGN_ID` was set to NULL as if the `campaign`
property was not set.

-- 
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.



[sqlalchemy] Re: Objects are wrongly getting removed/expunged from session

2011-01-15 Thread Tvrtko
I've drilled down all the way up to `mapper._save_obj()`. I examined
the `state.dict` for `qitem`.

Good case:

qitem state dict = {'campaign': Campaign 233, u'Test',
'campaign_id': 233, ...}

And for the bad case:

qitem state dict = {'campaign': Campaign 234, u'Test',
'campaign_id': None, ...}

The `campaign` property is *relation* to `Campaign` entity. Campaign
is previously flushed and has id. But, for some reason the
`campaign_id` is missing inside `qitem` state event though the
`campaign` is present.

I can probably work around by saying:

qitem.campaign_id = campaign.id

but then I must rely on campaign being flushed which might not allways
be the case. Yes, I can flush it manually, but I like to depend on
relations functioning properly.

P.S. I am not restarting or changing application in any way, just
refreshing a web page, which sometime fails and sometime succeeds.

-- 
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.



[sqlalchemy] Re: Objects are wrongly getting removed/expunged from session

2011-01-15 Thread Tvrtko


On Jan 15, 4:35 pm, Michael Bayer mike...@zzzcomputing.com wrote:
 So, you have A-B, an exception occurs, you do the rollback, then you're 
 somehow trying to continue on within the web request ?     The code examples 
 here are out of context snippets and I don't see any exception handling 
 happening so they don't really tell me much.    When the flush fails, the 
 internal state is completely expired.   Campaign, if pending when the 
 transaction started, now transient again, qitem is also transient.   Previous 
 flushes within that transaction have no effect on this.    Campaign and qitem 
 would retain their relationship to each other, campaign_id would probably 
 remain present, but if you were to re-add the two, it would be overwritten on 
 the next flush.

You are right. I presented the issues in a confusing manner because I
was not exactly sure what was happening in the first place.

I am *not* continuing with request after exception. I was reraising
exception after a debug print. Unfortunately that debug print has lead
me in the wrong direction of thinking that objects were expunged
before the flush. That is not the case.

What actually happens is that save mechanism sometimes gets underlying
ID from related object end sometimes it doesn't. Note that campaign
has ID, and that campaign is associated with qitem and still,
qitem.contact_id is not allways set during a save/flush.

Debug print from inside `mapper._save_obj()`:

Good case:

   qitem state dict = {'campaign': Campaign 233, u'Test',
'campaign_id': 233, ...}

And for the bad case:

   qitem state dict = {'campaign': Campaign 234, u'Test',
'campaign_id': None, ...}


 In my development, if a web request has an exception, that web request is 
 over, so the use case here is a little confusing to me to start with, and I 
 don't really understand why you need to manually flush or not since I don't 
 have a clear illustration of the issue.

I never explicitly flush. I don't like it. I was only saying that if I
want to make a *workaround* and say:

qitem.campaign = campaign # sometimes has no effect
qitem.campaign_id = campaign.id  # need flush for id

I have to call flush() before I have an ID.


 On Jan 15, 2011, at 9:27 AM, Tvrtko wrote:







  I've drilled down all the way up to `mapper._save_obj()`. I examined
  the `state.dict` for `qitem`.

  Good case:

     qitem state dict = {'campaign': Campaign 233, u'Test',
  'campaign_id': 233, ...}

  And for the bad case:

     qitem state dict = {'campaign': Campaign 234, u'Test',
  'campaign_id': None, ...}

  The `campaign` property is *relation* to `Campaign` entity. Campaign
  is previously flushed and has id. But, for some reason the
  `campaign_id` is missing inside `qitem` state event though the
  `campaign` is present.

  I can probably work around by saying:

     qitem.campaign_id = campaign.id

  but then I must rely on campaign being flushed which might not allways
  be the case. Yes, I can flush it manually, but I like to depend on
  relations functioning properly.

  P.S. I am not restarting or changing application in any way, just
  refreshing a web page, which sometime fails and sometime succeeds.

  --
  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.

-- 
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.



[sqlalchemy] Re: Objects are wrongly getting removed/expunged from session

2011-01-15 Thread Tvrtko
This is my first such case in 5-6 years of using the SA. Usually the
problem was with my code. This could also be the case now, but it
escapes me where I made a mistake.

Thank you for your time. I will consider this closed for now and move
on using a workaround of explicitly populating campaign_id. I guess I
will try 0.6 or even 0.7 in the next few months.

Thanks,
Tvrtko

P.S. for the curious, my relations go like this:

from elixir import Entity, Field, ...

class Campaign(Entity):
id = Field(Integer, Sequence('cc_campaign_seq'),
colname='campaign_id', primary_key=True)
qitems = OneToMany('QItem')

class QItem(Entity):
id = Field(Integer, Sequence('cc_qitem_seq'), colname='qitem_id',
primary_key=True)
campaign = ManyToOne('Campaign', colname='campaign_id',
required=True)


On Jan 15, 5:32 pm, Michael Bayer mike...@zzzcomputing.com wrote:
 On Jan 15, 2011, at 11:10 AM, Tvrtko wrote:











  On Jan 15, 4:35 pm, Michael Bayer mike...@zzzcomputing.com wrote:
  So, you have A-B, an exception occurs, you do the rollback, then you're 
  somehow trying to continue on within the web request ?     The code 
  examples here are out of context snippets and I don't see any exception 
  handling happening so they don't really tell me much.    When the flush 
  fails, the internal state is completely expired.   Campaign, if pending 
  when the transaction started, now transient again, qitem is also 
  transient.   Previous flushes within that transaction have no effect on 
  this.    Campaign and qitem would retain their relationship to each other, 
  campaign_id would probably remain present, but if you were to re-add the 
  two, it would be overwritten on the next flush.

  You are right. I presented the issues in a confusing manner because I
  was not exactly sure what was happening in the first place.

  I am *not* continuing with request after exception. I was reraising
  exception after a debug print. Unfortunately that debug print has lead
  me in the wrong direction of thinking that objects were expunged
  before the flush. That is not the case.

  What actually happens is that save mechanism sometimes gets underlying
  ID from related object end sometimes it doesn't. Note that campaign
  has ID, and that campaign is associated with qitem and still,
  qitem.contact_id is not allways set during a save/flush.

  Debug print from inside `mapper._save_obj()`:

  Good case:

     qitem state dict = {'campaign': Campaign 233, u'Test',
  'campaign_id': 233, ...}

  And for the bad case:

     qitem state dict = {'campaign': Campaign 234, u'Test',
  'campaign_id': None, ...}

 OK, then I need a full reproducing test case which shows how that result 
 occurs.    Its not a known issue off the top of my head.  Also, please note 
 that I am in no way suggesting you upgrade your application to 0.6, however, 
 if you test your development code with 0.6 and the problem goes away, that 
 would indicate something specific to 0.5 might be the cause.    I would 
 suggest that it may be related to how your relationships are set up, such 
 that a dependency between QItem and Campaign is not correctly established, 
 leading the ORM to sometimes handle one or the other first.

-- 
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.



[sqlalchemy] Re: Objects are wrongly getting removed/expunged from session

2011-01-15 Thread Tvrtko


On Jan 15, 5:57 pm, Michael Bayer mike...@zzzcomputing.com wrote:
 On Jan 15, 2011, at 11:53 AM, Tvrtko wrote:

  This is my first such case in 5-6 years of using the SA. Usually the
  problem was with my code. This could also be the case now, but it
  escapes me where I made a mistake.

 not suggesting you made a mistake.

Don't worry. I was trying to give you an indirect compliment by saying
the problem was most often with my own code :)

I DO have unusual relationships in entire code base, but the Campaign/
QItem relationship is straightforward. One of the other relationships
could be causing the problem. I'll see what happens with SA 0.7 when
it comes out.

-- 
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.



[sqlalchemy] Re: Objects are wrongly getting removed/expunged from session

2011-01-15 Thread Tvrtko


On Jan 15, 5:53 pm, Tvrtko qvx3...@gmail.com wrote:
 This is my first such case in 5-6 years of using the SA. Usually the
 problem was with my code. This could also be the case now, but it
 escapes me where I made a mistake.

 Thank you for your time. I will consider this closed for now and move
 on using a workaround of explicitly populating campaign_id. I guess I
 will try 0.6 or even 0.7 in the next few months.

I couldn't resist.
I'm pleased to say that it works just fine in SA 0.6


 Thanks,
 Tvrtko

 P.S. for the curious, my relations go like this:

 from elixir import Entity, Field, ...

 class Campaign(Entity):
     id = Field(Integer, Sequence('cc_campaign_seq'),
 colname='campaign_id', primary_key=True)
     qitems = OneToMany('QItem')

 class QItem(Entity):
     id = Field(Integer, Sequence('cc_qitem_seq'), colname='qitem_id',
 primary_key=True)
     campaign = ManyToOne('Campaign', colname='campaign_id',
 required=True)

 On Jan 15, 5:32 pm, Michael Bayer mike...@zzzcomputing.com wrote:







  On Jan 15, 2011, at 11:10 AM, Tvrtko wrote:

   On Jan 15, 4:35 pm, Michael Bayer mike...@zzzcomputing.com wrote:
   So, you have A-B, an exception occurs, you do the rollback, then you're 
   somehow trying to continue on within the web request ?     The code 
   examples here are out of context snippets and I don't see any exception 
   handling happening so they don't really tell me much.    When the flush 
   fails, the internal state is completely expired.   Campaign, if pending 
   when the transaction started, now transient again, qitem is also 
   transient.   Previous flushes within that transaction have no effect on 
   this.    Campaign and qitem would retain their relationship to each 
   other, campaign_id would probably remain present, but if you were to 
   re-add the two, it would be overwritten on the next flush.

   You are right. I presented the issues in a confusing manner because I
   was not exactly sure what was happening in the first place.

   I am *not* continuing with request after exception. I was reraising
   exception after a debug print. Unfortunately that debug print has lead
   me in the wrong direction of thinking that objects were expunged
   before the flush. That is not the case.

   What actually happens is that save mechanism sometimes gets underlying
   ID from related object end sometimes it doesn't. Note that campaign
   has ID, and that campaign is associated with qitem and still,
   qitem.contact_id is not allways set during a save/flush.

   Debug print from inside `mapper._save_obj()`:

   Good case:

      qitem state dict = {'campaign': Campaign 233, u'Test',
   'campaign_id': 233, ...}

   And for the bad case:

      qitem state dict = {'campaign': Campaign 234, u'Test',
   'campaign_id': None, ...}

  OK, then I need a full reproducing test case which shows how that result 
  occurs.    Its not a known issue off the top of my head.  Also, please note 
  that I am in no way suggesting you upgrade your application to 0.6, 
  however, if you test your development code with 0.6 and the problem goes 
  away, that would indicate something specific to 0.5 might be the cause.    
  I would suggest that it may be related to how your relationships are set 
  up, such that a dependency between QItem and Campaign is not correctly 
  established, leading the ORM to sometimes handle one or the other first.

-- 
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.



[sqlalchemy] Re: relation to arbitrary class (hibernate any)

2010-04-08 Thread Tvrtko
On Apr 7, 9:29 pm, Michael Bayer mike...@zzzcomputing.com wrote:
 Tvrtko wrote:
  I have a schema that cannot be changed. In it, there is a table with
  two columns:

      element_type CHAR(1)
      element_id INTEGER

  There is no foreign key on element_id because it can point to
  different, unrelated
  tables (element_type) says where element_id points to.

  How can I model this in sqlalchemy?

 this is a rails-style polymorphic association (note that Hibernate calls
 it this as well:  The any mapping element defines a polymorphic
 association to classes from multiple tables.).  See the example
 examples/poly_assoc/poly_assoc.py in the distro as well as the discussion
 athttp://techspot.zzzeek.org/?p=13.

Thanks. It s good to know that I can just pretend that there are
foreign keys between the tables. This actually helps in more cases
than just this one!


  I know how to load and store element using property:

      def _get_element(self):
          if self.need_element_reload():
              clazz = self.get_class_from_type(self._element_type)
              self._element =
  object_session(self).query(clazz).get(self.element_id)
          return self._element
      def _set_element(self, element):
          self._element_type = self.get_type_from_instance(element)
          self._element_id = element.id if element else None
          self._element = element
      element = property(_get_element, _set_element)

  But this is not good enough. For example, if I create new element
  which
  is not yet flushed, there is no id. Normally, sqlalchemy knows about
  relationships and finishes the foreign key column assignment
  once the pointed-to id is known. How can I model this type of
  relationship so that sqlalchemy will do the right thing
  (assign element_id in a flush process, or more generally behave
  like this is a normal relationship).

  I'm not sure if I explained it correctly, so I'll just mention that
  hibernate has any element that can do just that.

  Thanks,
  Tvrtko

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalch...@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.



[sqlalchemy] relation to arbitrary class (hibernate any)

2010-04-07 Thread Tvrtko
I have a schema that cannot be changed. In it, there is a table with
two columns:

element_type CHAR(1)
element_id INTEGER

There is no foreign key on element_id because it can point to
different, unrelated
tables (element_type) says where element_id points to.

How can I model this in sqlalchemy?

I know how to load and store element using property:

def _get_element(self):
if self.need_element_reload():
clazz = self.get_class_from_type(self._element_type)
self._element =
object_session(self).query(clazz).get(self.element_id)
return self._element
def _set_element(self, element):
self._element_type = self.get_type_from_instance(element)
self._element_id = element.id if element else None
self._element = element
element = property(_get_element, _set_element)

But this is not good enough. For example, if I create new element
which
is not yet flushed, there is no id. Normally, sqlalchemy knows about
relationships and finishes the foreign key column assignment
once the pointed-to id is known. How can I model this type of
relationship so that sqlalchemy will do the right thing
(assign element_id in a flush process, or more generally behave
like this is a normal relationship).

I'm not sure if I explained it correctly, so I'll just mention that
hibernate has any element that can do just that.

Thanks,
Tvrtko

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalch...@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.



[sqlalchemy] Re: relation to arbitrary class (hibernate any)

2010-04-07 Thread Tvrtko
And to make things event worse, I have to mantain a backref list/dict.

On Apr 7, 8:30 pm, Tvrtko qvx3...@gmail.com wrote:
 I have a schema that cannot be changed. In it, there is a table with
 two columns:

     element_type CHAR(1)
     element_id INTEGER

 There is no foreign key on element_id because it can point to
 different, unrelated
 tables (element_type) says where element_id points to.

 How can I model this in sqlalchemy?

 I know how to load and store element using property:

     def _get_element(self):
         if self.need_element_reload():
             clazz = self.get_class_from_type(self._element_type)
             self._element =
 object_session(self).query(clazz).get(self.element_id)
         return self._element
     def _set_element(self, element):
         self._element_type = self.get_type_from_instance(element)
         self._element_id = element.id if element else None
         self._element = element
     element = property(_get_element, _set_element)

 But this is not good enough. For example, if I create new element
 which
 is not yet flushed, there is no id. Normally, sqlalchemy knows about
 relationships and finishes the foreign key column assignment
 once the pointed-to id is known. How can I model this type of
 relationship so that sqlalchemy will do the right thing
 (assign element_id in a flush process, or more generally behave
 like this is a normal relationship).

 I'm not sure if I explained it correctly, so I'll just mention that
 hibernate has any element that can do just that.

 Thanks,
 Tvrtko

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalch...@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.



[sqlalchemy] Re: merge without merging related objects

2009-10-30 Thread Tvrtko

 you want the cascade setting on history

 backref=backref(history, cascade='save-update')

That did the trick!
--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[sqlalchemy] merge without merging related objects

2009-10-29 Thread Tvrtko

Hi,

is it possible to merge an object back to session, but without merging
the entire tree of related objects. Just this one root object.

I'm trying to implement caching for my user identity framework and I
don't want to merge back the entire tree of objects reachable from the
user entity.

I created a new user instance and copied all relevant attributes to
it. I then tried to merge this copy back to session, but it doesn't
work because you can only merge detached objects not transient ones (I
started playing with internal state to make it appear as detached but
I was not confident in what I was doing).

I then tried removing related objects but I'm not even sure how to do
that. Anyway, the problem here is that you can't merge dirty objects.

If there is no way to merge without merging related objects, I would
be more than happy to know how to create a copy of my user object
which is merge-able. Any workaround will do.

My version of sqlalchemy is 0.4.4

Thanks,
Tvrtko
--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[sqlalchemy] Re: merge without merging related objects

2009-10-29 Thread Tvrtko

On Oct 29, 8:44 pm, Michael Bayer mike...@zzzcomputing.com wrote:
 Tvrtko wrote:

  Hi,

  is it possible to merge an object back to session, but without merging
  the entire tree of related objects. Just this one root object.

 the general way is to disable merge cascade on the relation(), using
 cascade='save-update' or cascade=None

I still didn't try cascade options, but the object copy works.

  I created a new user instance and copied all relevant attributes to
  it. I then tried to merge this copy back to session, but it doesn't
  work because you can only merge detached objects not transient ones

 transient objects can be merged.  They get added to the session and enter
 the pending state.

I get:
InvalidRequestError: merge() with dont_load=True option does not
support objects transient (i.e. unpersisted) objects.  flush() all
changes on mapped instances before merging with dont_load=True.

I managed to make a copy for merge like this:

obj = User()
obj.user_id = user.user_id
obj.name = user.name
obj._instance_key = user.user_id
obj._state.modified = False
user = session.merge(obj, dont_load=True)

I guess I can now try the cascade option.


  I then tried removing related objects but I'm not even sure how to do
  that. Anyway, the problem here is that you can't merge dirty objects.

 dirty objects are also mergeable, but only if you allow the Session to
 load their existing state from the database (i.e. you dont use the
 'dont_load' flag).   If you're playing with caching you shouldn't put
 dirty objects into a cache.

I need dont_load otherwise my caching isn't really caching.


  My version of sqlalchemy is 0.4.4

 oof.   go to 0.4.8 at the very least.   0.5.6 preferably.

In the past, I would often have to spend days porting from one version
to another (0.2-0.3-0.4) because of some subtle changes in
sqlalchemy (sessions, threading, way of accessing properties,
mappers...). This would be just 0.4.x-0.4.y but I'm still reluctant.
--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[sqlalchemy] Re: merge without merging related objects

2009-10-29 Thread Tvrtko



On Oct 29, 9:33 pm, Michael Bayer mike...@zzzcomputing.com wrote:
 Tvrtko wrote:

  transient objects can be merged.  They get added to the session and
  enter
  the pending state.

  I get:
  InvalidRequestError: merge() with dont_load=True option does not
  support objects transient (i.e. unpersisted) objects.  flush() all
  changes on mapped instances before merging with dont_load=True.

 right, if it were me I'd be caching things which I only loaded from the
 database entirely.  Or, if there are ad-hoc structures I'd like to cache,
 I'd construct that using non-ORM mapped constructs, or build it in such a
 way that I don't have to ever merge() it back, unless I'm doing a persist
 operation of some kind in which case I'd use full merge().

I agree. I am caching object loaded from database. This transient
problem is because of a workaround in which I create a copy of loaded
object to avoid merging entire object tree.

And, by the way, I had to add:

obj._state.commit(('user_id', 'name'))

to prevent sqlalchemy from issuing update :)

  dirty objects are also mergeable, but only if you allow the Session to
  load their existing state from the database (i.e. you dont use the
  'dont_load' flag).   If you're playing with caching you shouldn't put
  dirty objects into a cache.

  I need dont_load otherwise my caching isn't really caching.

 I need it too.  I just don't cache transient/dirty mapped objects.

Neither do I, normally :)

I'm still trying the cascade option, but I'm having some trouble
because I'm using Elixir on top of sqlalchemy. If I manage to do it
somehow, I'll post the update.

 However on the third digit, those are our point releases.  We're very
 careful not to introduce backwards incompatibility on those.It's rare
 that we have regressions on those and when we do, we find out very quickly
 and another point release comes out almost immediately.  you can see
 0.4.7p1 as evidence of that.   At most you might see some new deprecation
 warnings pop up.

I'm reluctant because I have a substantial amount of code which uses
sqlalchemy metadata to automatically generate CRUD operations, forms
and such.

I love sqlalhemy to the point of rejecting some frameworks for not
supporting it. The current version is working just fine and there is
so much other work to be done.

I', looking the changelog. There are some changes to merge(). I might
try 0.4.8 after all because I don't like to use underlined variables
like _state.

--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[sqlalchemy] Re: merge without merging related objects

2009-10-29 Thread Tvrtko

Now on 0.4.8.
And it is just not working.

My copy method is flawed. Don't use it. The innards of sqlalchemy
are just too complicated to mess around with.

As for the cascade option. It also doesn't work. I have the following:

mapper(History, history_table, properties = dict(
user = relation(User, backref = 'history', cascade='save-
update')))

And still, after I merge user back into session, the history is also
merged.
I test this by issuing:

print user.history

This prints the data but doesn't SELECT from database.
--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---