Использование переменной сценария Shell в сценарии SQL

У меня есть сценарий инициализации sql для базы данных PostgreSQL. В сценарии вместо жесткого кодирования имени пользователя я хочу использовать переменную, хранящуюся в моем файле оболочки. Однако я не могу этого сделать.

это файл оболочки:

export
DB_HOST = "xxx"
DB_PORT = "xxx"
DB_USER = "xxx"
DB_NAME = "xxx"

psql -U $DB_USER -d $DB_NAME -v user1=$DB_USER -f initialize_postgres.sql

и я хочу использовать его в сценарии sql, который выглядит следующим образом:

GRANT
SELECT,
INSERT,
DELETE,
UPDATE ON ALL TABLES IN SCHEMA public TO :'user1';

GRANT USAGE,
SELECT ON ALL SEQUENCES IN SCHEMA public to :'user1';


CREATE FUNCTION save_property (IN prop varchar(50), IN val varchar(500)) RETURNS void AS $$
UPDATE properties SET "value"=val WHERE id=prop;

INSERT INTO properties (id, value)
    SELECT prop, val
    WHERE NOT EXISTS (SELECT 1 FROM properties WHERE id=prop);
$$ LANGUAGE sql;

GRANT EXECUTE ON FUNCTION public.save_property(varchar(50),varchar(500)) TO :'user1';

это ошибка, которая отображается мне при запуске конвейера:

Используйте двойные кавычки вокруг своих переменных: psql -U "$DB_USER" -d "$DB_NAME" -v "user1=$DB_USER" -f initialize_postgres.sql Посмотрите Сохраните результат mysql в переменной массива bash, есть примеры использования переменных в обоих случаях. (Возможно, вас заинтересует мой shell-connector.sh.)

F. Hauri - Give Up GitHub 10.04.2024 09:58

Я получаю ту же ошибку, используя двойные кавычки вокруг моей переменной, как вы предложили:')

Sumit Bhardwaj 10.04.2024 10:27
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете замену :'user1', результат будет в одинарных кавычках как строковая константа. Но GRANT требует, чтобы роль была идентификатором, то есть именем объекта. Поэтому вместо этого вам придется использовать кавычки или двойные кавычки.

Я получаю ту же ошибку, не используя кавычки или двойные кавычки:') Ошибка: psql:helper_scripts/datenbank/initialize_postgres.sql:188: ОШИБКА: синтаксическая ошибка на ":" или рядом с ней. СТРОКА 5: ОБНОВЛЕНИЕ НА ВСЕХ ТАБЛИЦАХ В СХЕМЕ public. КОМУ :"пользователь1"; ^ psql:helper_scripts/datenbank/initialize_postgres.sql:191: ОШИБКА: синтаксическая ошибка на уровне ":" или около него. СТРОКА 2: ВЫБРАТЬ НА ВСЕХ ПОСЛЕДОВАТЕЛЬНОСТИ В СХЕМЕ public to:"user1"; ^

Sumit Bhardwaj 10.04.2024 10:03

Ну, это работает здесь и везде. Возможно, вы делаете что-то отличное от того, что показываете. Например, ваш оператор export испорчен и ничего не экспортирует (но это не вызывает такой ошибки). Ошибка означает, что переменная не установлена.

Laurenz Albe 10.04.2024 10:26

Ваш комментарий выглядит так, будто вы все еще используете кавычки вокруг переменной. Это должно быть :user1, а не :'user1' или :"user1", верно?

Paul Hodges 10.04.2024 15:08

@PaulHodges Двойные кавычки подойдут. Сообщение об ошибке указывает, что переменная psql не установлена.

Laurenz Albe 10.04.2024 16:09

Другие вопросы по теме