2015-02-19 22 views
11

Tôi đã sử dụng thiết bị đầu cuối Postgres psql nhập các tập tin CSV vào các bảng bằng cách sử dụng sau đâynhập khẩu PostgreSQL CSV từ dòng lệnh

COPY tbname FROM 
'/tmp/the_file.csv' 
delimiter '|' csv; 

mà hoạt động tốt ngoại trừ việc tôi phải được đăng nhập vào thiết bị đầu cuối psql để chạy nó.

Tôi muốn biết nếu có ai biết một cách để làm một lệnh tương tự như điều này từ dòng lệnh shell Linux tương tự như cách Postgres cho phép một lệnh shell như dưới đây

/opt/postgresql/bin/pg_dump dbname > /tmp/dbname.sql 

Điều này cho phép việc bán phá giá một cơ sở dữ liệu từ trình bao Linux mà không cần đăng nhập vào thiết bị đầu cuối psql.

Trả lời

17

Như đã nêu trong Các PostgreSQL Documentation (II. PostgreSQL Client Applications - psql), bạn có thể vượt qua một lệnh để psql với công tắc -c:

psql -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;" 
+0

wow cảm ơn bạn, tôi đã không thậm chí không nghĩ đến việc sử dụng tùy chọn -c – Trent

2

Cách linh hoạt nhất là sử dụng một vỏ HERE document, cho phép bạn sử dụng các biến shell bên trong truy vấn của bạn, thậm chí bên trong (đôi hoặc đơn) trích dẫn:

#!/bin/sh 

THE_USER=moi 
THE_DB=stuff 
THE_TABLE=personnel 
PSQL=/opt/postgresql/bin/psql 
THE_DIR=/tmp 
THE_FILE=the_file.csv 

${PSQL} -U ${THE_USER} ${THE_DB} <<OMG 
COPY ${THE_TABLE} FROM '${THE_DIR}/${THE_FILE}' delimiter '|' csv; 
OMG 
1

Để hoàn thành trước answer, tôi xin đề nghị:

psql -d your_dbname --user=db_username -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;" 
8

Giải pháp trong câu trả lời được chấp nhận sẽ chỉ hoạt động trên máy chủ và khi người dùng thực hiện truy vấn sẽ có quyền đọc tệp như được giải thích trong this SO answer.

Nếu không, một cách tiếp cận linh hoạt hơn là thay thế COPY lệnh của SQL với psql's "meta-command" called \copywhich takes all the same options as the "real" COPY, but is run inside the client (mà không cần phải cho ; ở cuối):

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv" 

As per docs, các \copy lệnh:

Thực hiện bản sao giao diện người dùng (máy khách). Đây là một hoạt động chạy lệnh SQL COPY, nhưng thay vì máy chủ đọc hoặc ghi tệp được chỉ định, psql đọc hoặc ghi tệp và định tuyến dữ liệu giữa máy chủ và hệ thống tệp cục bộ. Điều này có nghĩa là khả năng truy nhập và đặc quyền của tệp là của người dùng cục bộ, không phải máy chủ và không yêu cầu đặc quyền superuser SQL.


Bên cạnh đó, nếu the_file.csv chứa các tiêu đề trong dòng đầu tiên, nó có thể được công nhận bằng cách thêm header ở phần cuối của lệnh trên:

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header" 
Các vấn đề liên quan