PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

jak używać zmiennych w skrypcie psql

Przede wszystkim próbujesz połączyć dwa ciągi za pomocą + operator, ale operatorem SQL dla konkatenacji jest || , dzięki tym informacjom można by pomyśleć, że oczekiwany wynik będzie (nie zadziała ):

\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);

Ale! COPY polecenie oczekuje ciągu literału dla ścieżki, a nie wyrażenia, więc naprawdę powinieneś podać ścieżkę. Zauważ, że zadziała dla poleceń takich jak SELECT , INSERT , UPDATE itp.

Mając te informacje, możesz używać tylko psql zmiennych, jak wskazał Pavel, i połącz ciągi w psql zmienna. Dobrym rozwiązaniem jest użycie psql ':'var' składnia, która wstawia zmienną jako ciąg znaków do wyrażenia SQL:

\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);

Który wygeneruje (wyśle ​​do serwera PostgreSQL):

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);

Ten :'var' składnia nie będzie działać na wszystkich psql wersje (nie pamiętam teraz, która to została wprowadzona), ale dla starych wersji można łatwo użyć cudzysłowu w dolarach:

\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);

Lub uciekaj w pojedyncze cudzysłowy:

\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);

To wszystko.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Analiza porównawcza zarządzanych rozwiązań chmurowych PostgreSQL — część czwarta:Microsoft Azure

  2. Jak mogę utworzyć ograniczenie, aby sprawdzić, czy wiadomość e-mail jest ważna w postgresie?

  3. PostgreSQL odpowiednik Oracle bulk collect

  4. Podłączanie Pythona do bazy danych Heroku PostgreSQL?

  5. Wymuś rozłączenie klienta za pomocą PostgreSQL