2012-12-03 26 views
12

Tôi có một mô hình SQLAlchemy với một đối số giản đồ như vậy:Bắt SQLAlchemy phát hành CREATE SCHEMA trên create_all

Base = declarative_base() 

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

Khi tôi sử dụng Base.metadata.create_all (engine) nó một cách chính xác các vấn đề một CREATE TABLE với schema tên trên mặt trước như vậy "CREATE TABLE my_schema.roads (" nhưng Postgresql đúng phàn nàn rằng lược đồ không tồn tại.

Tôi thiếu một bước để có được SqlAlchemy phát hành CREATE SCHEMA my_schema hoặc tôi phải gọi điều này theo cách thủ công?

Trả lời

19

Tôi đã làm t theo cách thủ công trên tập lệnh init db của tôi như vậy:

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

Nhưng điều này có vẻ ít huyền diệu hơn tôi mong đợi.

+15

Tôi phải tạo lược đồ trước? Con kỳ lân ở đâu? – Purrell

+0

Tôi biết đã khá lâu rồi bạn đã đăng câu trả lời này, nhưng bạn có thể cho tôi biết cách bạn di chuyển các bảng trong giản đồ mới được tạo ra không? – Emu

9

Tôi chạy vào cùng một vấn đề và tin tưởng một cách "sạch" của việc ban hành DDL là một cái gì đó như thế này:

from sqlalchemy import event 
from sqlalchemy.schema import CreateSchema 

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

này sẽ đảm bảo rằng trước khi bất cứ điều gì chứa đựng trong các siêu dữ liệu của cơ sở của bạn được tạo, bạn có lược đồ cho nó. Tuy nhiên, điều này không kiểm tra xem lược đồ đã tồn tại hay chưa.

Bạn có thể làm CreateSchema('my_schema').execute_if(callback_=check_schema) nếu bạn có thể bị làm phiền khi viết lại số gọi check_schema ("Controlling DDL Sequences" trên should_create trong tài liệu). Hoặc, như một cách dễ dàng, chỉ cần sử dụng DDL("CREATE SCHEMA IF NOT EXISTS my_schema") thay vì (đối với Postgres):

from sqlalchemy import DDL 

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

Tôi có thể chạy các lần di chuyển của mình chỉ với giản đồ mới được tạo trong Postgres không? – Emu

+0

@Emu Bạn có thể muốn hỏi đó là một câu hỏi riêng. Nhưng có thể bạn sẽ phải kiểm tra xem lược đồ có tồn tại không - nếu không, hãy tạo nó và chạy bất kỳ chuyển đổi nào bạn muốn. Điều này không được bao phủ bởi câu trả lời của tôi. Bạn có thể muốn xem xét thư viện di chuyển đầy đủ, ví dụ: SQLAlchemy Di chuyển hoặc alembic. – vicvicvic

Các vấn đề liên quan