Variablensubstitution in psql bei Verwendung von \ copy


8

Ich verwende den Befehl psql \ copy und möchte ihm eine Variable aus der Shell (für den Tabellennamen) übergeben, wie ich es beim Erstellen von Skriptabfragen getan habe. Ich habe in der Dokumentation zu psql gelesen, dass:

Die Syntax des Befehls ähnelt der des SQL COPY-Befehls. Beachten Sie, dass aus diesem Grund spezielle Parsing-Regeln für den Befehl \ copy gelten. Insbesondere gelten die Regeln für die Ersetzung von Variablen und die Escape-Schrägstriche nicht.

Dies scheint ziemlich definitiv zu sein, aber ich frage mich, ob jemand eine Problemumgehung kennt.

Antworten:


4

Sie können diese Einschränkung umgehen, indem Sie den gesamten Befehl an psql weiterleiten:

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

2

Bemerkung: Ich bin selbst auf dieses Problem unter MS Windows gestoßen und hatte bereits etwas, das ich mit seinem Standard in psql einspeisen konnte. Ich musste Eingaben kombinieren. Und hier wird es wirklich schwierig. Ich dachte, neben Erwins Antwort ein etwas wertvolles Beispiel meiner Meinung nach zu teilen, deshalb poste ich es hier als Antwort für den Fall, dass jemand anderes auch "Variable verwenden" muss, \copywährend er Daten in stdin auf der Windows-Plattform einspeist.

Wenn Sie einige Daten aus stdin kopieren und gleichzeitig "variable" verwenden möchten \copy, kann es schwierig werden, Klammern zu entfernen. Unten sehen Sie ein Beispiel, wie es gemacht werden kann. Beachten Sie das dreifache (sic!) Caret-Escape für Klammern, die Spaltennamen enthalten

@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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.