PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

wie man Variablen in einem psql-Skript verwendet

Zunächst versuchen Sie, zwei Strings mit + zu verketten Operator, aber der SQL-Operator für die Verkettung ist || , mit diesen Informationen könnte man annehmen, dass das erwartete Ergebnis (funktioniert nicht ):

\set path '''c:\\server\\data\\'''
COPY paymentMethods (name,regexString) FROM :path || 'paymentMethods.csv' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :path || 'priceLevels.csv' WITH (FORMAT csv, HEADER false);

Aber! Die COPY Befehl erwartet eine wörtliche Zeichenfolge für den Pfad, keinen Ausdruck, also sollten Sie den Pfad wirklich angeben. Beachten Sie, dass es für Befehle wie SELECT funktionieren würde , INSERT , UPDATE usw.

Mit diesen Informationen können Sie nur psql verwenden Variablen, wie Pavel gezeigt hat, und verketten die Zeichenfolgen zu einem psql 's Variable. Eine gute Lösung ist die Verwendung von psql 's :'var' Syntax, die die Variable als String in den SQL-Ausdruck einfügt:

\set path 'c:\\server\\data\\'
\set paymentMethodsPath :path 'paymentMethods.csv'
\set priceLevelsPath :path 'priceLevels.csv'
COPY paymentMethods (name,regexString) FROM :'paymentMethodsPath' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :'priceLevels' WITH (FORMAT csv, HEADER false);

Was generiert (wird an den PostgreSQL-Server gesendet):

COPY paymentMethods (name,regexString) FROM E'c:\\server\\data\\paymentMethods.csv' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM E'c:\\server\\data\\priceLevels.csv' WITH (FORMAT csv, HEADER false);

Dieses :'var' Syntax funktioniert nicht auf allen psql Versionen (ich weiß jetzt nicht mehr, welche das eingeführt wurde), aber für alte Versionen können Sie einfach Dollar-Quotes verwenden:

\set path 'c:\\server\\data\\'
\set paymentMethodsPath :path 'paymentMethods.csv'
\set priceLevelsPath :path 'priceLevels.csv'
COPY paymentMethods (name,regexString) FROM $$:paymentMethodsPath$$ WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM $$:priceLevels$$ WITH (FORMAT csv, HEADER false);

Oder in einfache Anführungszeichen umwandeln:

\set path 'c:\\server\\data\\'
\set paymentMethodsPath 'E''':path'paymentMethods.csv'''
\set priceLevelsPath 'E''':path'priceLevels.csv'''
COPY paymentMethods (name,regexString) FROM :paymentMethodsPath WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :priceLevels WITH (FORMAT csv, HEADER false);

Das ist es.