Hi.
I use my own `RoutingSession` and `RoutingQuery` implementation, most of it 
inspired by `sqlalchemy.ext.horizontal_shard`:

class RoutingSession(Session):
    def get_bind(self, mapper=None, clause=None, shard_id=None, **kwargs):
        original_bind = None
        try:
            original_bind = super(RoutingSession, self).get_bind(mapper, clause)
        except UnboundExecutionError:
            # may not be bound
            pass
        if shard_id is None:
            shard_id = TenantIDStorage.get_shard_id()  # just global storage
        bind_for_shard = self.__binds[shard_id]
        if original_bind is not None and original_bind.url == 
bind_for_shard.url:
            return original_bind
        else:
            return bind_for_shard

    def __init__(self, shards=None, query_cls=CachingQuery, 
engines_factory=None, **kwargs):
        super(RoutingSession, self).__init__(query_cls=query_cls, **kwargs)
        self.__binds = {}
        self.engines_factory = engines_factory
        if shards is not None:
            self.update_shards(**shards)

    def _add_bind(self, key, bind):
        self.__binds[key] = bind




class RoutingQuery(Query):
    def __init__(self, *args, **kwargs):
        super(RoutingQuery, self).__init__(*args, **kwargs)
        self._shard_id = TenantIDStorage.get_shard_id()

    def get(self, ident):
        self._check_bound_to_shard()
        return super(CachingQuery, self).get(ident)

    def _check_bound_to_shard(self):
        if self._shard_id is None:
            raise ValueError('query not bound to any shard')

    def _execute_and_instances(self, querycontext):
        self._check_bound_to_shard()
        querycontext.attributes['shard_id'] = self._shard_id
        result = self._connection_from_session(
            mapper=self._mapper_zero(),
            shard_id=self._shard_id).execute(
            querycontext.statement,
            self._params
        )
        return self.instances(result, querycontext)






Sometimes I got this error:

  File "/home/anton/Projects/proj/admin/proj/admin/views/stats.py", line 898, 
in _get_filters_from_request
    control_groups = [g.id for g in User.get_own_groups_query(current_user.id)]
  File 
"/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py",
 line 2802, in __iter__
    return self._execute_and_instances(context)
  File 
"/home/anton/Projects/proj/core/proj/core/orm_extensions/rouing_session.py", 
line 105, in _execute_and_instances
    shard_id=self._shard_id).execute(
  File 
"/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py",
 line 2806, in _connection_from_session
    **kw)
  File 
"/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 line 984, in connection
    bind = self.get_bind(mapper, clause=clause, **kw)
  File 
"/home/anton/Projects/proj/core/proj/core/orm_extensions/cachingquery.py", line 
279, in get_bind
    original_bind = super(RoutingSession, self).get_bind(mapper, clause)
  File 
"/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 line 1336, in get_bind
    if mapper and mapper.mapped_table.bind:
  File 
"/home/anton/Projects/proj/.venv/lib/python2.7/site-packages/sqlalchemy/sql/elements.py",
 line 539, in __bool__
    raise TypeError("Boolean value of this clause is not defined")
TypeError: Boolean value of this clause is not defined




I found that `mapper` in original `get_bind` always checks with `is not 
None` condition. There is only one place where condition omitted: `if 
mapper and mapper.mapped_table.bind...`. 
Possibly it is not correct? Or my code does not do something important? 

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
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 https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to