PostgreSQL, как определить, нужно ли указывать значения - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь написать функцию, которая будет динамически создавать оператор sql, но я сталкиваюсь с проблемами с типами преобразований, поэтому, как я могу определить, используя тип поля, если его нужно заключить в кавычки

-- using this I can recover the types of each field
-- but I do not have a simple way to express that for a specific type it need
-- to quote

create table test (
  id serial not null,
  employee_name text,
  salary decimal(12,2),
  hire_date date,
  active boolean
);

select column_name,data_type, null as need_to_be_quoted 
from information_schema.columns 
where table_name = 'table_name';
  column         type          need to be quoted (this is a missing information)
-------------------------------------
  id             integer       false
  employee_name  text          true
  salary         decimal       false
  hire_date      date          true
  active         boolean       false

quote_ident docs говорит:

Возвращает данную строку, заключенную в соответствующие кавычки, для использования в качестве идентификатора в строке оператора SQL. Кавычки добавляются только в случае необходимости

Но это не то, чего я ожидал:

insert into test (employee_name, salary, hire_date, active) 
values (quote_identy('John Doe'), quote_identy(100000), quote_identy(current_date), quote_identy(true));

Это необходимо, потому что я пытаюсь динамически генерировать строку оператора.

У меня есть значения для вставки в какую-то таблицу, я могу определить тип каждого значения, но чтобы сгенерировать оператор вставки строки, я должен знать, следует ли указывать конкретный тип значения или нет, например

  • text: тип должен заключаться в кавычки в строковом операторе
  • логический: не должен заключаться в кавычки
  • числовой: не должен заключаться в кавычки
  • дата: должен бытьпроцитировано

1 Ответ

0 голосов
/ 10 октября 2019

Не цитируйте. Цитирование добавляет сложности, и если вы не понимаете это правильно, у него есть синтаксис и проблемы безопасности .

Вместо этого используйте параметры связывания. Детали зависят от того, с какой библиотекой базы данных вы работаете, но основная идея всегда одна и та же. Сначала подготовьте заявление с заполнителями для ваших значений. Затем выполните это, передавая значения. База данных заботится о введении значений в утверждение. Вы можете выполнить один и тот же подготовленный оператор несколько раз, оптимизируя ваши вызовы кодирования и базы данных.

Вот как вы это сделаете в PL / pgSQL с EXECUTE . Связанная документация содержит много информации о безопасном выполнении динамических запросов.

do $$
begin
  execute '
    insert into test (employee_name, salary, hire_date, active) 
    values ($1, $2, $3, $4)
  ' using 'John Doe', 100000, current_date, true;
end;
$$;

Более того, хотя написание SQL-компоновщика является хорошим упражнением, его также очень сложно и очень легко ошибочно принять. Существует множество библиотек, которые будут создавать SQL для вас.

Вот ваше утверждение, использующее PHP Laravel .

DB::table('test')->insert([
  'employee_name' => 'John Doe',
  'salary' => 100000,
  'hire_date' => current_date,
  'active' => true
);

Если вам интересно, как работают сборщики SQLВы можете копать в Laravel для идей. Написание одного в PL / pgSQL является амбициозным, но я не знаю ни одного, который существует. Удачи!

...