Экранирование специальных символов в PostgreSQL Insert - PullRequest
0 голосов
/ 03 октября 2018

Я пишу функцию, которая требует от меня сохранения некоторого кода JavaScript в таблице базы данных PostgreSQL (это необходимо).Я ищу "ленивый" способ сделать это без изменения моего оператора вставки PostgreSQL, чтобы экранировать специальные символы в каждом случае, когда это может происходить в коде JavaScript.В первую очередь я хочу избежать экранирования в том случае, если код JavaScript стал длиннее.Так как это может быстро запутаться.PostgreSQL предлагает следующие функции:

  1. quote_literal ()
  2. quote_ident ()

Ссылка: Функции форматирования строк PostgreSQL

Протестировав обе эти ошибки, я сталкиваюсь с следующей ошибкой:

Ошибка: неопределенный идентификатор в кавычках в или около "": true

На первый взгляд кажется, что моя проблема заключается в самом отформатированном тексте JavaScript.

Есть ли у меня "ленивый" способ избежать экранирования всех этих специальных символов без необходимости делать это вручную?По сути, я хотел бы поместить этот код в переменную и выполнить вставку, используя сохраненную переменную без (в идеале) или с минимальными изменениями хранимого текста JScript.

Ниже приведен пример того, как выглядит мой код:

CREATE OR REPLACE FUNCTION abc.my_function(text, text, text, text, text[])
     RETURNS void AS $body$
DECLARE
     -- Variable Declarations here
     jscript TEXT := quote_ident('/* JScript Comments Here*/ $(document).ready(function(){
     // Initialize Datatable ...
     $('#Index').Datatable({
     "paging": true, // comment here
     "responsive": true, // comment here 
     "pageLength": 25, // comment here
     "columnDefs": [ {
     ...
     ...
     ...
          }]
     });
'); 


BEGIN
     ...
     ...
     ...
     -- Insert static HTML
     execute 'Insert into abc.my_table(file, data, gen_flag) values('||'''main.js||','||jscript||','|| '''N''' || ')';
     ...
     ...
     ...


END; 
$body$
     LANGUAGE 'plpgsql' VOLATILE;

1 Ответ

0 голосов
/ 03 октября 2018

Основная проблема в том, что вы используете quote_ident, который используется для цитирования идентификаторов (имена столбцов, имена таблиц, ...), где вы должны использовать quote_literal, который используется для правильнойцитировать буквальные значения.

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

declare 
  jscript TEXT := $js$
     /* JScript Comments Here*/
     $(document).ready(function(){
       // Initialize Datatable ...
       $(#Index').Datatable({
       "paging": true, // comment here
       "responsive": true, // comment here 
       "pageLength": 25, // comment here
       "columnDefs": [ {
       ...
       ...
       ...}]
     });
  $js$;

Динамический SQL - этолучше созданный с использованием функции format(), которая заботится о правильном цитировании:

execute format('Insert into abc.my_table(file, data, gen_flag) values(%L, %L, %L), 'main.js',jscript, 'N')';

Но вам вообще не нужен динамический SQL, вы можете просто написать:

insert into abc.my_table(file, data, gen_flag) values('main.js', jscript, 'N');

Демо онлайн: https://dbfiddle.uk/?rdbms=postgres_10&fiddle=81b36bb1d3f246637186a419a9b337d4

...