PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

cara menggunakan variabel dalam skrip psql

Pertama-tama, Anda mencoba menggabungkan dua string dengan + operator, tetapi operator SQL untuk penggabungan adalah || , dengan informasi itu, Anda dapat berpikir bahwa hasil yang diharapkan adalah (tidak akan berfungsi ):

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

Tetapi! COPY perintah mengharapkan string literal untuk jalur, bukan ekspresi, jadi Anda benar-benar harus memberikan jalur. Perhatikan itu akan berfungsi untuk perintah seperti SELECT , INSERT , UPDATE , dll.

Dengan informasi tersebut, Anda hanya dapat menggunakan psql variabel, seperti yang ditunjukkan Pavel, dan menggabungkan string menjadi psql variabel. Solusi yang baik adalah dengan menggunakan psql 's :'var' sintaks, yang menyisipkan variabel sebagai string ke dalam ekspresi 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);

Yang akan menghasilkan (akan dikirim ke server 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);

:'var' . ini sintaks tidak akan bekerja pada semua psql versi (saya tidak ingat sekarang yang mana yang diperkenalkan), tetapi untuk versi lama Anda dapat dengan mudah menggunakan kutipan dolar:

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

Atau melarikan diri ke dalam tanda kutip tunggal:

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

Itu dia.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan daftar rekaman pertama untuk setiap grup

  2. LATERAL JOIN tidak menggunakan indeks trigram

  3. Bagaimana cara memenuhi batasan force_srid_coordinate dengan GeoDjango/PostGIS?

  4. Konversikan file dump SQLITE SQL ke POSTGRESQL

  5. postgres dan python