2013-05-17 42 views
9

Tôi đang cố nhập một tệp .txt (khá lớn) vào một bảng địa lý trong PostgreSQL 9.1. Tôi đang ở trong thư mục/~ của máy chủ của tôi, với một tệp có tên US.txt được đặt trong thư mục đó. Tôi đặt search_path biến để geochat, tên của cơ sở dữ liệu Tôi đang làm việc ở đó tôi nhập truy vấn này:.Postgres COPY FROM csv file- Không có tập tin hoặc thư mục như vậy

COPY geonames 
FROM 'US.txt', 
DELIMITER E'\t', 
NULL 'NULL'); 

sau đó tôi nhận được lỗi này:

ERROR: could not open file "US.txt" for reading: No such file or directory. 

Tôi có phải gõ trong \i US.txt hoặc một cái gì đó tương tự đầu tiên, hoặc nó nên chỉ nhận được nó từ thư mục làm việc hiện tại?

Trả lời

9

Một vài quan niệm sai lầm:

1.

I'm in the /~ directory of my server

Không có thư mục /~. Đó là / (thư mục gốc) hoặc ~ (thư mục chính của người dùng hiện tại). Nó cũng không liên quan đến vấn đề.

2.

I set the search_path variable to geochat, the name of the database I'm working in

Các search_path có gì để làm với tên của cơ sở dữ liệu. Nó dành cho các sơ đồ bên trong cơ sở dữ liệu hiện tại. Bạn có thể cần phải thiết lập lại điều này.

3.
Bạn được yêu cầu phải sử dụng đường dẫn tuyệt đối cho tập tin của bạn. Như ghi nhận in the manual here:

filename

The absolute path name of the input or output file.

4.
DELIMITER: chỉ cần tiếng ồn.

The default is a tab character in text format

5.
NULL: Đó là khá phổ biến để sử dụng chuỗi thực tế 'NULL' cho một giá trị NULL. Bạn có chắc không?

The default is \N (backslash-N) in text format, and an unquoted empty string in CSV format.

tôi đoán (sau khi đặt lại search_path - hoặc bạn schema-đủ điều kiện tên bảng):

COPY geonames FROM '/path/to/file/US.txt'; 
+3

Tài liệu hướng dẫn bạn liên kết cho điểm 3. thực sự khẳng định rằng một đường dẫn tương đối là ok cho các tập tin đầu vào: 'Một tên tập tin đầu vào có thể là một đường dẫn tuyệt đối hoặc tương đối' http://www.postgresql.org/docs/current/interactive/sql-copy.html Mặc dù nó thực sự dường như không hoạt động với các đường dẫn tương đối. – Risadinha

2

Đường dẫn có liên quan đến máy chủ PostgreSQL, không phải là máy khách psql.

Giả sử bạn đang chạy PostgreSQL 9.4, bạn có thể đặt US.txt trong thư mục /var/lib/postgresql/9.4/main/.

1

nếu bạn đang chạy lệnh COPY của mình từ tập lệnh, bạn có thể có một bước trong tập lệnh tạo lệnh COPY với đường dẫn tuyệt đối chính xác.

MYPWD=$(pwd) 
echo "COPY geonames FROM '$MYPWD/US.txt', DELIMITER E'\t';" 
MYPWD= 

sau đó bạn có thể chạy phần này vào một tập tin và thực hiện nó

./step_to_create_COPY_with_abs_path.sh >COPY_abs_path.sql 
psql -f COPY_abs_path.sql -d your_db_name 
Các vấn đề liên quan