Първо, опитвате се да свържете два низа с +
оператор, но SQL операторът за конкатенация е ||
, с тази информация бихте могли да си помислите, че очакваният резултат ще бъде (няма да работи ):
\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);
Но! COPY
очаква литерал низ за пътя, а не израз, така че наистина трябва да дадете пътя. Забележете, че ще работи за команди като SELECT
, INSERT
, UPDATE
и т.н.
С тази информация можете да използвате само psql
променливи, както Павел посочи, и свържете низовете в psql
е променлива. Добро решение е да използвате psql
's :'var'
синтаксис, който вмъква променливата като низ в 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);
Което ще генерира (ще изпрати до сървъра на 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'
синтаксис няма да работи на всички psql
версии (не си спомням сега коя беше въведена), но за стари версии можете лесно да използвате котиране в долари:
\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);
Или избягайте в единични кавички:
\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);
Това е.