2012-12-03 6 views
12

Ho un modello SQLAlchemy con un argomento schema in questo modo:Ottenere SQLAlchemy di emettere CREATE SCHEMA su create_all

Base = declarative_base() 

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

Quando uso Base.metadata.create_all (motore) si emette correttamente un CREATE TABLE con lo schema nome sulla parte frontale come "CREATE TABLE my_schema.roads (" ma Postgresql si lamenta giustamente che lo schema non esiste.

Mi manca un passaggio per ottenere SqlAlchemy per emettere il CREATE SCHEMA my_schema o devo chiamare questo manualmente?

risposta

19

Ho fatto io t manualmente sul mio script db init in questo modo:

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

Ma questo sembra meno magico di quanto mi aspettassi.

+15

Devo prima creare lo schema? Dove sono gli unicorni? – Purrell

+0

So che è da parecchio tempo che hai postato questa risposta, ma puoi dirmi come hai migrato le tabelle nello schema appena creato? – Emu

9

Ho incontrato lo stesso problema e che il modo "pulito" del rilascio del DDL è qualcosa di simile:

from sqlalchemy import event 
from sqlalchemy.schema import CreateSchema 

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

Questo farà sì che prima di tutto contenute nei metadati del vostro supporto è, è avere lo schema per questo Questo, tuttavia, non controlla se lo schema esiste già.

Si può fare CreateSchema('my_schema').execute_if(callback_=check_schema) se si può essere disturbati a scrivere il check_schema callback ("Controlling DDL Sequences" su should_create nei documenti). Oppure, come semplice soluzione, usa invece DDL("CREATE SCHEMA IF NOT EXISTS my_schema") (per Postgres):

from sqlalchemy import DDL 

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

Posso eseguire le mie migrazioni solo per lo schema appena creato in Postgres? – Emu

+0

@Emu Potresti chiederlo come una domanda separata. Ma probabilmente dovresti controllare se lo schema non esiste - se non lo fa, crearlo ed eseguire qualsiasi migrazione tu voglia. Questo non è strettamente coperto dalla mia risposta. Ad esempio, potresti voler esaminare una libreria completa delle migrazioni, ad es. SQLAlchemy Migrate o alambicco. – vicvicvic

Problemi correlati