Alembic-Unterstützung für mehrere Postgres-Schemas

8

Wie kann ich Alembics --autogenerate verwenden, um mehrere Postgres-Schemas zu migrieren, die im SQL-Alchemie-Modell nicht fest codiert sind? (Spiegelfrage von SQLAlchemy-Unterstützung von Postgres Schemas , aber für Alembic).

>

Insbesondere verwenden wir Postgres-Schemas, um verschiedene Clients zu trennen, die denselben Satz von Tabellen teilen. Außerdem gibt es ein Schema mit shared Zeug unter den Clients. Das SQL Alchemy-Modell kennt keine Schemas, das Schema wird zur Laufzeit mit session.execute("SET search_path TO client1,shared") festgelegt.

Der Standardwert --autogenerate hilft überhaupt nicht, da er mehrere Schemas erkennt, die nicht im Modell vorhanden sind, und schließlich die Schemas löscht und jede Tabelle im Standardschema neu erstellt.

Ich würde aber gerne --autogenerate verwenden, um die Schemas richtig zu setzen, mit der richtigen Installation. Irgendwelche Vorschläge dazu, ob / wie Alembic's API das kann?

    
dtheodor 14.01.2014, 08:49
quelle

3 Antworten

1

Hier ist eine praktikable Lösung: Ссылка

Es erfordert immer noch, dass Sie den Schemanamen aus jeder Migration bearbeiten, nachdem sie generiert wurde, aber zumindest die interessante Arbeit wird von Alembic erledigt. Danke an Michael Bayer für Hilfe auf der Mailingliste.

    
Nick Retallack 18.11.2014 21:07
quelle
1

von Ausgabe 409 , die Anwendung auf Mieter- Spezifische Schemas von Upgrade / Downgrade-Operationen können am einfachsten mit übersetzten Schemanamen durchgeführt werden , das ist auch, wie Sie normalerweise die Hauptanwendung für Multi-Tenant tun würden.

Gehen Sie in env.py:

%Vor%

Oben wird der Schemaname "None" in den angegebenen Tenant-Namen übersetzt. Wenn die Anwendung mandantenbasierte Schemas mit einem Standardschema teilt, das globale Tabellen enthält, verwenden Sie ein Token wie "tenant_schema" als Symbol:

%Vor%

und in Migrationsdateien beziehen sich auf "tenant_schema", wobei der eigentliche mandantenspezifische Schemaname lautet:

%Vor%

Für den Fall "autogenerate" enthält die Lösung @ nick-retallack einige weitere Elemente, die Sie an diesem Ende verwenden würden, nämlich die Verwendung von include_schemas, sodass autogenerate nur ein "Muster" -Schema betrachtet, das das neueste darstellt Version des mandantenspezifischen Schemas.

Um env.py so einzurichten, dass das richtige System für den richtigen Befehl verwendet wird, können die Verhalten mithilfe von benutzerdefinierten Optionen mit migration_context.get_x_argument () .

    
zzzeek 05.07.2017 14:31
quelle
0

Das ist eine ziemlich alte Frage, aber für jeden, der auf dasselbe Problem gestoßen ist, habe ich es gelöst, indem ich Folgendes in meinem env.py verwendet habe:

%Vor%

Dabei ist build eine Zeichenfolge, die den gewünschten Schemanamen definiert. Mein Anwendungsfall ist etwas anders (mehrere verteilte Builds mit einer einzigen Datenbank, die mehrere identische Schemas enthält), aber ich stieß auf das gleiche Problem, bei dem der Alambic das Schema, mit dem ich mich verbinden wollte, nicht richtig erkannte.

Ich benutze Umgebungsvariablen, um den korrekten Build zu bestimmen, da es ziemlich gut mit Zappa funktioniert.

    
Tex Andersen 20.10.2017 01:23
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '401508',
    'url' => 'alembic-support-for-multiple-postgres-schemas',
];

$_COOKIE = [
    '_csrf-frontend' => '84ad29f8c5c90ff0a9a06e8a0c0430b98519f59c1b8af0cb5be2af0584bb43eba:2:{i:0;s:14:"_csrf-frontend";i:1;s:32:"vGEn_ZEUqEBI_UvwFCLOuTuAmTtwIxVY";}',
    'advanced-frontend' => '8841d9124a66f6c466722e108432261c',
];

$_SESSION = [
    '__flash' => [],
];