Hello, Ok, thank you for the answer. I will try to look into that deeper then.
Best regards W dniu środa, 25 września 2013 02:51:06 UTC+2 użytkownik Michael Bayer napisał: > > > On Sep 23, 2013, at 8:13 AM, Piotr Deszyński > <desz...@red-sky.pl<javascript:>> > wrote: > > I'm tryign to do a bulk update using sqlalchemy ShardedSession. I've > stumbled on a problem when i have to do a bulk update without selecting > rows from a database. Here's how I've tried to do it: > > class Row(Base, object): #pylint: disable=I0011, R0903 > ''' > Row > ''' > > __tablename__ = 'my_table' > > some_primary = Column(Integer(11), primary_key=True) > sharded_attribute = Column(String()) > updated_attribute = Column(Integer(2)) > Session = > scoped_session(sessionmaker(class_=ShardedSession))Session.configure( > query_chooser=lambda x: SHARDS_LIST, > id_chooser=lambda x, y: SHARDS_LIST, > shard_chooser=my_shard_chooser, > autocommit=False) > > Then I'm making a query as follows: > > session.query(Row) \ > .filter_by(Row.sharded_attribute.in_(attributes_list)) \ > .update({Row.updated_attribute: 1}, synchronize_session=False) > > > the current implementation for ShardedQuery doesn't have support for the > update() or delete() methods. Those methods were added to Query long after > ShardedQuery was developed, and implementing them transparently is slightly > non-trivial (essentially has to emit the UPDATE or DELETE across all shards > that apply to the query_chooser, in the same way that > _execute_and_instances does). > > So the problem is, that sharded_attribute can be a list of rows which are > in different shards. Using such a query SQLAlchemy calls my_shard_chooser. > In this function I'm determining a shard or a shard list depending on the > params. There's a problem during the bulk update thought, becauseinstance > param > is None, so I don't have value of sharded_attribute. In that case there's > passed clause attribute, so using it I'm able to determine what values of > sharded_attribute were provided. Sadly these items might be in different > shards and I cannot return a list of shards ids (only single id is > supported). > > Does anybody know how I can change my approach to make it working? Do I > have to resign from using a session? Is there at all a way to do it other > than doing firstly select for all updated rows and then updating objects > and calling commit or making direct calls on engine's execute? > > > If I'm understanding correctly this is all due to update()/delete() not > being implemented. Looking at how these work right now, there's not a > straightforward path to override how they execute queries the way > _execute_and_instances() does, so you might be better off implementing your > own update()/delete() that's similar to how > ShardedQuery._execute_and_instances works, but uses core table.update() and > table.delete() constructs. > > -- 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/groups/opt_out.