Yes Mike, you are right. Once the object is created and flushed, it has the database identity. But the column_property was never accessed. So there is no value for the property in the __dict__. Now if I try to access the parameter, it fires the query with the unset bindparam and I get the exception. Is there a way to set the bindparam value before I access the property for the first time on the object?
BTW here is what my model looks like. Topic - id - name - project_count (column property with bindparam for user_id) - projects (relationship) Project - id - name - topic_id (FK to Topic) - user_id - status I have a REST endpoint for Topic. When I create a new Topic instance, I emit the json version of the object. That is where the column_property gets accessed for the first time. Now in reality, there wont be any projects when the Topic is created, so firing a query is not really required. I did give "hybrid property" a try initially using a func.count(Topic.projects). But that did not fire a count query, instead fired the complete query for fetching projects. I even tried to make Topic.projects a "dynamic" load, so that I can pass the extra where clause for user_id and status etc. Then I gave column_property a try based on the example. Regards Mainak On Fri, Dec 12, 2014 at 9:44 AM, Michael Bayer <[email protected]> wrote: > > > On Dec 12, 2014, at 7:11 AM, Mainak Sarcar <[email protected]> > wrote: > > Hi, > > I have a column_property defined on a model with a select expression as > explained in the examples in > http://docs.sqlalchemy.org/en/latest/orm/mapper_config.html#using-column-property. > I had to add an extra condition to the where clause with a bindparam. I > have also defined the column_property with the "deferred=True", so that the > query is not fired in the first place. > > I am able to perform queries by using the "undefer" option in the query > instance and also passing the param to the query. But when I create an > instance of the model and flush and then try to access the column_property, > the query tries to get fired and throws exception complaining about the > bindparam value not being passed. > > > > Is there a way I can explicitly prevent the column_property query being > fired for an object that is newly created. > > > I’m puzzled here, the object is flushed, meaning it now has a database > identity. Then, I’m assuming either the column_property has never been > accessed before, so there is no value in __dict__, or you did a commit(), > which expired everything, so there’s nothing in __dict__. Then you access > it, which implies you’d like it to return a value of some kind. However, > the property has an unset bound parameter. What would the correct value > be? If there is no correct value, then what are you expecting to happen > when you access this property? > > It sounds like what you really want here is a hybrid: > http://docs.sqlalchemy.org/en/rel_0_9/orm/extensions/hybrid.html > > > -- > You received this message because you are subscribed to a topic in the > Google Groups "sqlalchemy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/gfkaA5UwtU4/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://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 [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.
