также есть несколько способов, чтобы идти на это, и это зависит от того, как приложение структурировано. Вот самый основной способ:
meta = MetaData(schema="client1")
Если путь работает ваше приложение один «клиент» в то время, в течение всего приложения, вы сделали.
Но что может быть неправильно с этим, каждая таблица из этой MetaData находится на этой схеме. Если вы хотите, чтобы одно приложение поддерживало несколько клиентов одновременно (обычно это означает «многопользовательский»), это было бы громоздким, так как вам нужно было бы создать копию MetaData и обмануть все сопоставления для каждого клиента. Такой подход может быть сделан, если вы действительно хотите, то, как это работает, вы обращаетесь к каждому клиенту с определенным отображенным классом, как:
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()
Окончательный подход будет переопределить компилятор с помощью расширения @compiles, чтобы наклеить имя "schema" внутри операторов. Это выполнимо, но было бы сложно, потому что везде не было согласованного крючка «Таблица». Ваш лучший выбор, вероятно, задает путь поиска по каждому запросу.
Спасибо! Я попробую пару вещей, а затем посмотрю, какие из них лучше всего работают и отчитываются, но я думаю, что путь - это путь. – eleddy
@zzzeek У меня есть зеркальный вопрос об этом, но для Alembic можно реально использовать ваш вход: http://stackoverflow.com/questions/21109218/alembic-support-for-multiple-postgres-schemas – dtheodor
Кстати, мне удалось сделать это для декларативного синтаксиса типа: '' Base = declarative_base(); Base.metadata.schema = 'ebay'''. Однако, вероятно, лучший способ. –