2012-06-15 7 views
9

Tôi đã phát triển một ứng dụng bằng cách sử dụng postgresql và nó hoạt động tốt.sử dụng lược đồ trong postgresql

Bây giờ tôi cần phải tạo một số trường hợp của cùng một ứng dụng nhưng tôi chỉ có một cơ sở dữ liệu. Vì vậy, tôi đang suy nghĩ về việc sử dụng lược đồ, để tôi có thể nhóm từng bảng mẫu trong một lược đồ khác.

Bây giờ, tôi không muốn viết lại tất cả các chức năng và tập lệnh, vì vậy tôi tự hỏi liệu tôi có thể sử dụng một số chỉ thị để hướng dẫn cơ sở dữ liệu hoạt động trên một lược đồ cụ thể hay không. Chỉ cần cố gắng để làm cho nó rõ ràng hơn, bạn có biết khi trong C++ bạn làm

using namespace std; 

để bạn có thể sử dụng cout thay vì std::cout? Tôi muốn sử dụng đôi khi tương tự nếu có thể.

+2

Trong các kịch bản lệnh SQL, bạn có thể sử dụng 'lược đồ bộ 'schemaname';' và tất cả các tên bảng/khung nhìn không đủ tiêu chuẩn sẽ tham chiếu đến lược đồ 'schemaname'. Xem http://www.postgresql.org/docs/9.1/static/sql-set.html. –

+0

bạn có biết tôi có thể sử dụng nó với psycopg python không? Và nó chỉ ảnh hưởng đến kết nối hiện tại hay cũng là những kết nối khác có thể hoạt động với cơ sở dữ liệu? –

+2

'đặt tên lược đồ phiên '', theo tài liệu" Chỉ định rằng lệnh này có hiệu lực cho phiên hiện tại. (Đây là mặc định nếu không có SESSION hoặc LOCAL xuất hiện.) ". Tôi không thể nói với bạn bây giờ nếu nó hoạt động cho psycopg - có lẽ là có. –

Trả lời

14

Tham số bạn đang tìm kiếm là search_path - liệt kê các lược đồ một truy vấn sẽ tìm trong Vì vậy, bạn có thể làm điều gì đó như:.

CREATE TABLE schema1.tt ... 
CREATE TABLE schema2.tt ... 
CREATE FUNCTION schema1.foo() ... 
CREATE FUNCTION schema2.foo() ... 
SET search_path = schema1, something_else; 
SELECT * FROM tt;  -- schema1.tt 
SELECT * FROM schema2.tt -- schema2.tt 
SELECT foo();   -- calls schema1.foo 
SELECT schema2.foo(); -- calls schema2.foo 

Lưu ý rằng nếu kế hoạch của một truy vấn được lưu bên trong cơ thể của foo() sau đó bạn có thể nhận được một kết quả bất ngờ. Tôi khuyên bạn nên luôn liệt kê các lược đồ một cách rõ ràng cho các bảng được tham chiếu trong các hàm plpgsql nếu bạn đang sử dụng các bảng trùng lặp. Nếu không, hãy đảm bảo bạn đã thử nghiệm tại chỗ để kiểm tra hành vi bằng search_path chaning.

Ồ - bạn cũng có thể đặt rõ ràng search_path cho nội dung của hàm - xem tham chiếu CREATE FUNCTION của hướng dẫn sử dụng để biết chi tiết.