Как сформировать XML файл из результата запроса?

Для формирования XML файла из результата запроса в PostgreSQL можно использовать функцию xmlforest() в сочетании с функцией xmlelement().

xmlforest() позволяет создавать элементы XML из столбцов таблицы, а xmlelement() позволяет создавать иерархическую структуру XML.

Для начала, необходимо выполнить запрос, который вернет данные, которые вы хотите сохранить в XML файле. Например, допустим, у нас есть таблица "users" со следующими столбцами: "id", "name" и "email". Мы хотим создать XML файл, где каждая запись будет представлена в виде элемента <user>, а каждый столбец будет представлен в виде вложенного элемента внутри <user>.

SELECT xmlelement(name "users",
           xmlagg(
             xmlelement(name "user",
               xmlforest(id, name, email)
             )
           )
         )
FROM users;

В данном запросе xmlelement() используется для создания корневого элемента <users>, который окружает все остальное содержимое. Затем используется xmlagg() для агрегирования всех строк, возвращаемых запросом. Внутри xmlagg() используется xmlelement() для создания элемента <user> для каждой строки. Внутри каждого элемента <user> используется xmlforest(), чтобы создать элементы для каждого столбца таблицы. В данном случае мы указали, что хотим сохранить значения столбцов "id", "name" и "email".

Результатом запроса будет XML документ, который можно сохранить в файл используя любой язык программирования или PostgreSQL функцию COPY. Например, в Python можно использовать библиотеку psycopg2 для выполнения запроса и записи результатов в файл:

import psycopg2
import xml.etree.ElementTree as ET

# подключение к базе данных
conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword", host="localhost", port="5432")
cur = conn.cursor()

# выполнение SQL запроса
cur.execute("""
SELECT xmlelement(name "users",
           xmlagg(
             xmlelement(name "user",
               xmlforest(id, name, email)
             )
           ))
FROM users
""")

# получение результата запроса
result = cur.fetchone()[0]

# запись результата в файл
tree = ET.ElementTree(ET.fromstring(result))
tree.write("result.xml")

# закрытие подключения
cur.close()
conn.close()

В этом примере мы используем библиотеку psycopg2 для подключения к PostgreSQL базе данных и выполнения запроса. Результат запроса сохраняется в переменную result. Затем мы создаем экземпляр класса ElementTree из результата запроса с помощью функции ET.fromstring(). Наконец, мы записываем созданный документ XML в файл "result.xml" с помощью функции ET.ElementTree.write().