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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.