2012-12-03 8 views
12

Mam modelu sqlalchemy z argumentem schematu tak:Pierwsze SQLAlchemy do wydawania TWORZENIE schematu w create_all

Base = declarative_base() 

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

Gdy używam Base.metadata.create_all (silnik) to prawidłowo wystawia CREATE TABLE ze schematem wymienić na froncie tak jak „CREATE my_schema.roads tabeli (” ale Postgresql słusznie twierdzi, że schemat nie istnieje.

jestem brakuje krok, aby uzyskać sqlalchemy wydania my_schema create schema czy mam zadzwonić to ręcznie?

Odpowiedz

19

zrobiłem I t ręcznie na moim db skrypcie tak:

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

Ale to wydaje się mniej magiczny niż się spodziewałem.

+15

muszę stworzyć schemat pierwszy? Gdzie są jednorożce? – Purrell

+0

Wiem, że od dłuższego czasu opublikowałeś tę odpowiedź, ale czy możesz mi powiedzieć, w jaki sposób migrowałeś tabele w nowo utworzonym schemacie? – Emu

9

wpadłem na tej samej kwestii i uważają, że „najczystszych” sposób wydawania DDL jest coś takiego:

from sqlalchemy import event 
from sqlalchemy.schema import CreateSchema 

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

To zapewni, że zanim cokolwiek zawartych w metadanych bazy jest tworzony, ty mieć schemat. Nie sprawdza to jednak, czy schemat już istnieje.

Można zrobić CreateSchema('my_schema').execute_if(callback_=check_schema) czy można być jedno, aby napisać zwrotnego („Controlling DDL Sequences” na should_create w Dokumentach) check_schema. Albo, jako łatwy sposób na zewnątrz, wystarczy użyć DDL("CREATE SCHEMA IF NOT EXISTS my_schema") zamiast (dla PostgreSQL):

from sqlalchemy import DDL 

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

Czy mogę uruchamiać moje migracje tylko dla nowo utworzonego schematu w Postgresie? – Emu

+0

@Emu Możesz zadać to jako osobne pytanie. Ale prawdopodobnie musisz sprawdzić, czy schemat nie istnieje - jeśli nie, stwórz go i uruchom dowolną migrację. Nie jest to ściśle objęte moją odpowiedzią. Możesz zajrzeć do biblioteki pełnej migracji, np. SQLAlchemy Migrate lub alembic. – vicvicvic

Powiązane problemy