Does my test script produce the right output for you in your installation?

What does the print statement immediately after the class definition produce?

Simon

> On 15 Jan 2016, at 19:10, Brian Cherinka <havok2...@gmail.com> wrote:
> 
> Actually, the class definition is entirely what I posted in the original 
> message.  I didn't cut anything out of that.  I don't define the columns in 
> mine, as you did.  The property nsa_logmstar is not defined anywhere else in 
> the class or in any other place in this code, or in any code that interacts 
> with this code.    
> 
> class Sample(Base,ArrayOps):
>    __tablename__ = 'sample'
>    __table_args__ = {'autoload' : True, 'schema' : 'datadb'}
> 
>    def __repr__(self):
>        return '<Sample (pk={0},cube={1})'.format(self.pk,self.cube)
> 
>    @hybrid_property
>    def nsa_logmstar(self):
>        try: return math.log10(self.nsa_mstar)
>        except ValueError as e:
>            return -9999.0
>        except TypeError as e:
>            return None
> 
>    @nsa_logmstar.expression
>    def nsa_logmstar(cls):
>        return func.log(cls.nsa_mstar)  
> 
> My database connection is a singleton and my base is defined inside that, 
> essentially 
> 
> engine = create_engine(database_connection_string)
> Base = declarative_base(bind=engine)
> 
> Brian
> 
> On Friday, January 15, 2016 at 9:43:39 AM UTC-5, Simon King wrote:
> What happens if you put the print statement immediately after the class 
> definition? Is there any chance that you've got "nsa_logmstar = None" 
> somewhere in your class definition?
> 
> Here's a test script which appears to work:
> 
> import math
> 
> import sqlalchemy as sa
> import sqlalchemy.orm as saorm
> from sqlalchemy.ext.hybrid import hybrid_property
> from sqlalchemy.ext.declarative import declarative_base
> 
> Base = declarative_base()
> 
> class Sample(Base):
>     __tablename__ = 'sample'
> 
>     pk = sa.Column(sa.Integer, primary_key=True)
>     nsa_mstar = sa.Column(sa.Float)
> 
>     @hybrid_property
>     def nsa_logmstar(self):
>         try:
>             return math.log10(self.nsa_mstar)
>         except ValueError:
>             return -9999.0
>         except TypeError:
>             return None
> 
>     @nsa_logmstar.expression
>     def nsa_logmstar(cls):
>         return sa.func.log(cls.nsa_mstar)
> 
> 
> if __name__ == '__main__':
>     sm = saorm.sessionmaker()
>     session = sm()
>     print session.query(Sample.pk).filter(Sample.nsa_logmstar < 9)
> 
> 
> And here's the output:
> 
> 
> SELECT sample.pk AS sample_pk
> FROM sample
> WHERE log(sample.nsa_mstar) < :log_1
> 
> 
> Simon
> 
> 
> On Fri, Jan 15, 2016 at 2:23 PM, Brian Cherinka <havo...@gmail.com> wrote:
> Ahh.  Thanks.  Here is the class side then.  Still None.
> 
> In [14]: print datadb.Sample.nsa_logmstar
> None
> 
> Brian
> 
> On Friday, January 15, 2016 at 8:48:30 AM UTC-5, Simon King wrote:
> "Sample()" is an instance. "Sample" is the class. Try:
> 
>     print datadb.Sample.nsa_logmstar
> 
> Simon
> 
> On Fri, Jan 15, 2016 at 1:46 PM, Brian Cherinka <havo...@gmail.com> wrote:
> Hi Simon, 
> 
> Printing on the class side, I get 
> 
> In [11]: print datadb.Sample().nsa_logmstar
> None
> 
> It looks like it's getting set to None (or remaining None).  I'm not quite 
> sure what this tells me, except that it's not working.  Printing on in the 
> instance side, I get
> 
> In [12]: print cube.sample[0].nsa_mstar
> 1386160000.0
> 
> In [13]: print cube.sample[0].nsa_logmstar
> 9.14181336239
> 
> nsa_mstar is a column in my database table, and nsa_logmstar I want to be 
> simply the log-base10 of that quantity.  
> 
> If this doesn't give any insight, then it will take me some time to provide a 
> small script.  This code is embedded into a bunch of stuff.  But I'll work on 
> it.  
> 
> Brian
> 
> 
> On Friday, January 15, 2016 at 5:00:51 AM UTC-5, Simon King wrote:
> On Fri, Jan 15, 2016 at 6:16 AM, Brian Cherinka <havo...@gmail.com> wrote:
> I'm trying to set up a hybrid property / expression in a custom class, that I 
> can use in queries. I think I have the syntax correct, however the query 
> returns the entire table, instead of the correct subset of results.  And the 
> where clause just indicates True rather than the correct expression. 
> 
> 
> 
> Here is my hybrid property/expression definition
> 
> 
> class Sample(Base,ArrayOps):
>    __tablename__ = 'sample'
>    __table_args__ = {'autoload' : True, 'schema' : 'datadb'}
> 
>    def __repr__(self):
>        return '<Sample (pk={0},cube={1})'.format(self.pk,self.cube)
> 
>    @hybrid_property
>    def nsa_logmstar(self):
>        try: return math.log10(self.nsa_mstar)
>        except ValueError as e:
>            return -9999.0
>        except TypeError as e:
>            return None
> 
>    @nsa_logmstar.expression
>    def nsa_logmstar(cls):
>        return func.log(cls.nsa_mstar)  
> 
> The session query is
> 
> session.query(Sample.pk).filter(Sample.nsa_logmstar < 9)
> 
> But printing it does not show the appropriate condition. I get
> 
> SELECT datadb.sample.pk AS datadb_sample_pk, 
> FROM datadb.sample
> WHERE true 
> 
> and the results return the entire table of ~11000 rows instead of the 
> expected 272 rows. What's going on here?  Everything looks correct to me, but 
> I can't figure it out.  
> 
> I'm expecting the SQL statement to look like this
> 
> select s.pk 
> from datadb.sample as s 
> where log(s.nsa_mstar) < 9;
> 
> Any thoughts?  Thanks. 
> 
> 
> I can't see anything obviously wrong with your code, but it looks like 
> Sample.nsa_logmstar is not actually resolving to the hybrid property in your 
> query. What happens if you "print Sample.nsa_logmstar" just before the query?
> 
> Otherwise, please provide a small runnable script that demonstrates the 
> problem.
> 
> Simon
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+...@googlegroups.com.
> To post to this group, send email to sqlal...@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+...@googlegroups.com.
> To post to this group, send email to sqlal...@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to