PostgreSQL nhập tệp CSV gây ra lỗi cú pháp


8

Tôi đang cố gắng nhập tệp CSV vào cơ sở dữ liệu thông qua lệnh "COPY"; tuy nhiên, tôi nhận được lỗi (có vẻ phổ biến) mà tôi cần phải là siêu người dùng và thay vào đó tôi nên sử dụng "\ copy". Tuy nhiên, khi sử dụng \ copy, tôi gặp lỗi cú pháp:

ERROR:  syntax error at or near "\"
LINE 1: \copy

Với dấu mũ chỉ vào "\". Đây là truy vấn của tôi:

\copy tablename(column2, column3, column4, column5) from '/home/uploads/data.csv' WITH DELIMITER ',' CSV HEADER'

Tôi đã thử cả "sao chép" và "\ sao chép". Cái đầu tiên cho tôi một lỗi superuser, cái sau cho tôi lỗi cú pháp đó. Bất kỳ ý tưởng về cách khắc phục nó? lam cho no hoạt động?

Tôi đang thực thi lệnh thông qua trường nhập liệu sql của myPgAdmin.

Câu hỏi duy nhất khác mà tôi có liên quan đến việc nhập các cột thông qua tablename (cột2, cột 3, v.v. Đó có phải là cú pháp đúng cho điều đó không?

Câu trả lời:


8

\copylà một lệnh psql (dòng lệnh). Nó không phải là một lệnh SQL thông thường.

Bạn sẽ cần sử dụng COPY thay thế (nhưng điều đó đòi hỏi phải có tệp trên máy chủ cơ sở dữ liệu)


Làm thế nào bạn có thể nhập tệp CSV trực tiếp thông qua SQL thay vì sử dụng một dòng lệnh?
antjanus

1
@antjanus: bạn sẽ sử dụng lệnh COPY như tôi đã đề cập (và adam đã giải thích chi tiết)
a_horse_with_no_name

một lần nữa, điều đó đòi hỏi quyền siêu người dùng và không an toàn, phải không?
antjanus

4

Vui lòng tham khảo hướng dẫn sử dụng postgres cho COPY .

Trong pgAdmin (hoặc chuỗi sql bạn truyền qua tập lệnh hoặc kết nối db khác), bạn sẽ chỉ sử dụng COPY mà không có tiền tố "\".

vì vậy hãy nhập một cái gì đó như: COPY tablename....

Bạn cần đảm bảo rằng bạn có các đặc quyền liên quan để chạy lệnh, vì vậy trong trường hợp này, bạn cần có thể đăng nhập vào cơ sở dữ liệu và có quyền truy cập ghi vào 'tablename'. Postgres cũng cần có khả năng truy cập tệp, vì vậy có thể truy cập đường dẫn / home / uploads trên máy chủ cơ sở dữ liệu và người dùng postgres có thể đọc tệp - kiểm tra quyền đối với tệp và thư mục.


2

Trên hệ thống 9.1 của tôi, lỗi tôi nhận được khá nhiều thông tin:

or_examples=> copy comp_table_test from '/tmp/test';
ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

Nếu bạn đọc gợi ý một lần nữa cẩn thận, nó ghi chú bạn có thể sao chép từ stdin. Đây là những gì \ copy trong psql thực sự làm ở back-end. Xem các tài liệu tại http://www.postgresql.org/docs/8.3/static/sql-copy.html để biết thêm thông tin.

Sau đó, bạn có thể đặt phần thân của bản sao vào truy vấn của mình hoặc ít nhất đó là cách nó hoạt động trong psql.


1
copy coordina from '/tmp/filename.txt' WITH NULL AS ;

Đó là cách tôi làm điều đó trong pgAdmin3. Nhưng kiểm tra cẩn thận người dùng, đôi khi các quyền là vấn đề. (người dùng gửi bài trên filename.txt / chmod 777)


bạn phải là một siêu người dùng db để làm điều đó mặc dù đó là khiếu nại ban đầu.
Chris Travers

0

Một phương pháp khác là tạo ra một khung nhìn cho truy vấn sql. Sau đó sử dụng lệnh \ copy.


2
Giải thích lớn hơn sẽ hữu ích nhất.
Michael Green

Làm thế nào để xem giúp khi nhập dữ liệu?
a_horse_with_no_name
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.