2012-12-03 3 views
12

ich ein sqlalchemy Modell wie so mit einem Schema Argument zur Ausgabe von CREATE:SQLAlchemy Erste SCHEMA auf create_all

Base = declarative_base() 

class Road(Base): 
    __tablename__ = "roads" 
    __table_args__ = {'schema': 'my_schema'} 
    id = Column(Integer, primary_key=True) 

Wenn ich Base.metadata.create_all (Motor) verwenden, gibt sie korrekt ein CREATE TABLE mit dem Schema Name auf der Vorderseite wie so "CREATE TABLE my_schema.roads (" aber Postgresql beschwert sich zu Recht, dass das Schema nicht existiert.

Ich vermisse einen Schritt, um SqlAlchemy die CREATE SCHEMA my_schema oder ich muss aufrufen dies manuell?

Antwort

19

Ich habe ich getan t manuell auf meinem Db-Init-Skript wie folgt:

from sqlalchemy.schema import CreateSchema 
engine.execute(CreateSchema('my_schema')) 

Aber das scheint weniger magisch als ich erwartet hatte.

+15

Ich habe zuerst das Schema erstellen? Wo sind die Einhörner? – Purrell

+0

Ich weiß, es ist ziemlich lange her, dass Sie diese Antwort gepostet haben, aber können Sie mir sagen, wie Sie die Tabellen im neu erstellten Schema migriert haben? – Emu

9

lief ich in das gleiche Problem und glaube, dass der „saubersten“ Weg die DDL der Ausgabe von so etwas wie diese:

from sqlalchemy import event 
from sqlalchemy.schema import CreateSchema 

event.listen(Base.metadata, 'before_create', CreateSchema('my_schema')) 

Dies werden die zuvor in den Metadaten Ihrer Basis enthielt alles sicherzustellen, erstellt, Sie habe das Schema dafür. Dies überprüft jedoch nicht, ob das Schema bereits existiert.

Sie können CreateSchema('my_schema').execute_if(callback_=check_schema) tun, wenn Sie den check_schema Rückruf schreiben gestört werden können („Controlling DDL Sequences“ auf should_create in docs). Oder, wie ein einfacher Ausweg, benutzen Sie einfach DDL("CREATE SCHEMA IF NOT EXISTS my_schema") statt (für Postgres):

from sqlalchemy import DDL 

event.listen(Base.metadata, 'before_create', DDL("CREATE SCHEMA IF NOT EXISTS my_schema")) 
+0

Kann ich meine Migrationen nur für neu erstellte Schemas in Postgres ausführen? – Emu

+0

@Emu Sie können das als eine separate Frage stellen. Aber Sie müssten wahrscheinlich prüfen, ob das Schema nicht existiert - wenn nicht, erstellen Sie es und führen Sie die gewünschte Migration aus. Dies ist nicht streng durch meine Antwort abgedeckt. Möglicherweise möchten Sie in eine vollständige Migrationsbibliothek z. SQLAlchemy Migrate oder Alembic. – vicvicvic

Verwandte Themen