Impor file CSV PostgreSQL menyebabkan Kesalahan Sintaks

8

Saya mencoba mengimpor file CSV ke dalam basis data melalui perintah "COPY"; Namun, saya mendapatkan kesalahan (yang tampaknya umum) bahwa saya harus menjadi superuser dan saya harus menggunakan "\ copy". Namun, ketika menggunakan \ copy, saya mendapatkan kesalahan sintaksis:

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

Dengan tanda sisir menunjuk ke "\". Inilah pertanyaan saya:

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

Saya mencoba "salin" dan "\ salin". Yang pertama memberi saya kesalahan pengguna super yang terakhir memberi saya kesalahan sintaks. Ada ide tentang cara memperbaikinya? buat itu bekerja?

Saya menjalankan perintah melalui bidang input sql myPgAdmin.

Satu-satunya pertanyaan lain yang saya miliki adalah mengenai mengimpor kolom melalui tablename (kolom2, kolom3 dan seterusnya. Apakah itu sintaks yang benar untuk itu?

antjanus
sumber

Jawaban:

8

\copyadalah perintah psql (commandline). Ini bukan perintah SQL biasa.

Anda harus menggunakan COPY sebagai gantinya (tetapi itu membutuhkan file untuk hadir di server database)

seekor kuda tanpa nama
sumber
Bagaimana Anda mengimpor file CSV secara langsung melalui SQL daripada menggunakan commandline?
antjanus
1
@antjanus: Anda akan menggunakan perintah COPY seperti yang telah saya sebutkan (dan adam menjelaskan secara rinci)
a_horse_with_no_name
sekali lagi, itu membutuhkan izin pengguna super dan tidak aman, kan?
antjanus
4

Silakan merujuk ke manual postgres untuk COPY .

Dalam pgAdmin (atau string sql yang Anda berikan melalui skrip atau koneksi db lainnya) Anda hanya akan menggunakan COPY tanpa awalan "\".

jadi masukkan sesuatu seperti: COPY tablename....

Anda perlu memastikan bahwa Anda memiliki hak istimewa yang relevan untuk menjalankan perintah, jadi dalam hal ini Anda harus dapat login ke database dan memiliki akses tulis ke 'tablename'. Postgres juga harus dapat menjangkau file, sehingga path / home / uploads / harus dapat diakses di server database dan pengguna postgres harus dapat membaca file - periksa izin untuk file dan direktori.

adam f
sumber
2

Pada sistem 9,1 saya kesalahan yang saya dapatkan cukup informatif:

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.

Jika Anda membaca petunjuk itu lagi dengan seksama, Anda dapat menyalin dari stdin. Inilah yang sebenarnya \ copy dalam psql di back-end. Lihat dokumen di http://www.postgresql.org/docs/8.3/static/sql-copy.html untuk informasi lebih lanjut.

Anda kemudian bisa memasukkan isi salinan ke dalam kueri Anda atau setidaknya begitulah cara kerjanya di psql.

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

Begitulah cara saya melakukannya di pgAdmin3. Tapi periksa hak pengguna dengan hati-hati, terkadang hak adalah masalahnya. (postgres pengguna di filename.txt / chmod 777)

Martin
sumber
Anda harus menjadi pengguna super db untuk melakukan itu meskipun karenanya keluhan asli.
Chris Travers
0

Metode lain adalah membuat tampilan untuk kueri sql. Kemudian gunakan perintah \ copy.

NinjaLoop
sumber
2
Eksposisi yang lebih besar akan sangat membantu.
Michael Green
Bagaimana tampilan membantu saat mengimpor data?
a_horse_with_no_name