> On Dec 12, 2014, at 10:58 PM, Mainak Sarcar <[email protected]> wrote: > > 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
Well what immediately doesn’t make sense is that what does Topic.project_count mean if there is no user_id that is local to Topic? the Topic has N number of projects, but you only want M, those with some arbitrary user_id. So it makes no sense to use column_property for this. You need to pass in user_id to a function as an argument. Suppose column_property did what you wanted, now Topic.project_count is “10”. But now user_id, somewhere on the outside, changes to something else. Now Topic.project_count is incorrect. It doesn’t make sense for this to be a “mapped” value, because Topic has no fixed user_id. OTOH if user_id were part of Topic then you’d just use a correlated subquery as you see in http://docs.sqlalchemy.org/en/rel_0_9/orm/mapper_config.html#using-column-property <http://docs.sqlalchemy.org/en/rel_0_9/orm/mapper_config.html#using-column-property>. i think basically it doesn’t make any sense to use a dynamically bound parameter with column_property(). > > 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] > <mailto:[email protected]>> wrote: > >> On Dec 12, 2014, at 7:11 AM, Mainak Sarcar <[email protected] >> <mailto:[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 >> >> <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 > <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 > <https://groups.google.com/d/topic/sqlalchemy/gfkaA5UwtU4/unsubscribe>. > To unsubscribe from this group and all its topics, send an email to > [email protected] > <mailto:[email protected]>. > To post to this group, send email to [email protected] > <mailto:[email protected]>. > Visit this group at http://groups.google.com/group/sqlalchemy > <http://groups.google.com/group/sqlalchemy>. > For more options, visit https://groups.google.com/d/optout > <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] > <mailto:[email protected]>. > To post to this group, send email to [email protected] > <mailto:[email protected]>. > Visit this group at http://groups.google.com/group/sqlalchemy > <http://groups.google.com/group/sqlalchemy>. > For more options, visit https://groups.google.com/d/optout > <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.
