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.