Thanks anyway. It's sad horizontal shard extension is only considered as a example. I hardly believe it, because it works so great in some of my simple use case. I really hope there would be more work on this extension or more docs on how to do it.
Best regards! can On Thu, Apr 21, 2011 at 3:19 AM, Michael Bayer <[email protected]>wrote: > > On Apr 20, 2011, at 4:37 AM, can xiang wrote: > > > Hi, > > > > I have a problem of bulk deleting from a sharded session, I tried to > > search the previous posts without any finding. > > > > I have the following table: > > > > usersession_table = Table('kg_usersession', meta, > > Column('session_id', String(32), > > primary_key=True), > > Column('user_id', BigInteger, index=True, > > nullable=False), > > Column('create_time', DateTime, index=True), > > Column('expire_time', DateTime, index=True), > > Column('site', String(10)), > > mysql_engine='MyISAM' > > ) > > > > I use horizontal sharding by "session_id", with the following shard > > chooser: > > > > def shard_chooser(mapper, instance, clause=None): > > if instance: > > return shard_value(instance.session_id) > > > > Then, I want to delete all record earlier than a given expire_time, > > with the following code: > > > > > session.query(UserSession).filter(UserSession.expire_time<=expire_time).delete(); > > range deletions are not supported by the ShardedSession extension right > now. You'd need to implement your own delete() onto ShardedQuery. > > Note that the horizontal shard extension really should have been an > example, not a full extension. It's really just a proof of concept and > real-world horizontal sharding scenarios will usually need to tweak it for > specific use cases. > > > > > > > > > It raises an error: > > > > Traceback (most recent call last): > > File "delete_expire_session.py", line 20, in <module> > > delete_expire_session(expire_time) > > File "delete_expire_session.py", line 13, in delete_expire_session > > > > > session.query(UserSession).filter(UserSession.expire_time<=expire_time).delete(); > > File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.6.5- > > py2.6.egg/sqlalchemy/orm/query.py", line 2142, in delete > > result = session.execute(delete_stmt, params=self._params) > > File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.6.5- > > py2.6.egg/sqlalchemy/orm/session.py", line 726, in execute > > engine = self.get_bind(mapper, clause=clause, **kw) > > File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.6.5- > > py2.6.egg/sqlalchemy/ext/horizontal_shard.py", line 73, in get_bind > > return self.__binds[shard_id] > > KeyError: None > > > > I guess shard_chooser return None because of "instance" is None at > > runtime. I read from the docs: shard_chooser maybe in "some round- > > robin scheme". But I don't have any idea what does it exactly mean in > > my case. > > > > I appreciate any advice. > > > > Best regards! > > can > > > > > > PS: you can access partial source code in the gist: > https://gist.github.com/930708 > > > > -- > > 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. > > > > -- > 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. > > -- 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.
