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.

Reply via email to