<p>最终放弃了所有这些,转而使用<a href="https://github.com/simplegeo/sqlalchemy/blob/master/examples/sharding/attribute_shard.py" rel="nofollow">this ShardedSession example</a>。在</p>
<p>我的最后一堂课是这样的:</p>
<pre><code>class ShardSessionManager(object):
def __init__(self, month):
self.month = month
#Step1: database engines
self.engines = {}
for name, db in shard_dbs.iteritems():
self.engines[name] = create_engine('postgresql+psycopg2://', creator=db.get_connection, client_encoding='utf8')
#Step2: create session function - bind shard ids to databases within a ShardedSession
self.create_session = sessionmaker(class_=ShardedSession)
self.create_session.configure(shards=self.engines,
shard_chooser=self.shard_chooser,
id_chooser=self.id_chooser,
query_chooser=self.query_chooser)
#Step3: table setup
self._make_tables(self.month)
#Step4: map classes
self._map_tables()
@staticmethod
def shard_chooser(mapper, instance, clause=None):
if isinstance(instance, DataTable):
return id_chooser(instance.brand_id)
@staticmethod
def id_chooser(data_id):
...
@staticmethod
def query_chooser(query):
...
def _make_tables(self, month):
self.meta = MetaData()
self.data_table = DataTable(month, self.meta).table
... other tables ...
def _map_tables(self):
try:
mapper(DataTable, self.data_table,
properties={ ... })
...
def get_random_data(self, parent_id):
session = self.create_session()
return session.query(DataTable).filter(...
</code></pre>