Ну, есть несколько способов сделать это, и это зависит от структуры вашего приложения.Вот самый простой способ:
meta = MetaData(schema="client1")
Если ваше приложение работает по одному «клиенту» за раз во всем приложении, все готово.
Но что может бытьздесь неправильно то, что каждая таблица из этих метаданных находится в этой схеме.Если вы хотите, чтобы одно приложение поддерживало несколько клиентов одновременно (обычно это означает «мультитенант»), это было бы неудобно, так как вам нужно было бы создать копию метаданных и дублировать все сопоставления для каждого клиента.Этот подход может быть реализован, если вы действительно хотите, способ, которым он работает, заключается в том, что вы будете обращаться к каждому клиенту с помощью определенного сопоставленного класса, например:
client1_foo = Client1Foo()
, и в этом случае вы будете работать сРецепт «имя сущности» на http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName в сочетании с sometable.tometadata()
(см. http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata).
Итак, давайте скажем, что на самом деле работает несколько клиентов в приложении, но только по одному за разНа самом деле, самый простой способ сделать это в Postgresql - установить путь поиска, когда вы начнете работать с подключением:
# 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()
Последний подход - переопределить компилятор с помощью @компилирует расширение для вставки имени «схемы» в операторы. Это выполнимо, но было бы сложно, так как не везде есть согласованный хук, где генерируется «таблица». Лучше всего ставить путь поиска для каждого запроса.