Массив столбцов Perl-Postgres и кавычки - PullRequest
1 голос
/ 31 октября 2019

Я хочу заполнить в Perl столбец postgres, определенный как символьный массив (Tag_List[])

Значения могут содержать одинарные кавычки, поэтому при построении строки SQL я не могу получить правильный синтаксис для заключения в кавычкитакого рода значения, так как я уже должен дважды заключать в кавычки строковые значения и тип массива с одиночным enquote (из-за фигурных скобок).

Я пытался избежать одиночной кавычки (с $VAL =~ s/\x27/\x5c\x27/g;) но никак:

INSERT INTO "table-name" ("Date","Time"...,"Tag_List"[1],"Tag_List"[2],"Tag_List"[3],"Tag_List"[4],"Tag_List"[5]) VALUES ('2019/10/30', '14:17:59', .... ,'{"LastSuccessfulBackup-com.dellemc.avamar","2019-10-29 20:00:22 UTC"}','{"TAG1","tag value\'with quote"}',...

ERROR: syntax error at or near "with"
LIGNE 1 : ...20:00:22 UTC"}','{"TAG1","tag value\'with quote"}','{...

Любая подсказка?

Спасибо

Ответы [ 2 ]

3 голосов
/ 31 октября 2019

Вы можете вставить весь массив в виде строки:

CREATE TABLE arr (
   id integer PRIMARY KEY,
   tag_list character varying(128)[]
);

INSERT INTO arr (id, tag_list) VALUES
   (1,
    '{normal_string,string with spaces,"string,with,comma","string\"with\"quote","string''with''apostrophe"}'
   );

Это приведет к таким записям:

SELECT u.* FROM arr CROSS JOIN unnest(tag_list) AS u;
           u            
------------------------
 normal_string
 string with spaces
 string,with,comma
 string"with"quote
 string'with'apostrophe
(5 rows)

Альтернативой является вставка каждой записи массива индивидуально:

INSERT INTO arr (
   id,
   tag_list[1],
   tag_list[2],
   tag_list[3],
   tag_list[4],
   tag_list[5]
) VALUES (
   2,
   'normal_string',
   'string with spaces',
   'string,with,comma',
   'string"with"quote',
   'string''with''apostrophe'
);
0 голосов
/ 31 октября 2019

Использовать связанные параметры. ( Всегда использует привязку параметров для отправки данных в базу данных.) DBD :: Pg по умолчанию поддерживает параметры массива.

use strict;
use warnings;

my $query = 'INSERT INTO "table-name" ("Date","Time"...,"Tag_List"[1],"Tag_List"[2],"Tag_List"[3],"Tag_List"[4],"Tag_List"[5]) (?,?,...,?,?,?,?,?)';
$dbh->insert($query, undef, $date, $time, ... ['TAG1',"tag value'with quote"], ...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...