Psql не является внутренней или внешней командой для исполняемой программы или пакетного файла

Обновлено: 21.11.2024

После установки PostgreSQL 14 в Windows необходимо выполнить несколько шагов для создания изолированной базы данных. В этом посте показаны эти шаги, включая пару задач ОС Windows, которые вам необходимо выполнить. Обратите внимание, что эти инструкции относятся к интерфейсу командной строки PostgreSQL psql (CLI).

Откройте командную строку с правами администратора. Это должно дать вам командную строку, подобную следующей:

Microsoft Windows [Версия 10.0.19042.1466] (c) Корпорация Microsoft. Все права защищены. C:\Пользователи\имя пользователя>

Введите psql, чтобы запустить интерфейс командной строки PostgreSQL, а затем клавишу возврата или ввода:

Скорее всего, вы получите следующее сообщение об ошибке. Это означает, что ваша переменная среды System Path не включает каталог, в котором находится исполняемый файл psql, и поэтому команда не распознается.

'psql' не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл.

Вы можете временно установить его в текущем интерфейсе командной строки Windows с помощью следующей команды:

установить PATH=%PATH%;C:\Program Files\PostgreSQL\14\bin;

Для тех, кто знаком с навигацией Windows CLI в предыдущих выпусках, рекомендуется добавлять точку с запятой в конце элемента, добавляемого к переменной среды %PATH%. Если бы вы поместили точку с запятой между %PATH% и новым путем к каталогу, были бы две точки с запятой вместе. Хотя это не принесет никакого вреда, лучше всего следовать новому соглашению или стилю.

ВАЖНОЕ ЗАМЕЧАНИЕ. В остальной части сообщения предполагается, что вы установили правильную переменную среды %PATH% или добавили ее в переменную среды System’s Path и перезапустили интерфейс командной строки Windows после ее добавления с помощью инструмента с графическим интерфейсом. Причина, по которой вам необходимо перезапустить Windows CLI, заключается в том, что переменная среды %PATH% наследуется при запуске и не изменяется в открытой оболочке Windows CLI.

Еще одна распространенная ошибка, которую совершают некоторые пользователи, по крайней мере те, кто использовал более старую версию утилиты psql в дистрибутиве Linux (или «дистрибутиве»), заключается в том, что они набирают psql без каких-либо аргументов, чтобы стать суперпользователем. Эта ошибка не возникает в Linux, потому что вы, скорее всего, подключились как пользователь postgres, прежде чем пытаться подключиться к базе данных PostgreSQL. Быстрая демонстрация должна проиллюстрировать ошибку и объяснить, почему она возникает в ОС Windows.

Попытка подключения к базе данных PostgreSQL в качестве пользователя, не являющегося пользователем postgres:

Вы должны получить следующую ошибку:

psql: ошибка: подключение к серверу на "localhost" (::1), ошибка порта 5432: fe_sendauth: пароль не указан

Эта ошибка возникает из-за того, что вы не являетесь пользователем postgres, а все остальные пользователи должны указывать, что они подключаются к учетной записи суперпользователя. Правильный синтаксис:

C:\Users\имя_пользователя>psql -U postgres

Затем вам будет предложено ввести пароль, который вы установили при установке базы данных PostreSQL. Введите этот пароль при установке в командной строке.

Предупреждающее сообщение говорит о том, что параметры сортировки набора символов различаются между вашей ОС Windows и базой данных PostgreSQL. Мы обсудим это позже, но ради почти всей вашей работы это не имеет значения. Если вас беспокоит предупреждающее сообщение, вы можете запустить команду chcp перед запуском PostgreSQL при открытии интерфейса командной строки Windows:

Команда chcp изменяет набор символов вашего терминала, чтобы привести его в соответствие с набором символов Latin 1, что позволяет вам использовать такие вещи, как символы неанглийского акцента (умлаут над о или ö). После запуска Вы увидите это при подключении после выполнения этой команды:

ИНФОРМАЦИЯ: Команда chcp используется для дополнения информации о международной клавиатуре и наборе символов, что позволяет использовать MS-DOS в других странах и на других языках. Прежде чем можно будет использовать команду chcp, необходимо загрузить nlsfunc и загрузить файл country.sys в конфигурацию ОС.

Если вы опытный пользователь ОС Windows, вы можете отредактировать реестр Windows, чтобы автоматически изменять это поведение для каждого сеанса Windows CLI. Вы можете сделать это, открыв реестр Windows с помощью команды regedit от имени администратора. В regedit добавьте элемент Autorun со значением chcp 1252 в эту часть реестра:

Это значение автоматически устанавливает для интерфейса командной строки Windows набор символов Latin 1 каждый раз, когда вы запускаете оболочку терминала с помощью утилиты cmd.exe. Вы должны делать это только в том случае, если вы полностью понимаете это.

Теперь, когда вы подключены как суперпользователь, давайте рассмотрим шаги по настройке игровой площадки или базы данных videodb. Существует пять шагов для настройки вашей базы данных и один шаг для подключения и использования базы данных videodb в качестве пользователя учащегося

Каталог для словаря данных меняется при установке PostgreSQL. Вы можете найти его с помощью следующей команды CLI psql:

Это вернет следующее:

каталог_данных ------------------------------------- C:/Program Files/PostgreSQL/14 /данные (1 строка)

Хотя ваш подкаталог можно сохранить в словаре данных, это вызовет предупреждающее сообщение. На самом деле лучше установить локальные базы данных в другом месте вашей файловой системы.

Откройте новый интерфейс командной строки ОС Windows, чтобы создать подкаталог (или, говоря языком Windows, папку), в котором вы будете хранить свою базу данных videoDB. Каждый новый интерфейс командной строки ОС Windows открывается в вашем домашнем каталоге. Вам необходимо создать физический подкаталог video_db в вашем домашнем каталоге.

СОВЕТ. Имя базы данных внутри PostgreSQL должно соответствовать имени табличного пространства и отличаться от физического каталога. В противном случае вы можете запутаться и совершить ошибку в будущем.

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

Возвращаясь к исходной оболочке Windows CLI, к которой вы подключены как суперпользователь postgres, вы можете создать табличное пространство video_db со следующим синтаксисом:

CREATE TABLESPACE video_db OWNER postgres LOCATION 'C:\Users\username\video_db';

Это вернет следующее:

Вы можете узнать, успешно ли вы создали табличное пространство video_db, с помощью следующего:

ВЫБЕРИТЕ * ИЗ pg_tablespace;

Он должен вернуть следующее:

оид | имя объекта | владелец | спакл | Варианты -------+------------+-----------+--------+-------- ---- 1663 | pg_default | 10 | | 1664 | pg_global | 10 | | 16395 | видео_дб | 10 | | (3 строки)

Перед созданием новой базы данных вам необходимо знать параметры сортировки PostgreSQL по умолчанию. Вы можете написать следующий запрос, чтобы определить корреляцию по умолчанию:

Должно быть возвращено что-то вроде этого:

имя_даты | datcollate -------------------------+----------------------------- postgres | English_United States.1252 (1 строка)

Значение datcollate базы данных postgres должно совпадать с параметрами LC_COLLATE и LC_CTYPE при создании базы данных. Вы можете создать базу данных videodb со следующим синтаксисом, если вы сделали соответствующие замены для значений LC_COLLATE и LC_CTYPE ниже:

СОЗДАТЬ БАЗУ ДАННЫХ videodb С OWNER = postgres ENCODING = 'UTF8' TABLESPACE = video_db LC_COLLATE = 'English_United States.1252' LC_CTYPE = 'English_United States.1252' ПРЕДЕЛ ПОДКЛЮЧЕНИЯ = -1;

Вы можете проверить создание базы данных видео с помощью следующей команды:

Должен появиться следующий экран:

Список баз данных Имя | Владелец | Кодирование | Разобрать | Тип | Права доступа -----------+-----------+-----------+-------------- -----------------------------+-----------------------------+------ ------------------ постгрес | постгрес | UTF8 | English_United States.1252 | English_United States.1252 | шаблон0 | постгрес | UTF8 | English_United States.1252 | English_United States.1252 | =с/постгрес + | | | | | postgres=CTc/postgres template1 | постгрес | UTF8 | English_United States.1252 | English_United States.1252 | =с/постгрес + | | | | | postgres=CTc/postgres videodb | постгрес | UTF8 | English_United States.1252 | English_United States.1252 | (4 строки)

Затем вы можете добавить комментарий к базе данных, используя следующий синтаксис:

КОММЕНТАРИЙ ПО БАЗЕ ДАННЫХ videodb ЯВЛЯЕТСЯ "базой данных магазина видео";

В этом разделе вы создаете роль dba, предоставляете привилегии в базе данных videodb роли и создаете пользователя с ролью, которую вы создали ранее, с помощью следующих трех операторов. В этом разделе есть три шага.

    Первый шаг создает роль dba:

СОЗДАТЬ РОЛЬ dba С СУПЕРПОЛЬЗОВАТЕЛЕМ;

ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА БАЗУ ДАННЫХ videodb ПО postgres; ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ К БАЗЕ ДАННЫХ videodb dba;

Если вы планируете использовать команду copy для чтения внешних файлов CSV (значения, разделенные запятыми), вам необходимо предоставить суперпользователю postgres другую привилегию пользователю студента. Это предоставляет роль pg_read_server_files учащемуся.

ДАТЬ pg_read_server_files учащемуся;

Для любой работы в pgAdmin4 требуется предоставление базы данных videodb суперпользователю postgres. Грант обеспечивает видимость базы данных videodb в консоли pgAdmin4, как показано на следующем рисунке.

СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ student С РОЛИ dba ЗАШИФРОВАННЫЙ ПАРОЛЬ 'student';

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

psql -d videodb -U студент -W

Все параметры, которым предшествует дефис (-), чувствительны к регистру. Параметр -d задает базу данных для соединения. Параметр -U задает пользователя для соединения, а параметр -W указывает интерфейсу командной строки psql запрашивать пароль.

Несмотря на то, что вы не должны сталкиваться со следующей ошибкой во время установки ОС Windows,

psql: FATAL: Ошибка одноранговой аутентификации для пользователя "student"

Это можно исправить в PostgreSQL 14, изменив параметры доступа пользователя в файле конфигурации pg_hba.conf. Файл находится в каталоге C:\Program Files\PostgreSQL\14\data. Это правильные стандартные настройки, которые вы должны увидеть.

Если вы обнаружите, что что-то сломано, почините это. Приведенные выше значения должны обеспечить успешное внесение изменений. Если вы внесете изменения, вам потребуется перезапустить службу postgres.

База данных PostgreSQL поддерживает несколько схем внутри баз данных. Схема по умолчанию для любой базы данных — общедоступная схема. Вы должны создавать отдельные схемы и явно ссылаться на них при доступе к ним, если только вы не измените путь поиска по умолчанию. В этом разделе показано, как:

  • Создайте схему приложения.
  • Создайте таблицу Registration_history в схеме приложения.
  • Изменить стандартный путь поиска, включив в него другие схемы.

Процесс создания схемы требует, чтобы вы предоставили привилегию CREATE ON DATABASE пользователю как пользователю postgres. Первоначальное предоставление привилегии создания требует привилегий суперпользователя postgres. Это означает, что вы должны подключиться как пользователь postgres, например:

psql -U postgres -W

Затем, как суперпользователь postgres, вы используете следующий синтаксис, чтобы предоставить привилегию создания пользователю-студенту в базе данных videodb:

ДАТЬ СТУДЕНТУ СОЗДАТЬ В БАЗЕ ДАННЫХ videodb;

После предоставления права на создание вы должны выйти из учетной записи суперпользователя postgres, например

Теперь вы должны подключиться к базе данных videodb в качестве учащегося (синтаксис представлен ранее, но приведен ниже).

psql -d videodb -U студент -W

Как учащийся создайте схему приложения со следующим синтаксисом:

СОЗДАТЬ СХЕМУ;

Затем вы можете запросить результат следующим образом:

SELECT * FROM pg_catalog.pg_namespace ORDER BY nspname;

Вы должны увидеть следующее:

Если вы создаете таблицу без имени схемы, она автоматически помещается в общедоступную схему. Это означает, что любая попытка описать таблицу с параметром командной строки \d возвращает ошибку без добавления имени схемы, однако это верно только в том случае, если вы используете параметр поиска по умолчанию.

Давайте создадим таблицу Registration_history в схеме приложения с файлом скрипта. Файл скрипта представляет собой набор связанных команд SQL, таких как следующий пример, который подавляет уведомления, удаляет все ранее существовавшие таблицы ревизий_историй и создает таблицу ревизий_историй.

-- Установите для клиентских сообщений значение предупреждения или ошибки, что означает подавление любого -- уведомления, связанного с предложением if exists. SET client_min_messages TO предупреждение; -- Условно перетащите существующую таблицу пересмотра_истории -- в схему приложения. УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ ревизия_история; -- Создайте таблицу ревизий_истории. CREATE TABLE app.revision_history (revision_history_id серийный номер, session_id VARCHAR, table_name VARCHAR, ревизия_id INTEGER);

Вы можете запустить файл сценария, используя относительное или абсолютное имя файла. Абсолютное имя файла включает полный путь от буквы логического драйвера Windows, например C:\ или точки монтирования Linux. Относительное имя файла — это просто имя файла.

Если вы хотите использовать относительное имя файла, вы должны сначала перейти в каталог, в котором вы сохранили файл. Этот каталог становится вашим локальным диском и позволяет вам вызывать любой файл в нем из командной строки psql, используя только его имя файла.

Вы должны подключиться к базе данных videodb как учащийся. Команда \i позволяет вам запустить файл, предполагая, что вы поместили предыдущий файл скрипта в файл истории ревизий в вашем локальном каталоге.

Если вы попытаетесь описать таблицу ревизий_истории с помощью параметра командной строки \d, например

Он покажет следующее:

Не найдено ни одной связи с именем "revision_history".

Это связано с тем, что в общедоступной схеме нет таблицы Registration_history, а путь поиска по умолчанию включает только общедоступную схему.

Вы можете показать путь поиска следующим образом:

Он должен возвращать следующее: схему, которая разделяет имя пользователя и общедоступность.

search_path ------------------ "$user", общедоступный (1 строка)

Вы сбрасываете путь поиска следующим образом:

SET search_path TO app, "$user", public;

После того как вы зададите search_path , попытка описать таблицу будет работать, потому что она ищет таблицу в приложении и общедоступной схеме. Это означает следующую команду:

Таблица Столбец "app.revision_history" | Тип | сортировка | Обнуляемый | По умолчанию --------------------+-------------------+------- ----+----------+---------------------------------- -----------------------------revision_history_id | целое число | | не нуль | nextval('revision_history_revision_history_id_seq'::regclass) session_id | переменный характер | | | имя_таблицы | переменный характер | | | ревизия_id | целое число | | |

psql -d videodb -U студент -W

Если вы все сделали правильно, вы должны увидеть следующее после правильного ввода пароля студента для пользователя студента:

После подключения к базе данных videodb вы можете запросить текущую базу данных, например

Он должен вернуть следующее:

current_database ------------------ videodb (1 строка)

Здесь показано, как создать табличное пространство videodb, базу данных videodb, роль dba, пользователя-студента, схему приложения и подключиться к новой базе данных videodb в качестве пользователя-студента. Как всегда, я надеюсь, что это позволит вам многое понять с минимальными усилиями и избегая страниц документации.

Если после установки PostgreSQL вы сталкиваетесь с ошибкой «psql не распознан как внутренняя или внешняя команда» при попытке запустить psql из командной строки, то, скорее всего, все, что вам нужно сделать, чтобы решить эту проблему, — это добавить команду Postgres bin в системную переменную PATH (PATH — это системная переменная, которая позволяет Windows с помощью командной строки или окна терминала находить исполняемые файлы).

В этой записи блога мы расскажем о семи простых шагах, описывающих, как добавить папку в переменную PATH Windows 10.

Шаг 1. Запустите Windows Search на компьютере с Windows 10, нажав WIN+S. Вы увидите текстовое поле поиска.

Шаг 2. Начните вводить «окружение…» в текстовое поле поиска Windows и выберите параметр «Редактировать переменные системной среды» в списке «Наилучшее соответствие».

Шаг 3. Откроется окно «Свойства системы», в котором можно найти такие вкладки, как «Имя компьютера», «Оборудование» и другие дополнительные свойства.

Перейдите на вкладку «Дополнительно» и нажмите кнопку «Переменные среды» внизу. На этой вкладке также можно настроить параметры «Производительность», «Профили пользователей» и «Запуск и восстановление».

Шаг 4. Откроется окно «Переменные среды». Он разделен на два поля с пользовательскими переменными и системными переменными, где отображаются все переменные и их значения.

Найдите переменные «Путь» в поле «Системные переменные», как показано на снимке экрана выше.

Шаг 5. Дважды щелкните переменную «Путь».

Откроется список со всеми переменными пути, где переменные пути можно редактировать, добавлять и удалять.

Шаг 6. Нажмите кнопку «Создать» и введите новый путь, например C:\Program Files\PostgreSQL\11\bin\, в новую редактируемую строку.

Шаг 7. Нажмите «ОК», чтобы сохранить новую переменную PATH. Но чтобы эти изменения повлияли на окно командной строки, вам нужно снова открыть его.

28 комментариев

Эндрю
26 марта 2020 г., 16:31

Спасибо!! Именно то, что мне было нужно.

Мэтью Данбо
16 апреля 2020 г., 00:55

Отлично. Это самый простой и понятный ответ, который я смог найти. Спасибо.

Вальтер Мазвуру
22 апреля 2020 г., 5:10

Спасибо за наводку! Это лучшее решение, которое я когда-либо видел.

Muhammadhusayn Olimjonov
7 мая 2020 г., 15:34

Большое спасибо! Я застрял в течение длительного времени, пока я не нашел это. еще раз спасибо!

Мерси Кипкорос
24 июня 2020 г., 3:07

Большое спасибо за это, я застрял на этом целый день, и вы решили мою проблему менее чем за 20 минут.

Naveen
1 июля 2020 г., 7:32

Спасибо :)
Очень полезно и информативно :)

Lebene
3 июля 2020 г., 14:16

Я очень надеюсь, что вы мне поможете! Я сделал этот шаг без проблем, и моя командная строка может открыть psql, когда я делаю psql -U postgres, а затем ввожу установленный мной пароль postgres.

Однако я не могу просто ввести psql и уйти. Он показывает мою обычную учетную запись пользователя диска C по умолчанию, например. C:\Users\Me>, а затем, если я наберу psql, он запрашивает мой пароль пользователя, который не работает.

Что я могу сделать? На postgres 12. Спасибо

Джей
6 июля 2020 г., 18:06

Привет, @Lebene.
Я на самом деле ищу такое же решение. Но я предполагаю, что вышеизложенное может не работать, поскольку суперпользователь базы данных является postgres по умолчанию. Поэтому я предполагаю, что для взаимодействия с любой существующей базой данных, кроме postgres (которую вы, возможно, создали), вам нужно сначала войти в postgres, а затем подключиться к базе данных с помощью \c .

Эмилия
3 июня 2021 г., 20:00

Попробуйте эту команду: psql -U postgres

path
19 июля 2020 г., 21:39

Это системная переменная по умолчанию в Windows 10? Поскольку я случайно удалил значение path и PATHEXT и перезагрузил компьютер, восстановление компьютера не открылось. Теперь командное окно CMD вводит другие команды, не являющиеся внутренними или внутренними командами. Что мне делать?

Аноним
20 августа 2020 г., 19:02

Аноним
20 октября 2020 г., 9:15

Дэниел Макларен
1 декабря 2020 г., 6:58

Отлично, скриншоты действительно помогли. Спасибо

Ezrqn Kemboi
16 января 2021 г., 2:13

Это работает очень хорошо.

Эсфирь
12 февраля 2021 г., 21:22

Большое спасибо, именно то, что мне нужно

Аноним
20 марта 2021 г., 9:52

Большое спасибо!

Корнелия
30 марта 2021 г., 12:10

Прежде всего спасибо! Все готово, я вижу путь в своей командной строке, когда эхо %PATH%, но все же, если я попытаюсь ввести любую команду с помощью psql, вывод будет таким же: «psql» не распознается как внутренняя или внешняя команда,
работающая программа или пакетный файл….. что я могу сделать, чтобы решить проблему? Спасибо

Алекс
1 апреля 2021 г., 10:06

Эта проблема может возникнуть, если:
1. В каталоге, указанном в переменной PATH
2, нет утилиты psql.exe. Компьютер не перезагружался после изменения переменной

Аноним
5 апреля 2021 г., 13:02

Большое спасибо

Джалолиддин Муродуллаев
22 июня 2021 г., 10:11

Binoj Joseph
23 июня 2021 г., 19:44

Bilbo Bct
2 июля 2021 г., 8:38

Это было очень полезно. Спасибо!!

Кристиан
21 июля 2021 г., 23:02

Хорошо, у меня работает

Аноним
24 июля 2021 г., 00:20

Действительно понятно объяснили и помогли, спасибо.

Аноним
19 августа 2021 г., 5:20

Спасибо, было полезно

Лайл Р.
16 сентября 2021 г., 12:03

У меня была проблема с pythons pg_config, не находящимся на пути. Я никогда не работал с этим PATH, и вся моя команда разработчиков бэкенда ждала больше недели, чтобы все исправить и подготовить к работе. Я везде искал, как это сделать, и это один из немногих прямых примеров для этого.

yuyuichiu
5 февраля 2022 г., 7:25

Спасибо, спасибо!

Аноним
27 февраля 2022 г., 7:13

Привет,
кто-нибудь может сказать мне, что означает эта ошибка.
'more' не распознается как внутренняя или внешняя команда,
рабочая программа или пакетный файл.

Где и как вы пытаетесь выполнить команду "больше"?
Вы не даете достаточно подробностей, чтобы ответить на вопрос, который вы разместили.

Привет,
найдите ниже.

C:\Program Files\PostgreSQL\8.2\bin>psql testDB xyz
Пароль для пользователя xyz:
Добро пожаловать в psql 8.2.4, интерактивный терминал PostgreSQL.

Введите: \copyright для условий распространения
\h для справки по командам SQL
\? для помощи с командами psql
\g или завершите точкой с запятой для выполнения запроса
\q для выхода

testDB=> выберите * из теста;
'more' не распознается как внутренняя или внешняя команда,
рабочая программа или пакетный файл.
testDB=>

Я не могу решить эту проблему, я новичок в PostgreSQL.
Пожалуйста, вернитесь назад.

Попробуем собрать некоторую информацию:

Откройте окно DOS и в командной строке введите следующую команду:
more abc
Нажмите клавишу Enter. Что происходит?

Какую версию Windows вы сейчас используете?
Это была новая установка или вы обновили какую-то предыдущую версию?

Попробуем собрать некоторую информацию:

Откройте окно DOS и в командной строке введите следующую команду:
more abc
Нажмите клавишу Enter. Что происходит?

Какую версию Windows вы сейчас используете?
Это была новая установка или вы обновили какую-то предыдущую версию?

Да, вот что я понял.
Я использую Windows XP

C:\Program Files\PostgreSQL\8.2\bin>more
'more' не распознается как внутренняя или внешняя команда,
действующая программа или пакетный файл.

C:\Program Files\PostgreSQL\8.2\bin>psql testDB sindhu
Пароль для пользователя sindhu:
Добро пожаловать в psql 8.2.4, интерактивный терминал PostgreSQL.

Введите: \copyright для условий распространения
\h для справки по командам SQL
\? для помощи с командами psql
\g или завершите точкой с запятой для выполнения запроса
\q для выхода

testDB=> \ч;
'more' не распознается как внутренняя или внешняя команда,
рабочая программа или пакетный файл.

Это должна быть короткая запись TIL о переменной PSQL_EDITOR. Пытаясь выяснить все возможные подводные камни, я решил написать полный пост в блоге. Вы можете перейти к резюме, хотя. Все тесты проводились в Windows 10 с установленным PostgreSQL 12.

Как вы знаете, PostgreSQL поставляется с интерактивным консольным инструментом psql, который позволяет вам использовать множество расширенных функций, например, просмотр. Существует много информации о настройке psql в средах POSIX. Тем не менее, таких советов для пользователей Windows не хватает. Если вы, мой дорогой читатель, являетесь пользователем Linux, я уверен, что вы также найдете эту информацию полезной в любом случае. Кто знает, какой будет следующая покупка Microsoft. После LinkedIn, GitHub и Citus вы больше не можете быть уверены! 😉

Я выбрал Sublime в качестве цели, потому что это не простое консольное или однооконное приложение, а продвинутый текстовый процессор с улучшенной обработкой файлов, например. он восстановит несохраненные файлы при запуске.

Согласно руководству PSQL_EDITOR , EDITOR и VISUAL являются переменными среды, которые используются внутри psql для вызова редактора для ввода.

Тогда попробуем установить переменную среды.

Как видите, после первой команды \e ничего не было выполнено, хотя я отредактировал и сохранил содержимое запроса.
Что здесь не так? Прежде всего, я использовал subl.exe вместо sublime.exe, который является специальным инструментом командной строки:

Sublime Text включает инструмент командной строки subl для работы с файлами в командной строке. Это можно использовать для открытия файлов и проектов в Sublime Text, а также работает как РЕДАКТОР для инструментов Unix, таких как git и subversion.

psql запускает редактор, а затем ожидает завершения процесса редактирования. Но subl — это всего лишь специальный инструмент, который по факту запускает sublime.exe, а потом просто умирает. Итак, psql получает сигнал о завершении subl и возвращается, но временный файл еще даже не редактировался.

Когда вы попытаетесь выполнить \e в следующий раз, is сообщит о существовании временного файла.

Проверим документацию Sublime:

Указание -w приведет к тому, что команда subl не завершится, пока файл не будет закрыт.

Но проблема в том, что мы не можем передавать дополнительные параметры в Windows:

Единственный дополнительный параметр, который можно передать, — это PSQL_EDITOR_LINENUMBER_ARG . Давайте попробуем изучить исходники psql, чтобы узнать, можем ли мы передать произвольную командную строку в:

Теперь вы понимаете, почему мы не можем включать какие-либо аргументы в PSQL_EDITOR. По умолчанию он помещается в кавычки перед выполнением в Windows.

Конечно, мы можем использовать только sublime_text.exe :

У этого подхода есть один явный недостаток. Вам нужно закрыть редактор Sublime, а не только вкладку с файлом, если вы хотите продолжить работу с psql. Предполагая, что мы обычно работаем с большим количеством файлов одновременно, это огромная проблема.

Чтобы сохранить все преимущества Sublime Text, мы можем создать простой пакетный скрипт в домашней папке:

Это работает как шарм! Вы только что закрыли вкладку и продолжили работу с psql в обычном режиме.

На снимке экрана выше вы можете увидеть очень распространенную ошибку, которую постоянно совершают люди. Они пытаются установить РЕДАКТОР внутри psql и используют для этого команду SET. SET используется для внутренних переменных psql, для работы с переменными среды следует использовать команду \setenv. Но на этот раз убедитесь, что вы используете правильное цитирование:

<р>1. PSQL_EDITOR — это переменная среды, управляемая оболочкой. Вы должны установить его перед вызовом psql или внутри psql с помощью специальной команды \setenv
2. Доступно несколько синонимов PSQL_EDITOR, EDITOR, VISUAL
3. В Windows вы не можете использовать произвольную команду оболочки в качестве значения PSQL_EDITOR, только имя или полный путь к соответствующему файлу (двоичному, пакетному, .cmd и т. д.) из-за принудительного цитирования внутри psql
4.Если вам нужно использовать какую-то сложную команду, используйте для этого скрипт (cmd, powershell) или создайте ярлык с соответствующими аргументами.

Павло Голуб

Я эксперт по PostgreSQL и разработчик в компании Cybertec. Я работаю с PostgreSQL с 2002 года.

Читайте также: