Вставьте ARRAY в таблицу PostgreSQL с апострофами в значениях - PullRequest
2 голосов
/ 10 января 2020

У меня есть сценарий Python с операторами вставки SQL, которые вставляют проанализированные данные из файла в таблицу PostgreSQL. Если данные имеют апострофы, выполнение завершается неудачно. Подробно:

    <name>RYAZAN'</name>
or
    <name>CHYUL'BYU</name>

Я нашел решение, когда это строка -> добавление extra 'к апострофу, чтобы оно преобразовывалось в 'RYAZAN''' или 'CHYUL''BYU' в операторе INSERT.

Но если мои значения находятся в списке (из скрипта python), например, city = ["RYAZAN''", "CHYUL''BYU"] Python автоматически ставит двойные кавычки вместо одинарных. В результате при попытке вставить

INSERT INTO City (uuid, name) VALUES (uuid_generate_v4(), unnest(array{city}))

SQL происходит сбой с ошибкой

ERROR: column "RYAZAN''.." does not exist

, поскольку sql читает двойные кавычки как имя столбца или что-то еще. Есть ли способ вставить ARRAY со значениями, которые содержат апострофы?

1 Ответ

0 голосов
/ 10 января 2020

Попробуйте использовать $$ dollar-quoted strings

CREATE TEMP TABLE t (f TEXT);
INSERT INTO t VALUES ($$<name>CHYUL'BYU</name>$$),
                     ($$<name>RYAZAN'</name>$$);
SELECT * FROM t;

           f            
------------------------
 <name>CHYUL'BYU</name>
 <name>RYAZAN'</name>
(2 Zeilen)

Есть также много других способов избежать кавычек

INSERT INTO t 
VALUES (E'\'foo'),('''bar'''),
       ('"the answer is" -> ''42'''),($$It's "only"" $1.99$$);
SELECT * FROM t;

            f            
-------------------------
 'foo
 'bar'
 "the answer is" -> '42'
 It's "only"" $1.99
(4 Zeilen)
...