def setup_session(cls): global create_session shard_lookup = { "North America": "north_america", "Asia": "asia", "Europe": "europe", "South America": "south_america", } def shard_chooser(mapper, instance, clause=None): if isinstance(instance, WeatherLocation): return shard_lookup[instance.continent] else: return shard_chooser(mapper, instance.location) def id_chooser(query, ident): return ["north_america", "asia", "europe", "south_america"] def execute_chooser(orm_context): ids = [] query = orm_context.statement class FindContinent(sql.ClauseVisitor): def visit_binary(self, binary): if binary.left.shares_lineage( weather_locations.c.continent ): if binary.operator == operators.eq: ids.append(shard_lookup[binary.right.value]) elif binary.operator == operators.in_op: for value in binary.right.value: ids.append(shard_lookup[value]) if query.whereclause is not None: FindContinent().traverse(query.whereclause) if len(ids) == 0: return ["north_america", "asia", "europe", "south_america"] else: return ids create_session = sessionmaker( class_=ShardedSession, autoflush=True, autocommit=False ) create_session.configure( shards={ "north_america": db1, "asia": db2, "europe": db3, "south_america": db4, }, shard_chooser=shard_chooser, id_chooser=id_chooser, execute_chooser=execute_chooser, )
def setup_session(cls): global create_session shard_lookup = { "North America": "north_america", "Asia": "asia", "Europe": "europe", "South America": "south_america", } def shard_chooser(mapper, instance, clause=None): if isinstance(instance, WeatherLocation): return shard_lookup[instance.continent] else: return shard_chooser(mapper, instance.location) def id_chooser(query, ident): return ["north_america", "asia", "europe", "south_america"] def query_chooser(query): ids = [] class FindContinent(sql.ClauseVisitor): def visit_binary(self, binary): if binary.left.shares_lineage( weather_locations.c.continent ): if binary.operator == operators.eq: ids.append(shard_lookup[binary.right.value]) elif binary.operator == operators.in_op: for bind in binary.right.clauses: ids.append(shard_lookup[bind.value]) if query._criterion is not None: FindContinent().traverse(query._criterion) if len(ids) == 0: return ["north_america", "asia", "europe", "south_america"] else: return ids create_session = sessionmaker( class_=ShardedSession, autoflush=True, autocommit=False ) create_session.configure( shards={ "north_america": db1, "asia": db2, "europe": db3, "south_america": db4, }, shard_chooser=shard_chooser, id_chooser=id_chooser, query_chooser=query_chooser, )