Как вставить файл html-шаблона в поле postgresql из командной строки - PullRequest
0 голосов
/ 28 октября 2019

У меня есть html-шаблон в таблице postgresql, который мне нужно получить и обновить из cmdline.

Моя идея состояла в том, чтобы использовать Makefile для обновления поля.

Я понял, что могу использовать эту команду для извлечения файла, используя функцию в Makefile.

psql_conn=psql -U ${pg_user} -p $(pg_port_staging) -h $(pg_host) -d $(pg_database)
psql_shell=--tuples-only -P format=unaligned

fetch: ## fetch a given template id=XX
ifndef id
    @echo "Missing id=XX"
    @$(MAKE) list
    @exit 1
else
    $(call fetch_template,$(id),$(call fetch_name,$(id)))
endif

define fetch_template
    $(shell echo "SELECT template FROM pdf_templates WHERE id = $(1)" | ${psql_conn} $(psql_shell} > $(2).html)
endef

define fetch_name
  ...
endef

Однако у меня проблема с вставкой этого шаблона в таблицуопять после редактирования.

Пример файла шаблона может быть таким, поэтому он будет содержать + { $ и символы UTF8.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xml:lang="en" lang="en">
<head>
    <style type="text/css" th:inline="text">
        body { margin: 0; font-family: Verdana, Geneva, sans-serif; font-size: 11px; }
        a { text-decoration: none; }
</style>
</head
<body>
<div th:if="${hasAddresses}">
            <h2>Adresser:</h2>
            <article th:each="offerElement: ${offer.getElementsWithData().?[specification?.get('elementType') == 'fiber']}">
                <div th:with="address=${offerElement.getParsedData().get()}">
                    <br /><span th:text="${address['deliveryStreet']}"></span> <span th:text="${address['deliveryHouseNumber']}"></span>
                    <span th:text="${address['deliveryFloor']}"></span> <span th:text="${address['deliveryDoor']}"></span>
                    <br /><span th:text="${address['deliveryZipCode']}"></span> <span th:text="${address['deliveryCity']}"></span>
                    <br /><span th:text="${address['deliveryCountry']}"></span>
                </div>
            </article>
        </div>
</body>
</html>

Это удаленный сервер, к которому у меня нет доступа к оболочке. Поэтому нельзя использовать pg_read_file

. Я работал над идеей использования \lo_import File.html, который загружает файл на сервер, но не может понять, как содержимое можно записать в таблицу. , а не просто появляются в таблице LargeObject.

Другим решением может быть использование Ruby или Python, но я хочу сделать его максимально простым.

Версия psql i 9.4, однако на сервере запущен сервер postgresql 10.4.

1 Ответ

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

Нашел решение путем преобразования контента в base64

define write_template
$(shell echo "UPDATE table SET template = convert_from(decode('$(shell base64 $(1))', 'base64'),'UTF8') WHERE name = '$(2)'" | ${psql_input})
endef

Так что возьмите контент из base64 filename.html и используйте функции convert_from( decode($content , 'base64'),'UTF8') в postgresql, чтобы сначала декодировать контент в строку байтов, а затем преобразовать его в UTF-8 формат.

${psql_input} - это просто psql с параметрами пользователя / хоста.

...