Как форматировать формулы LaTeX с двойными знаками доллара (`$ $`) в запросе PostgreSQL?

#postgresql #escaping #string-literals

#postgresql #экранирование #строковые литералы

Вопрос:

Я создаю запрос PostgreSQL с помощью скрипта, который возвращает форматированные формулы LaTeX, окруженные двойными знаками доллара, например, следующую:

 $$6 x^{14}   frac{7 x^{13}}{5}   frac{13 x^{8}}{7}   frac{5 x^{5}}{6}$$
  

Более того, эти формулы принадлежат массиву, так что полный INSERT запрос был бы примерно таким:

 INSERT INTO table("array")
VALUES (
'{"$$6 x^{14}   frac{7 x^{13}}{5}   frac{13 x^{8}}{7}   frac{5 x^{5}}{6}$$",
"$$frac{9 x^{11}}{13}   frac{13 x^{9}}{7}   x^{8}   frac{x^{6}}{3}$$",
"$$2 x^{13}   frac{52 x^{12}}{3}   frac{65 x^{4}}{9}   frac{3}{2}$$"}'
)
  

Однако после ВСТАВКИ обратная косая черта ( ), которая предшествует frac , исчезает в базе данных (я получаю frac вместо frac . Следовательно, мои формулы плохо отображаются в моем приложении.

Вот содержимое ячейки:

 {"$$6 x^{14}   frac{7 x^{13}}{5}   frac{13 x^{8}}{7}   frac{5 x^{5}}{6}$$",
"$$frac{9 x^{11}}{13}   frac{13 x^{9}}{7}   x^{8}   frac{x^{6}}{3}$$",
"$$2 x^{13}   frac{52 x^{12}}{3}   frac{65 x^{4}}{9}   frac{3}{2}$$"}
  

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

Что я должен сделать, чтобы предотвратить подобное поведение?

Ответ №1:

Обратная косая черта — это экранирующий символ в строках, представляющих массив строк:

 SELECT ('{a,"b"c\d"}'::text[])[2];
 text  
-------
 b"cd
(1 row)
  

Если обратная косая черта не предшествует символу со специальным значением, она игнорируется.

Удвойте все обратные косые черты внутри строкового представления массива строк в PostgreSQL, чтобы получить то, что вы хотите.

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

 SELECT replace(
          '{"$$6 x^{14}   frac{7 x^{13}}{5}   frac{13 x^{8}}{7}   frac{5 x^{5}}{6}$$",
           "$$frac{9 x^{11}}{13}   frac{13 x^{9}}{7}   x^{8}   frac{x^{6}}{3}$$",
           "$$2 x^{13}   frac{52 x^{12}}{3}   frac{65 x^{4}}{9}   frac{3}{2}$$"}',
          '',
          '\'
       )::text[];
  

Комментарии:

1. Я думаю, было бы неплохо добавить к вашему ответу, как автоматически включать необходимые обратные косые черты, поскольку в вопросе указано, что добавление обратных косых черт вручную не было бы вариантом. Предполагая, что sympy вернет необработанные строки, можно использовать stringname.replace(‘\’, ‘\’) чтобы получить новую строку с добавленной обратной косой чертой.

2. Странно то, что содержимое ячейки, такое как 'Hello $$frac{x^{11}}{10} frac{4 x^{6}}{7}$$' , принимается без каких-либо проблем. В этом случае сохраняется единственная обратная косая черта. Я подозревал, что это потому, что $$ не отображается в начале строки, но я могу ошибаться.

3. В любом случае, я мог бы реализовать обходной путь, как вы предложили, с помощью str() приведения и replace('\', '\\') метода.

4. Я добавил, как вы можете использовать replace в SQL для этого.

5. Перечитывая ответ, кажется, что существует разная интерпретация обратной косой черты в строке ПО сравнению с массивом строк. Кто-нибудь сможет подтвердить?