Eh bien, il y a plusieurs façons d'y parvenir et cela dépend de la structure de votre application. Voici la méthode la plus simple :
meta = MetaData(schema="client1")
Si la façon dont votre application s'exécute est un "client" à la fois dans l'ensemble de l'application, vous avez terminé.
Mais ce qui peut être faux ici, c'est que chaque table de ces métadonnées se trouve sur ce schéma. Si vous souhaitez qu'une application prenne en charge plusieurs clients simultanément (généralement ce que signifie "multilocataire"), cela serait difficile à gérer car vous auriez besoin de créer une copie des métadonnées et de duper tous les mappages pour chaque client. Cette approche peut être effectuée, si vous le souhaitez vraiment, la façon dont cela fonctionne est que vous accédez à chaque client avec une classe mappée particulière comme :
client1_foo = Client1Foo()
et dans ce cas, vous travailleriez avec la recette "nom d'entité" à http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName en conjonction avec sometable.tometadata()
(voir http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata).
Disons donc que cela fonctionne vraiment avec plusieurs clients dans l'application, mais un seul à la fois par thread. En fait, le moyen le plus simple de le faire dans Postgresql serait de définir le chemin de recherche lorsque vous commencez à travailler avec une connexion :
# start request
# new session
sess = Session()
# set the search path
sess.execute("SET search_path TO client1")
# do stuff with session
# close it. if you're using connection pooling, the
# search path is still set up there, so you might want to
# revert it first
sess.close()
L'approche finale consisterait à remplacer le compilateur à l'aide de l'extension @compiles pour coller le nom "schéma" dans les instructions. C'est faisable, mais ce serait délicat car il n'y a pas de crochet cohérent partout où "Table" est généré. Votre meilleur pari est probablement de définir le chemin de recherche sur chaque demande.