Hmm. So I removed the column definitions and it worked just fine. This doesn't make any sense to me, since this is essentially my original class definition, and now it works. Maybe I had a type before?, but it didn't look like it. I'm using a postgreSQL database, and my table definition is very straightforward. It looks like
CREATE TABLE datadb.sample (pk serial PRIMARY KEY NOT NULL, tileid INTEGER, nsa_mstar REAL, nsa_id INTEGER, .... bunch of other column definitions ) No my table does not have a logmstar definition. Only mstar. I create the property in my Sample class definition. This is very strange. Brian On Friday, January 15, 2016 at 6:31:23 PM UTC-5, Simon King wrote: > > You shouldn’t need to define the columns. Here’s another test script: > > ########################### > 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() > > engine = sa.create_engine('sqlite:///hybridtest.db') > > engine.execute(""" > CREATE TABLE sample ( > pk INTEGER NOT NULL, > nsa_mstar FLOAT, > PRIMARY KEY (pk) > ) > """) > > class Sample(Base): > __tablename__ = 'sample' > __table_args__ = {'autoload' : True, 'autoload_with': engine} > > @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) > ########################### > > What database are you using, and what is your SQL table definition? Does > your table already have a nsa_logmstar column? (I don’t think that should > matter, but it would be worth checking) > > Simon > > > > On 15 Jan 2016, at 22:27, Brian Cherinka <havo...@gmail.com > <javascript:>> wrote: > > > > It looks like I needed to define the columns inside my class. That's > the only difference between your class and mine. And I tested out the > query and it now works, and returns the correct number of rows. > > > > In [4]: print > > session.query(datadb.Sample.pk).filter(datadb.Sample.nsa_logmstar > < 9) > > > > SELECT datadb.sample.pk AS datadb_sample_pk > > FROM datadb.sample > > WHERE log(datadb.sample.nsa_mstar) < %(log_1)s > > > > In [6]: > > len(session.query(datadb.Sample.pk).filter(datadb.Sample.nsa_logmstar > < 9,datadb.Sample.nsa_mstar > 0).all()) > > Out[6]: 273 > > > > Do you have any idea why the column definition matters here? Thanks for > all your help. > > > > Brian > > > > On Friday, January 15, 2016 at 5:02:03 PM UTC-5, Brian Cherinka wrote: > > Here is the print immediately after my original class definition: > > > > print 'sample nsa log mstar', > Sample.nsa_logmstar > > > > and the result > > > > sample nsa log mstar None > > > > When I run your script exactly as is, I get the same output as you. > > > > When I replace my class definition with yours, inside my code, as > follows > > > > class Sample(Base): > > __tablename__ = 'sample' > > __table_args__ = {'autoload' : True, 'schema' : 'mangadatadb'} (I > needed to add this line in) > > > > pk = Column(Integer, primary_key=True) > > nsa_mstar = Column(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 func.log(cls.nsa_mstar) > > > > now the print statement : print 'sample nsa log mstar', > Sample.nsa_logmstar > > returns > > > > sample nsa log mstar log(mangadatadb.sample.nsa_mstar) > > > > > > On Friday, January 15, 2016 at 4:28:31 PM UTC-5, Simon King wrote: > > 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 <havo...@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+...@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 <javascript:>. > > To post to this group, send email to sqlal...@googlegroups.com > <javascript:>. > > 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.