Thay thế biến trong psql khi sử dụng \ copy


8

Tôi đang sử dụng lệnh psql \ copy và tôi muốn chuyển một biến cho nó từ trình bao (đối với tên bảng) như tôi đã thực hiện khi truy vấn kịch bản. Tôi đã đọc trong tài liệu về psql rằng:

Cú pháp của lệnh tương tự như lệnh SQL COPY. Lưu ý rằng, vì điều này, các quy tắc phân tích cú pháp đặc biệt áp dụng cho lệnh \ copy. Cụ thể, các quy tắc thay thế biến đổi và thoát dấu gạch chéo ngược không được áp dụng.

Điều này có vẻ khá dứt khoát, tuy nhiên tôi đang tự hỏi liệu có ai biết về cách giải quyết không?

Câu trả lời:


4

Bạn có thể phá vỡ giới hạn này bằng cách chuyển toàn bộ lệnh tới psql:

echo "\copy tbl FROM '/path/to/myfile.pgsql'" | psql mydb

2

Lưu ý: Tôi đã vấp phải sự cố này trên MS Windows và tôi đã có một cái gì đó để cung cấp cho psql bằng cách sử dụng stdin của nó. Tôi đã phải kết hợp đầu vào. Và đó là nơi nó thực sự khó khăn. Tôi nghĩ rằng để chia sẻ một phần có giá trị trong ví dụ ý kiến ​​của tôi, bên cạnh câu trả lời của Erwin, vì vậy tôi sẽ đăng nó ở đây như một câu trả lời trong trường hợp người khác cũng cần "sử dụng biến" \copytrong khi cung cấp dữ liệu vào stdin trên nền tảng Windows.

Nếu bạn muốn sao chép một số dữ liệu từ stdin và sử dụng "biến" \copycùng một lúc, mọi thứ có thể trở nên khó khăn với dấu ngoặc đơn thoát. Dưới đây là một ví dụ làm thế nào nó có thể được thực hiện. Lưu ý thoát ba dấu ba (sic!) Cho dấu ngoặc đơn tên cột

@echo off
set TBL=wd
(
 echo truncate %TBL%;
 echo \copy %TBL% (depth,path,name,created,accessed,modified,size^^^) from stdin csv
 C:\msys64\usr\bin\find ^
  "e:/somepath" ^
  -type f -printf "%%d,\"%%h\",\"%%f\",\"%%t\",\"%%a\",\"%%c\",%%s\n"
) | "C:\Program Files\PostgreSQL\9.4\bin\psql.exe" -h some.server -U user dbname
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.