On Jul 14, 4:56 am, sacabuche <sacabu...@gmail.com> wrote:
> In fact i was only querying, but when i add many items in the same
> flush, all items(of same category)get the same value, and i don't know
> how to include the sku number already calculated to the query, that's
> the reason because i tried this approach of saving "last_sku_value",
> but i sow that something was really bad.
>
> I tried to execute the query on __init__() of my class but i had to
> pass the session to my object or take my session from a global so i
> thought it was a bad idea.
>
> And i could create my object add it to my session and after call a
> function "class.new_sku()", but i dislike the idea to rewrite this for
> each item.
>
> this is my "get_last_value()" code, maybe it'll be clear:
>
>    def get_last_value(self, session, cls, instance):
>         """execute a query to find the last value"""
>         try:
>             return self.last_value[instance.dynamic.value]
>         except KeyError:
>             self.last_value_key = "%s-%s" %(instance.dynamic.static,
>                                             instance.dynamic.value)
>
>         last_sku_value = session.query(cls.value)\
>                            .filter(cls.dynamic == instance.dynamic)\
>                            .order_by(desc(cls.date_insert)).first()
>
>         if not last_sku_value:
>             return None
>         try:
>             return last_sku_value[0]
>         except IndexError:
>             return None

your options for doing a query in order to get some database related
information when you make a new object are:

1. use a scoped_session, so that a global transaction is available,
and do it in __nit__.  Usually any app I write of any importance will
be using this technique, and issues like these are not a problem.
2.  after session attach, using SessionExtension.after_attach, using
the given Session
3. before an insert, using MapperExtension.before_insert, using the
Connection passed to that method
4. before flush, using SessionExtension.before_flush
5. as a default value on the column, using the "default" callable of
Column, you can pass either a SQL expression that will execute (see
http://www.sqlalchemy.org/docs/metadata.html#sql-expressions ), or a
callable that accepts a "context" argument (this is a little more
exotic, let me know if you want to try that,  a plain SQL expression
is probably all you need here though)



>
> On 13 jul, 16:35, Michael Bayer <mike...@zzzcomputing.com> wrote:
>
> > On Jul 13, 2010, at 10:21 AM, sacabuche wrote:
>
> > > I was trying to get the last value "before_insert" a new item but i
> > > didn't find out, so i change of strategy and i saved the last value of
> > > this method, but the problem is that when i do other commits my old
> > > MapperExtension attribute (self.last_value) get the last value and i
> > > dislike it, even when I close and open a new Session (discovered in my
> > > tests)
>
> > > This is my code:
>
> > > class _ValueExtension(MapperExtension):
> > >    """Set new value for SkuDynamic and SKuUnique"""
> > >    def __init__(self):
> > >        self.last_value = {} # <<--- THE PROBLEM
> > >        self.first_value = FIRST_VALUE
>
> > >    def before_insert(self, mapper, connection, instance):
> > >        session = object_session(instance)
> > >    cls = instance.__class__
>
> > >    last_sku_value = self.get_last_value(session, cls, instance)
>
> > >        if not last_sku_value:
> > >        instance.value = self.first_value
> > >    else:
> > >        instance.value = next_value(last_sku_value)
>
> > >    self.last_value[self.last_value_key] = instance.value
> > >        self.set_values(instance)
>
> > >    #def after_insert(self, mapper, connection, instance):
> > >    #    self.__init__()   #<--- IF I DO THIS I DON'T HAVE THE LAST
> > > VALUE IN THE SAME FLUSH
>
> > >    #def after_update(self, mapper, connection, instance):
> > >    #    self.__init__()
>
> > >    def get_last_value(self, session, cls, instance):
> > >        """This have to return just one value
> > >    and set self.last_value_key is nedded to update elements in same
> > > session
> > >        Execute The Query or check self.last_value
> > >    """
> > >        raise NotImplementedError, 'implement this function'
>
> > >    def set_values(self, instance):
> > >        """Use if necesary"""
> > >    pass
>
> > A MapperExtension is persistent for the life of the application and also is 
> > accessed concurrently, so it is not an appropriate place to store a count 
> > for things things that are local to a specific flush, and its really not a 
> > good place in general to do what you're trying to do (though its not clear 
> > above what you're trying to accomplish, if you want a global "last sku" or 
> > a "sku" specific to one flush).
>
> > You'd be better off querying the database for the "last sku value" when you 
> > need it, or just adding code to your classes __init__() method to keep 
> > track of sku numbers in memory as needed.
>
> > > Thanks
>
> > > --
> > > 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 
> > > 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 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.

Reply via email to