cũng có một vài cách để đi ở này và nó phụ thuộc vào cách bạn ứng dụng được cấu trúc. Đây là cách cơ bản nhất:
meta = MetaData(schema="client1")
Nếu cách ứng dụng của bạn chạy là một "khách hàng" tại một thời điểm trong toàn bộ ứng dụng, bạn đã hoàn tất.
Nhưng điều có thể sai với điều đó ở đây, mọi Bảng từ MetaData đó đều nằm trong lược đồ đó. Nếu bạn muốn một ứng dụng hỗ trợ nhiều khách hàng cùng một lúc (thường là những gì "đa nhiệm" có nghĩa là), điều này sẽ khó sử dụng vì bạn cần tạo một bản sao của MetaData và loại bỏ tất cả các ánh xạ cho mỗi máy khách. Cách tiếp cận này có thể được thực hiện, nếu bạn thực sự muốn, cách nó hoạt động là bạn muốn truy cập vào từng khách hàng với một lớp ánh xạ cụ thể như:
client1_foo = Client1Foo()
và trong trường hợp đó bạn muốn được làm việc với những "thực thể tên "công thức tại http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName kết hợp với sometable.tometadata()
(xem http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata).
Vì vậy, giả sử cách nó thực sự hoạt động là nhiều ứng dụng khách trong ứng dụng, nhưng mỗi lần chỉ có một khách hàng trong một chủ đề. Vâng trên thực tế, cách dễ nhất để làm điều đó trong PostgreSQL sẽ được thiết lập các đường dẫn tìm kiếm khi bạn bắt đầu làm việc với một kết nối:
# start request
# new session
sess = Session()
# set the search path
sess.execute("SET search_path TO client1")
# do stuff with session
# close it. if you're using connection pooling, the
# search path is still set up there, so you might want to
# revert it first
sess.close()
Cách tiếp cận chính thức sẽ được ghi đè lên các trình biên dịch sử dụng phần mở rộng @compiles để dính tên "lược đồ" trong các câu lệnh trong. Điều này là có thể thực hiện được, nhưng sẽ phức tạp vì không có một móc phù hợp cho mọi nơi "Bảng" được tạo ra. Đặt cược tốt nhất của bạn có thể là đặt đường dẫn tìm kiếm trên mỗi yêu cầu.
Cảm ơn! Tôi sẽ thử một vài điều và sau đó xem cái nào hoạt động tốt nhất và báo cáo lại nhưng tôi nghĩ con đường là con đường để đi. – eleddy
@zzzeek Tôi có câu hỏi về vấn đề này nhưng đối với Alembic, thực sự có thể sử dụng thông tin đầu vào của bạn: http://stackoverflow.com/questions/21109218/alembic-support-for-multiple-postgres-schemas – dtheodor
Ngẫu nhiên, tôi đã cố gắng thực hiện điều này cho cú pháp khai báo như: '' Base = declarative_base(); Base.metadata.schema = 'ebay'''. Có lẽ là một cách tốt hơn, mặc dù. –