[root@d-postg-test doc_creation_for_postgre_structure]# php con.php
// Настройка подключения к базе данных PostgreSQL
$dsn = "pgsql:host=localhost;port=5432;dbname=postgres;"; // Укажите имя вашей базы данных
$user = "postgres"; // Укажите ваше имя пользователя
$password = "12345678"; // Укажите ваш пароль

try {
    // Создаем объект подключения к базе данных
    $pdo = new PDO($dsn, $user, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

    // SQL-запрос для извлечения структуры всех таблиц
    $query = "
    SELECT
        table_name,
        column_name,
        data_type,
        is_nullable,
        character_maximum_length,
        numeric_precision,
        numeric_scale,
        column_default
    FROM
        information_schema.columns
    WHERE
         table_schema = 'public'
    ORDER BY
        table_name, ordinal_position";

    // Выполнение запроса и получение результатов
    $stmt = $pdo->query($query);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // Пост-обработка данных и замена значений для удобства
    $mdOutput = []; // Массив для формирования вывода в Markdown

    $descriptions = [
        'id' => 'Идентификатор',
        'name' => 'Наименование',
        'ordernum' => 'Порядковый номер',
        // Добавьте описания для других ключевых полей
    ];

    // Преобразование значений в более читаемый формат
    foreach ($results as &$row) {
        $row['is_nullable'] = ($row['is_nullable'] === 'YES') ? "Да" : "Нет";
        $maxLen = !empty($row['character_maximum_length']) ? $row['character_maximum_length'] : $row['numeric_precision'];
        $row['max_len'] = $maxLen ?? '-';
    }

    // Группировка результатов по именам таблиц
    $grouped = [];
    foreach ($results as $row) {
        $grouped[$row['table_name']][] = $row;
    }

    // Формирование выводных данных в формате Markdown
    foreach ($grouped as $tableName => $rows) {
        $mdOutput[] = "## Таблица " . $tableName . "\n"; // Название таблицы
        $mdOutput[] = "**Описание**\n\n"; // Заголовок "Описание"
        $mdOutput[] = "| Название поля | Тип поля | По умолчанию | Может NULL | Макс. длина | Описание |\n"; // Заголовок таблицы
        $mdOutput[] = "|---------------|----------|--------------|------------|-------------|----------|\n"; // Разделитель

        $idRows = [];
        $otherRows = [];

        // Разделяем строки: сначала идем по строкам с id
        foreach ($rows as $row) {
            if (($row['column_name'] === 'id') || ($row['column_name'] === 'Id')) {
                array_unshift($idRows, $row);
            } elseif ((str_ends_with($row['column_name'], 'id'))
                || (str_ends_with($row['column_name'], 'Id'))
                || ($row['data_type'] === 'uuid')) {
                $idRows[] = $row;
            } else {
                $otherRows[] = $row;
            }
        }

        // Объединяем строки: сначала с id, затем остальные
        $sortedRows = array_merge($idRows, $otherRows);

        foreach ($sortedRows as $row) {
            $description = (str_ends_with($row['column_name'], 'id'))
                ? 'Идентификатор таблицы ' . substr($row['column_name'], 0, -2)
                : ($descriptions[$row['column_name']] ?? '');

            // Формирование строки с данными для таблицы
            $mdOutput[] = "| " . ($row['column_name'] ?: '-')
                . " | " . ($row['data_type'] ?: '-')
                . " | " . ($row['column_default'] ?: '-')
                . " | " . ($row['is_nullable'] ?: '-')
                . " | " . ($row['max_len'] ?: '-')
                . " | " . $description . " |\n";
        }
        $mdOutput[] = "\n"; // Переход на новую строку
    }

    // Сохранение результата в файл Markdown
    $mdFileName = 'database_structure_new.md';
    file_put_contents($mdFileName, implode("", $mdOutput));

    echo "Данные успешно сохранены в файл " . $mdFileName . "\n";

} catch (PDOException $e) {
    // Обработка ошибок подключения или выполнения запроса
    echo "Ошибка подключения или выполнения: " . $e->getMessage();
}
[root@d-postg-test doc_creation_for_postgre_structure]# nano con.php
[root@d-postg-test doc_creation_for_postgre_structure]# php con.php
Ошибка подключения или выполнения: could not find driver[root@d-postg-test doc_creation_for_postgre_structure]# touch test,php