2012-12-03 20 views
12

SCHEMA我有一個模式的說法,就像這樣的SQLAlchemy模型:獲取SQLAlchemy的發出創建create_all

Base = declarative_base() 

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

當我使用Base.metadata.create_all(發動機),它正確地發出CREATE TABLE與模式名字在前面像這樣「CREATE TABLE my_schema.roads(」但是Postgresql正確地抱怨該架構不存在。

我是否錯過了讓SqlAlchemy發出CREATE SCHEMA my_schema或者我必須調用的步驟這手動?

回答

19

我已經做了我t手動在我的db初始化腳本像這樣:

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

但這似乎不像我期待的那樣神奇。

+15

我必須先創建模式?獨角獸在哪裏? – Purrell

+0

我知道你已經發布了這個答案的時間相當長,但是你能告訴我你是如何在新創建的模式中遷移表的? – Emu

9

我遇到同樣的問題,並相信發出DDL的「最乾淨」的方式是這樣的:

from sqlalchemy import event 
from sqlalchemy.schema import CreateSchema 

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

這將確保包含在你的基地的元數據,任何事情之前被創建,你有它的架構。但是,這並不檢查模式是否已經存在。

如果您可能會困擾於編寫check_schema回調(在文檔should_create),您可以做CreateSchema('my_schema').execute_if(callback_=check_schema)。或者,作爲一個簡單的方法,只需使用DDL("CREATE SCHEMA IF NOT EXISTS my_schema")(代替Postgres):

from sqlalchemy import DDL 

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

我可以在Postgres中只爲新創建的模式運行我的遷移嗎? – Emu

+0

@Emu你可能想問一個單獨的問題。但是您可能必須檢查模式是否不存在 - 如果不存在,請創建它並運行您想要的任何遷移。這不是我的答案嚴格涵蓋的。您可能需要查看完整的遷移庫,例如SQLAlchemy遷移或alembic。 – vicvicvic

相關問題