On Jun 24, 2011, at 12:49 PM, Arthur Kopatsy wrote:

> Hi,
> 
> I am trying to write a proper query_chooser method for our user based
> sharding. To do so, I need to be able to query the value of the
> query's criterions.
> 
> I have the following model:
> class User(object):
>    id = Column(Integer, primary_key=True)
>    ...
> 
> class Subscription(object):
>    id = Column(Integer, primary_key=True)
>    producerId = Column(Integer, ForeignKey('User.id'))
>    consumerId = Column(Integer) # No foreign key because sharded on
> producerId
>    producer = relationship('User', backref='subscriptions')
> 
> In my query_chooser, I am using the code from the attribute_sharding
> example and try to find out the value of producerId if there is such a
> criterion.
> 
> Given an existing myUser instance and a session, I see two different
> behaviors:
> 
> 1. session.query(Subscription).filter(Subscription.producerId ==
> myUser.id).all()
> 
> I will get a proper value for producerId in the dictionary of bound
> parameters so I can find out the shard, no problem.
> 
> SELECT "InboundSubscription".s9id AS "InboundSubscription_s9id",
> "InboundSubscription".active AS "InboundSubscription_active",
> "InboundSubscription"."createdAt" AS "InboundSubscription_createdAt",
> "InboundSubscription"."updatedAt" AS "InboundSubscription_updatedAt",
> "InboundSubscription"."followerId" AS
> "InboundSubscription_followerId", "InboundSubscription"."producerId"
> AS "InboundSubscription_producerId", "InboundSubscription".status AS
> "InboundSubscription_status", "InboundSubscription".suspended AS
> "InboundSubscription_suspended"
> FROM "InboundSubscription"
> WHERE "InboundSubscription"."producerId" = :producerId_1
> 
> 2. myUser.subscriptions
> 
> I get a None value for the anonymous parameter which prevents me from
> picking a shard.
> 
> SELECT "InboundSubscription".s9id AS "InboundSubscription_s9id",
> "InboundSubscription".active AS "InboundSubscription_active",
> "InboundSubscription"."createdAt" AS "InboundSubscription_createdAt",
> "InboundSubscription"."updatedAt" AS "InboundSubscription_updatedAt",
> "InboundSubscription"."followerId" AS
> "InboundSubscription_followerId", "InboundSubscription"."producerId"
> AS "InboundSubscription_producerId", "InboundSubscription".status AS
> "InboundSubscription_status", "InboundSubscription".suspended AS
> "InboundSubscription_suspended"
> FROM "InboundSubscription"
> WHERE :param_1 = "InboundSubscription"."producerId"
> 
> When is this value populated? How can I access it in query_chooser?


The bindparam() object should have a "callable" attribute - call that to get 
the value.    These values are late-bound when using lazyloading.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to