2011-09-30 34 views
6

Tôi có một kịch bản PostgreSQL (nói, MAIN.sql trong ~/sql/) trong đó có những dòng nhưLàm cách nào để bao gồm các tệp liên quan đến tập lệnh thực thi hiện tại trong psql?

 
\i components/helper-functions.sql 

này bao gồm các tác phẩm mỹ nếu $ PWD cũng giống như thư mục của kịch bản của tôi (~/sql/), nhưng nếu nó là không, nó tìm kiếm tệp được bao gồm tương đối với $ PWD thay vì tương ứng với MAIN.sql.

Vì vậy, nếu tôi gọi là kịch bản từ ~/, nó sẽ tìm kiếm ~/components/helper-functions.sql và không cho ~/sql/components/helper-functions.sql.

Tôi nghĩ rằng một \ir chỉ thị mới sẽ được đưa vào 9.2 cho chính xác vấn đề này, nhưng tôi đang chạy 8.3

+0

Bạn đang nói về psql (máy khách), chứ không phải PostgreSQL mỗi lần phải không? –

+0

Yup, đúng là –

Trả lời

13

Vượt qua tên thư mục trong như là một biến psql và sử dụng để lắp ráp các đường dẫn tuyệt đối đến các tệp được bao gồm, ví dụ:

$ cat ./tmp/foo.sql 
\echo 'This is foo.' 
\set abs_bar_sql :DIR '/bar.sql' 
\i :abs_bar_sql 

$ cat ./tmp/bar.sql 
\echo 'This is bar.' 

$ psql -f ./tmp/foo.sql -v DIR=$PWD/tmp 
This is foo. 
This is bar. 

Nó không đẹp, nhưng đó là lý do tại sao \ir đang được thêm vào sau khi tất cả.

+0

Đó là những gì tôi đã kết thúc, chắc chắn không đẹp khi có hơn 20 thành phần được bao gồm: / –

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