Подключение к базе данных в кластере PostgreSQL
- Настройка групп безопасности
- Получение SSL-сертификата
- FQDN хоста PostgreSQL
- Особые FQDN
- Выбор FQDN и способа подключения к кластеру
- Подключение из графических IDE
- Подключение из Yandex WebSQL
- Подключение из pgAdmin 4
- Подключение из Looker Studio
- Подготовка к подключению из Docker-контейнера
- Примеры строк подключения
К хостам кластера Managed Service for PostgreSQL можно подключиться:
-
Через интернет, если вы настроили публичный доступ для нужного хоста. К таким хостам подключиться можно только используя SSL-соединение.
-
С виртуальных машин Yandex Cloud, расположенных в той же облачной сети. Если к хосту нет публичного доступа, для подключения с таких виртуальных машин необязательно использовать SSL-соединение.
-
Из контейнера Serverless Containers. Если к хосту нет публичного доступа, контейнер должен располагаться в той же облачной сети.
Важно
Если публичный доступ в кластере настроен только для некоторых хостов, автоматическая смена мастера может привести к невозможности подключиться к мастеру из интернета.
Настройка групп безопасности
Для подключения к кластеру необходимо, чтобы группы безопасности содержали правила, которые разрешают трафик с определенных портов, IP-адресов или из других групп безопасности.
Настройки правил будут различаться в зависимости от выбранного способа подключения:
Настройте все группы безопасности кластера так, чтобы они разрешали входящий трафик с любых IP-адресов на порт 6432. Для этого создайте следующее правило для входящего трафика:
- Диапазон портов —
6432
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
-
Настройте все группы безопасности кластера так, чтобы они разрешали входящий трафик из группы безопасности, в которой находится ВМ, на порт 6432. Для этого в этих группах создайте следующее правило для входящего трафика:
- Диапазон портов —
6432
. - Протокол —
TCP
. - Источник —
Группа безопасности
. - Группа безопасности — если кластер и ВМ находятся в одной и той же группе безопасности, выберите значение
Текущая
(Self
). В противном случае укажите группу безопасности ВМ.
- Диапазон портов —
-
Настройте группу безопасности, в которой находится ВМ так, чтобы можно было подключаться к ВМ и был разрешен трафик между ВМ и хостами кластера.
Пример правил для ВМ:
-
Для входящего трафика:
- Диапазон портов —
22
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
Это правило позволяет подключаться к ВМ по протоколу SSH.
- Диапазон портов —
-
Для исходящего трафика:
- Диапазон портов —
0-65535
. - Протокол —
Любой
(Any
). - Назначение —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
Это правило разрешает любой исходящий трафик, что позволяет не только подключаться к кластеру, но и устанавливать на ВМ необходимые для этого сертификаты и утилиты.
- Диапазон портов —
-
Примечание
Вы можете задать более детальные правила для групп безопасности, например, разрешающие трафик только в определенных подсетях.
Группы безопасности должны быть корректно настроены для всех подсетей, в которых будут размещены хосты кластера. При неполных или некорректных настройках групп безопасности можно потерять доступ к кластеру, если произойдет ручная или автоматическая смена мастера.
Подробнее о группах безопасности см. в разделе Группы безопасности.
Получение SSL-сертификата
Хосты PostgreSQL с публичным доступом поддерживают только шифрованные соединения. Чтобы использовать их, получите SSL-сертификат:
mkdir -p ~/.postgresql && \
wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" \
--output-document ~/.postgresql/root.crt && \
chmod 0655 ~/.postgresql/root.crt
Сертификат будет сохранен в файле ~/.postgresql/root.crt
.
mkdir $HOME\.postgresql; curl.exe -o $HOME\.postgresql\root.crt https://storage.yandexcloud.net/cloud-certs/CA.pem
Сертификат будет сохранен в файле $HOME\.postgresql\root.crt
.
Корпоративные политики и антивирус могут блокировать скачивание сертификата. Подробнее см. в разделе Вопросы и ответы.
Для использования графических IDE сохраните сертификат
FQDN хоста PostgreSQL
Для подключения к хосту потребуется его FQDN — доменное имя. Его можно получить несколькими способами:
-
Скопируйте команду для подключения к кластеру в консоли управления
. Команда содержит заполненный FQDN хоста. Чтобы получить команду, перейдите на страницу кластера и нажмите кнопку Подключиться. -
Посмотрите FQDN в консоли управления:
- Перейдите на страницу кластера.
- Перейдите в раздел Хосты.
- Скопируйте значение в столбце FQDN хоста.
Для хостов кластера также используются особые FQDN.
Особые FQDN
Наравне с обычными FQDN, Managed Service for PostgreSQL предоставляет несколько особых FQDN, которые также можно использовать при подключении к кластеру.
В кластерах из нескольких хостов особые FQDN могут некоторое время (до 10 минут) указывать на старый хост, даже если он сменил роль (например, из мастера стал репликой). Если используется особый FQDN, который указывает на текущий мастер, то часть запросов на запись может завершиться неудачей — они могут быть направлены к реплике. Это связано с тем, что на обновление DNS-записей для особых FQDN требуется время. Поэтому при использовании особых FQDN нужно уметь корректно обрабатывать ситуации, когда хост не может выполнить запрос из-за того, что у хоста сменилась роль. Например, можно повторить запрос позднее.
Текущий мастер
FQDN вида c-<идентификатор_кластера>.rw.mdb.yandexcloud.net
всегда указывает на текущий хост-мастер в кластере. Идентификатор кластера можно запросить со списком кластеров в каталоге.
При подключении к этому FQDN разрешено выполнять операции чтения и записи.
Примечание
Используйте подключение с помощью особого FQDN хоста-мастера только для процессов, которые допускают недоступность базы данных на запись продолжительностью до 10 минут.
Наименее отстающая реплика
FQDN вида c-<идентификатор_кластера>.ro.mdb.yandexcloud.net
указывает на наименее отстающую от мастера реплику. Идентификатор кластера можно запросить со списком кластеров в каталоге.
Особенности:
- При подключении к этому FQDN разрешено выполнять только операции чтения.
- Если в кластере нет активных реплик, то этот FQDN укажет на текущий хост-мастер.
- Реплики, для которых вручную установлен источник репликации, не могут выбираться как наименее отстающие при использовании этого FQDN.
Выбор FQDN и способа подключения к кластеру
К кластеру можно подключиться с использованием FQDN хостов или с использованием особых FQDN. Если кластер состоит из нескольких хостов, и для него настроено автоматическое переключение мастера, то это необходимо учитывать при подключении. Это важно, потому что текущий мастер может в следующий момент времени стать репликой и наоборот.
Важно
Если при автоматическом переключении мастера новым мастером или наименее отстающей репликой станет хост без публичного доступа, подключиться к такому хосту из интернета будет невозможно. Чтобы этого избежать, включите публичный доступ для всех хостов кластера.
Воспользуйтесь одним из способов, чтобы подключиться к хостам-мастерам с возможностью чтения и записи:
-
Подключитесь с помощью особого FQDN, который указывает на текущий мастер.
При переключении мастера этот FQDN может некоторое время указывать на бывший мастер, который стал репликой, поскольку необходимо время для обновления DNS-записи.
Поэтому если приложение использует такой FQDN, то оно должно корректно обрабатывать ситуацию, когда мастер временно недоступен. Например, можно повторять запросы на запись через некоторое время.
Пример подключения
В этом примере используется идентификатор кластера
c9qash3nb1v9********
:psql "host=c-c9qash3nb1v9********.rw.mdb.yandexcloud.net \ port=6432 \ sslmode=verify-full \ dbname=<имя_БД> \ user=<имя_пользователя>"
-
Подключитесь, перечислив все хосты кластера и указав параметр
target_session_attrs=read-write
.Пример подключения
В этом примере перечисляются все хосты кластера.
Хосты имеют идентификаторы
rc1a-be***.mdb.yandexcloud.net
,rc1b-5r***.mdb.yandexcloud.net
иrc1d-t4***.mdb.yandexcloud.net
:psql "host=rc1a-be***.mdb.yandexcloud.net,rc1b-5r***.mdb.yandexcloud.net,rc1d-t4***.mdb.yandexcloud.net \ port=6432 \ sslmode=verify-full \ dbname=<имя_БД> \ user=<имя_пользователя> \ target_session_attrs=read-write"
Воспользуйтесь одним из способов, чтобы подключиться к хостам с возможностью чтения:
-
Подключитесь с помощью особого FQDN, который указывает на наименее отстающую реплику.
Пример подключения
В этом примере используется идентификатор кластера
c9qash3nb1v9********
:psql "host=c-c9qash3nb1v9********.ro.mdb.yandexcloud.net \ port=6432 \ sslmode=verify-full \ dbname=<имя_БД> \ user=<имя_пользователя>"
-
Подключитесь, перечислив все хосты кластера и указав параметр
target_session_attrs=any
.Пример подключения
В этом примере перечисляются все хосты кластера.
Хосты имеют идентификаторы
rc1a-be***.mdb.yandexcloud.net
,rc1b-5r***.mdb.yandexcloud.net
иrc1d-t4***.mdb.yandexcloud.net
:psql "host=rc1a-be***.mdb.yandexcloud.net,rc1b-5r***.mdb.yandexcloud.net,rc1d-t4***.mdb.yandexcloud.net \ port=6432 \ sslmode=verify-full \ dbname=<имя_БД> \ user=<имя_пользователя> \ target_session_attrs=any"
Примечание
Параметр target_session_attrs
можно указать, если для подключения используется клиент, работающий с библиотекой libpq
.
Значение read-write
для этого параметра поддерживается библиотекой libpq
начиная с версии 10
Как обновить версию библиотеки, которую использует утилита psql
- Для дистрибутивов Linux на основе Debian — установите пакет
postgresql-client-10
или новее (например, через apt-репозиторий ). - Для ОС, использующих RPM-пакеты — воспользуйтесь дистрибутивом PostgreSQL, доступным в yum-репозитории
.
Подключение из графических IDE
Подключения проверялись в следующем окружении:
- Ubuntu 20.04, DBeaver:
22.2.4
; - MacOS Monterey 12.7:
- JetBrains DataGrip:
2023.3.4
; - DBeaver Community:
24.0.0
.
- JetBrains DataGrip:
Подключаться из графических IDE можно только к хостам кластера в публичном доступе с использованием SSL-сертификата.
Чтобы избежать ошибок при подключении, сохраните сертификат
- Создайте источник данных:
- Выберите в меню File → New → Data Source → PostgreSQL.
- Укажите параметры подключения на вкладке General:
-
User, Password — имя и пароль пользователя БД;
-
URL — строка подключения:
jdbc:postgresql://<особый_FQDN>:6432>/<имя_БД>
Также в строке подключения можно использовать список FQDN всех хостов кластера:
jdbc:postgresql://<хост_1_PostgreSQL:6432>,...,<хост_N_PostgreSQL:6432>/<имя_БД>
-
Нажмите ссылку Download, чтобы загрузить драйвер соединения.
-
- На вкладке SSH/SSL:
- Включите настройку Use SSL.
- В поле CA file укажите путь к файлу SSL-сертификата для подключения.
- Нажмите ссылку Test Connection для проверки подключения. При успешном подключении будет выведен статус подключения, информация о СУБД и драйвере.
- Нажмите кнопку OK, чтобы сохранить источник данных.
- Создайте новое соединение с БД:
- Выберите в меню База данных пункт Новое соединение.
- Выберите из списка БД PostgreSQL.
- Нажмите кнопку Далее.
- Укажите параметры подключения на вкладке Главное:
- Хост — особый FQDN хоста-мастера или обычный FQDN хоста;
- Порт —
6432
; - База данных — имя БД для подключения;
- В блоке Аутентификация укажите имя и пароль пользователя БД.
- На вкладке SSL:
- Включите настройку Использовать SSL.
- В поле Корневой сертификат укажите путь к сохраненному файлу SSL-сертификата.
- Нажмите кнопку Тест соединения ... для проверки подключения. При успешном подключении будет выведен статус подключения, информация о СУБД и драйвере.
- Нажмите кнопку Готово, чтобы сохранить настройки соединения с БД.
Подключение из Yandex WebSQL
Вы можете отправлять SQL-запросы к базам данных в кластере Managed Service for PostgreSQL с помощью сервиса Yandex WebSQL.
WebSQL — это сервис Yandex Cloud, который позволяет подключаться к кластерам управляемых баз данных, работать с БД, таблицами и схемами и выполнять запросы. Сервис работает в браузере, не требует дополнительной авторизации и предлагает удобные подсказки для работы с SQL-командами.
Чтобы подключаться из WebSQL к кластеру Managed Service for PostgreSQL, необходимо создать подключение:
- Перейдите на страницу каталога и выберите сервис Managed Service for PostgreSQL.
- Нажмите на имя нужного кластера.
- Включите опцию Доступ из WebSQL в настройках кластера, если она еще не включена.
- Выберите вкладку WebSQL.
- Нажмите кнопку Создать подключение и укажите параметры подключения:
- Имя подключения.
- Тип базы данных — PostgreSQL.
- Кластер — будет автоматически выбран текущий кластер PostgreSQL.
- Имя пользователя, от лица которого вы будете подключаться к базе данных в кластере.
- Пароль пользователя.
- Базы данных, к которым вы хотите подключиться. Вы можете подключиться только к существующим в этом кластере БД. У пользователя, которого вы указали, должен быть настроен доступ к ним.
- Нажмите кнопку Создать.
Чтобы открыть SQL-редактор, нажмите на созданное подключение на вкладке WebSQL. Справочник по поддерживаемым запросам можно найти в документации PostgreSQL
Примечание
С помощью команд SQL нельзя выполнять действия, требующие прав суперпользователя.
Подробнее о работе с WebSQL см. в документации сервиса.
Подключение из pgAdmin 4
Подключение проверялось для pgAdmin 4
Подключаться из pgAdmin 4 можно только к хостам кластера в публичном доступе с использованием SSL-сертификата.
Создайте новое подключение к серверу:
-
Выберите в меню Object → Register → Server...
-
На вкладке General в поле Name укажите имя, под которым кластер будет отображаться в интерфейсе pgAdmin 4. Имя может быть любым.
-
На вкладке Connection укажите параметры подключения:
- Host name/address — особый FQDN хоста-мастера или обычный FQDN хоста;
- Port —
6432
; - Maintenance database — имя БД для подключения;
- Username — имя пользователя, от имени которого выполняется подключение;
- Password — пароль пользователя.
-
На вкладке Parameters:
- Установите параметр SSL mode в значение
verify-full
. - Добавьте новый параметр Root certificate и укажите в нем путь к сохраненному файлу SSL-сертификата.
- Установите параметр SSL mode в значение
-
Нажмите кнопку Save, чтобы сохранить настройки подключения к серверу.
Кластер появится в списке серверов в навигационном меню.
Подключение из Looker Studio
Подключаться из Looker Studio
-
Сохраните сертификат сервера
CA.pem
в локальную папку. -
В той же папке сгенерируйте сертификат клиента с приватным ключом:
openssl req -newkey rsa:2048 -nodes -keyout private.pem -out cert.pem
При создании сертификата программа предложит изменить ряд настроек. Нажмите Enter, чтобы использовать для них значения по умолчанию.
В локальной папке появятся два файла:
cert.pem
иprivate.pem
. -
На странице навигации Looker Studio
выберите Создать → Источник данных. -
Выберите PostgreSQL.
-
Заполните поля:
- Имя хоста или IP-адрес — особый FQDN хоста-мастера или обычный FQDN хоста;
- Порт —
6432
; - База данных — имя БД для подключения;
- Имя пользователя — имя пользователя, от имени которого выполняется подключение;
- Пароль — пароль пользователя.
-
Выберите опции Включить SSL и Включить аутентификацию клиента.
-
Укажите файлы сертификатов и приватный ключ клиента в соответствующих полях:
- Server certificate — выберите файл
CA.pem
. - Client certificate — выберите файл
cert.pem
. - Client private key — выберите файл
private.pem
.
- Server certificate — выберите файл
-
Нажмите Выполнить аутентификацию.
Подготовка к подключению из Docker-контейнера
Чтобы подключаться к кластеру Managed Service for PostgreSQL из Docker-контейнера, добавьте в Dockerfile строки:
RUN apt-get update && \
apt-get install postgresql-client --yes
Пример подключения из Yandex Serverless Containers см. в практическом руководстве.
RUN apt-get update && \
apt-get install wget postgresql-client --yes && \
mkdir --parents ~/.postgresql && \
wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" \
--output-document ~/.postgresql/root.crt && \
chmod 0655 ~/.postgresql/root.crt
Примеры строк подключения
Примеры проверялись в следующем окружении:
- Виртуальная машина в Yandex Cloud с Ubuntu 20.04 LTS:
- Bash:
5.0.16
. - Python:
3.8.2
; pip3:20.0.2
. - PHP:
7.4.3
. - OpenJDK:
11.0.8
; Maven:3.6.3
. - Node.JS:
10.19.0
, npm:6.14.4
. - Go:
1.13.8
. - Ruby:
2.7.0p0
. - unixODBC:
2.3.6
.
- Bash:
- Виртуальная машина в Yandex Cloud с Windows Server 2019 Datacenter:
- PostgreSQL:
13
. - PowerShell:
5.1.17763.1490 Desktop
. - .NET 5
- Microsoft.EntityFrameworkCore 5.0.9
- Npgsql.EntityFrameworkCore.PostgreSQL 5.0.7
- PostgreSQL:
Подключиться к хостам PostgreSQL в публичном доступе можно только с использованием SSL-сертификата. Перед подключением к таким хостам подготовьте сертификат.
В примерах ниже предполагается, что SSL-сертификат root.crt
расположен в директории:
/home/<домашняя_директория>/.postgresql/
для Ubuntu;$HOME\AppData\Roaming\postgresql
для Windows.
Подключение без использования SSL-сертификата поддерживается только для хостов, находящихся не в публичном доступе. В этом случае трафик внутри облачной сети при подключении к БД шифроваться не будет.
Подключиться к кластеру возможно как с использованием обычных FQDN хостов (можно передавать список из нескольких таких FQDN, разделенных запятой), так и особых FQDN. В примерах используется особый FQDN текущего хоста-мастера.
Примеры кода с заполненным FQDN хоста доступны в консоли управления
1C:Предприятие
Если кластер использует версию PostgreSQL, оптимизированную для работы с системой 1С:Предприятие
, укажите в настройках:
- Защищенное соединение — отключено.
- Тип СУБД —
PostgreSQL
. - Сервер баз данных —
с-<идентификатор_кластера>.rw.mdb.yandexcloud.net port=6432
. - Имя базы данных —
<имя_БД>
. - Пользователь базы данных —
<имя_пользователя>
. - Пароль пользователя —
<пароль>
. - Создать базу данных в случае ее отсутствия — отключено.
Bash
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes postgresql-client
-
Подключитесь к базе данных:
psql "host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net \ port=6432 \ sslmode=disable \ dbname=<имя_БД> \ user=<имя_пользователя> \ target_session_attrs=read-write"
После выполнения команды введите пароль пользователя для завершения процедуры подключения.
-
Для проверки успешности подключения выполните запрос:
SELECT version();
-
Подключитесь к базе данных:
psql "host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net \ port=6432 \ sslmode=verify-full \ dbname=<имя_БД> \ user=<имя_пользователя> \ target_session_attrs=read-write"
После выполнения команды введите пароль пользователя для завершения процедуры подключения.
-
Для проверки успешности подключения выполните запрос:
SELECT version();
C++ (фреймворк userver)
Асинхронный фреймворк userver
Перед подключением получите доступ к фреймворку одним из способов:
- Создайте виртуальную машину Yandex Compute Cloud из образа userver. Этот образ уже содержит фреймворк и все необходимые зависимости.
- Вручную установите фреймворк и все необходимые зависимости
.
-
Создайте проект на основе шаблона для сервиса
. -
Измените конфигурационный файл
configs/config_vars.yaml
. В качестве значения переменнойdbconnection
укажите строку подключения к кластеру PostgreSQL:postgres://<имя_пользователя>:<пароль_пользователя>@c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:6432/<имя_БД>
-
Соберите проект и запустите сервис:
make build-debug && \ ./build_debug/pg_service_template -c configs/static_config.yaml --config_vars configs/config_vars.yaml
-
Создайте проект на основе шаблона для сервиса
. -
Измените конфигурационный файл
configs/config_vars.yaml
. В качестве значения переменнойdbconnection
укажите строку подключения к кластеру PostgreSQL:postgres://<имя_пользователя>:<пароль_пользователя>@c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:6432/<имя_БД>?ssl=true&sslmode=verify-full
-
Соберите проект и запустите сервис:
make build-debug && \ ./build_debug/pg_service_template -c configs/static_config.yaml --config_vars configs/config_vars.yaml
После запуска сервис будет ожидать поступления POST-запроса от пользователя. В ходе ожидания запроса сервис будет периодически проверять доступность кластера PostgreSQL, выполняя запрос SELECT 1 as ping
. Информация об этом содержится в логах работы сервиса.
Пример содержимого логов при успешном подключении к кластеру
tskv ... level=INFO module=MakeQuerySpan ( userver/postgresql/src/storages/postgres/detail/connection_impl.cpp:647 )
...
db_statement=SELECT 1 AS ping
db_type=postgres
db_instance=********
peer_address=c-********.rw.mdb.yandexcloud.net:6432
...
C# EF Core
Для подключения к кластеру необходим пакет Npgsql
using Npgsql;
namespace ConsoleApp
{
class Program
{
static async Task Main(string[] args)
{
var host = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.net";
var port = "6432";
var db = "<имя_БД>";
var username = "<имя_пользователя>";
var password = "<пароль_пользователя>";
var connString = $"Host={host};Port={port};Database={db};Username={username};Password={password};Ssl Mode=VerifyFull;";
await using var conn = new NpgsqlConnection(connString);
await conn.OpenAsync();
await using (var cmd = new NpgsqlCommand("SELECT VERSION();", conn))
await using (var reader = await cmd.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
{
Console.WriteLine(reader.GetInt32(0));
}
}
}
}
}
Go
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes golang git && \
go mod init example && go get github.com/jackc/pgx/v4
-
Пример кода:
connect.go
package main import ( "context" "fmt" "os" "github.com/jackc/pgx/v4" ) const ( host = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.net" port = 6432 user = "<имя_пользователя>" password = "<пароль_пользователя>" dbname = "<имя_БД>" ) func main() { connstring := fmt.Sprintf( "host=%s port=%d dbname=%s user=%s password=%s target_session_attrs=read-write", host, port, dbname, user, password) connConfig, err := pgx.ParseConfig(connstring) if err != nil { fmt.Fprintf(os.Stderr, "Unable to parse config: %v\n", err) os.Exit(1) } conn, err := pgx.ConnectConfig(context.Background(), connConfig) if err != nil { fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err) os.Exit(1) } defer conn.Close(context.Background()) var version string err = conn.QueryRow(context.Background(), "select version()").Scan(&version) if err != nil { fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err) os.Exit(1) } fmt.Println(version) }
-
Подключение:
go run connect.go
-
Пример кода:
connect.go
package main import ( "context" "crypto/tls" "crypto/x509" "fmt" "io/ioutil" "os" "github.com/jackc/pgx/v4" ) const ( host = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.net" port = 6432 user = "<имя_пользователя>" password = "<пароль_пользователя>" dbname = "<имя_БД>" ca = "/home/<домашняя_директория>/.postgresql/root.crt" ) func main() { rootCertPool := x509.NewCertPool() pem, err := ioutil.ReadFile(ca) if err != nil { panic(err) } if ok := rootCertPool.AppendCertsFromPEM(pem); !ok { panic("Failed to append PEM.") } connstring := fmt.Sprintf( "host=%s port=%d dbname=%s user=%s password=%s sslmode=verify-full target_session_attrs=read-write", host, port, dbname, user, password) connConfig, err := pgx.ParseConfig(connstring) if err != nil { fmt.Fprintf(os.Stderr, "Unable to parse config: %v\n", err) os.Exit(1) } connConfig.TLSConfig = &tls.Config{ RootCAs: rootCertPool, ServerName: "c-<идентификатор_кластера>.rw.mdb.yandexcloud.net", } conn, err := pgx.ConnectConfig(context.Background(), connConfig) if err != nil { fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err) os.Exit(1) } defer conn.Close(context.Background()) var version string err = conn.QueryRow(context.Background(), "select version()").Scan(&version) if err != nil { fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err) os.Exit(1) } fmt.Println(version) }
При этом способе подключения в коде необходимо указывать полный путь к сертификату
root.crt
для PostgreSQL в переменнойca
. -
Подключение:
go run connect.go
Java
Перед подключением:
-
Установите зависимости:
sudo apt update && sudo apt install --yes default-jdk maven
-
Создайте директорию для проекта Maven:
cd ~/ && mkdir -p project/src/java/com/example && cd project/
-
Создайте конфигурационный файл для Maven:
pom.xml
<?xml version="1.0" encoding="utf-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>app</artifactId> <packaging>jar</packaging> <version>0.1.0</version> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.16</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}-${project.version}</finalName> <sourceDirectory>src</sourceDirectory> <resources> <resource> <directory>src</directory> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <goals> <goal>attached</goal> </goals> <phase>package</phase> <configuration> <descriptorRefs> <descriptorRef> jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.App</mainClass> </manifest> </archive> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <configuration> <archive> <manifest> <mainClass>com.example.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
Актуальная версия зависимости для Maven: postgresql
.
-
Пример кода:
src/java/com/example/App.java
package com.example; import java.sql.*; public class App { public static void main(String[] args) { String DB_URL = "jdbc:postgresql://c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:6432/<имя_БД>?targetServerType=master&ssl=false&sslmode=disable"; String DB_USER = "<имя_пользователя>"; String DB_PASS = "<пароль_пользователя>"; try { Class.forName("org.postgresql.Driver"); Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); ResultSet q = conn.createStatement().executeQuery("SELECT version()"); if(q.next()) {System.out.println(q.getString(1));} conn.close(); } catch(Exception ex) {ex.printStackTrace();} } }
-
Сборка и подключение:
mvn clean package && \ java -jar target/app-0.1.0-jar-with-dependencies.jar
-
Пример кода:
src/java/com/example/App.java
package com.example; import java.sql.*; public class App { public static void main(String[] args) { String DB_URL = "jdbc:postgresql://c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:6432/<имя_БД>?targetServerType=master&ssl=true&sslmode=verify-full"; String DB_USER = "<имя_пользователя>"; String DB_PASS = "<пароль_пользователя>"; try { Class.forName("org.postgresql.Driver"); Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); ResultSet q = conn.createStatement().executeQuery("SELECT version()"); if(q.next()) {System.out.println(q.getString(1));} conn.close(); } catch(Exception ex) {ex.printStackTrace();} } }
-
Сборка и подключение:
mvn clean package && \ java -jar target/app-0.1.0-jar-with-dependencies.jar
Node.js
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes nodejs npm && \
npm install pg
app.js
"use strict";
const pg = require("pg");
const config = {
connectionString:
"postgres://<имя_пользователя>:<пароль_пользователя>@c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:6432/<имя_БД>"
};
const conn = new pg.Client(config);
conn.connect((err) => {
if (err) throw err;
});
conn.query("SELECT version()", (err, q) => {
if (err) throw err;
console.log(q.rows[0]);
conn.end();
});
app.js
"use strict";
const fs = require("fs");
const pg = require("pg");
const config = {
connectionString:
"postgres://<имя_пользователя>:<пароль_пользователя>@c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:6432/<имя_БД>",
ssl: {
rejectUnauthorized: true,
ca: fs
.readFileSync("/home/<домашняя_директория>/.postgresql/root.crt")
.toString(),
},
};
const conn = new pg.Client(config);
conn.connect((err) => {
if (err) throw err;
});
conn.query("SELECT version()", (err, q) => {
if (err) throw err;
console.log(q.rows[0]);
conn.end();
});
При этом способе подключения в коде необходимо указывать полный путь к сертификату root.crt
для PostgreSQL в переменной ca
.
Идентификатор кластера можно получить со списком кластеров.
Подключение:
node app.js
ODBC
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes unixodbc odbc-postgresql
Драйвер PostgreSQL ODBC будет автоматически зарегистрирован в файле /etc/odbcinst.ini
.
-
Пример кода:
/etc/odbc.ini
[postgresql] Driver=PostgreSQL Unicode Servername=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net Username=<имя_пользователя> Password=<пароль_пользователя> Database=<имя_БД> Port=6432 Pqopt=target_session_attrs=read-write
-
Подключение:
isql -v postgresql
После подключения к СУБД выполните команду
SELECT version();
.
-
Пример кода:
/etc/odbc.ini
[postgresql] Driver=PostgreSQL Unicode Servername=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net Username=<имя_пользователя> Password=<пароль_пользователя> Database=<имя_БД> Port=6432 Pqopt=target_session_attrs=read-write Sslmode=verify-full
-
Подключение:
isql -v postgresql
После подключения к СУБД выполните команду
SELECT version();
.
PHP
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes php php-pgsql
-
Пример кода:
connect.php
<?php $conn = pg_connect(" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net port=6432 sslmode=disable dbname=<имя_БД> user=<имя_пользователя> password=<пароль_пользователя> target_session_attrs=read-write "); $q = pg_query($conn, "SELECT version()"); $result = pg_fetch_row($q); echo $result[0]; pg_close($conn); ?>
-
Подключение:
php connect.php
-
Пример кода:
connect.php
<?php $conn = pg_connect(" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net port=6432 sslmode=verify-full dbname=<имя_БД> user=<имя_пользователя> password=<пароль_пользователя> target_session_attrs=read-write "); $q = pg_query($conn, "SELECT version()"); $result = pg_fetch_row($q); echo $result[0]; pg_close($conn); ?>
-
Подключение:
php connect.php
PowerShell
Перед подключением установите PostgreSQL для Windows
-
Установите переменные окружения для подключения:
$Env:PGSSLMODE="disable"; $Env:PGTARGETSESSIONATTRS="read-write"
-
Подключитесь к базе данных:
& "C:\Program Files\PostgreSQL\<версия>\bin\psql.exe" ` --host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net ` --port=6432 ` --username=<имя_пользователя> ` <имя_БД>
После выполнения команды введите пароль пользователя для завершения процедуры подключения.
-
Для проверки успешности подключения выполните запрос:
SELECT version();
-
Установите переменные окружения для подключения:
$Env:PGSSLMODE="verify-full"; $Env:PGTARGETSESSIONATTRS="read-write"
-
Подключитесь к базе данных:
& "C:\Program Files\PostgreSQL\<версия>\bin\psql.exe" ` --host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net ` --port=6432 ` --username<имя_пользователя> ` <имя_БД>
После выполнения команды введите пароль пользователя для завершения процедуры подключения.
-
Для проверки успешности подключения выполните запрос:
SELECT version();
Python
Перед подключением установите зависимости:
sudo apt update && sudo apt install -y python3 python3-pip && \
pip3 install psycopg2-binary
-
Пример кода:
connect.py
import psycopg2 conn = psycopg2.connect(""" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net port=6432 sslmode=disable dbname=<имя_БД> user=<имя_пользователя> password=<пароль_пользователя> target_session_attrs=read-write """) q = conn.cursor() q.execute('SELECT version()') print(q.fetchone()) conn.close()
-
Подключение:
python3 connect.py
-
Пример кода:
connect.py
import psycopg2 conn = psycopg2.connect(""" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net port=6432 sslmode=verify-full dbname=<имя_БД> user=<имя_пользователя> password=<пароль_пользователя> target_session_attrs=read-write """) q = conn.cursor() q.execute('SELECT version()') print(q.fetchone()) conn.close()
-
Подключение:
python3 connect.py
R
Перед подключением:
-
Установите зависимости:
sudo apt update && sudo apt install libpq-dev r-base --yes
-
Установите библиотеку RPostgres
:sudo R --interactive install.packages("RPostgres") quit()
-
Пример кода:
connect.r
library(DBI) conn <- dbConnect(RPostgres::Postgres(), dbname="<имя_БД>", host="c-<идентификатор_кластера>.rw.mdb.yandexcloud.net", port=6432, user="<имя_пользователя>", password="<пароль_пользователя>" ) res <- dbSendQuery(conn, "SELECT VERSION();") dbFetch(res) dbClearResult(res) dbDisconnect(conn)
-
Подключение:
R connect.r
-
Пример кода:
connect.r
library(DBI) conn <- dbConnect(RPostgres::Postgres(), dbname="<имя_БД>", host="c-<идентификатор_кластера>.rw.mdb.yandexcloud.net", port=6432, sslmode="verify-full", user="<имя_пользователя>", password="<пароль_пользователя>" ) res <- dbSendQuery(conn, "SELECT VERSION();") dbFetch(res) dbClearResult(res) dbDisconnect(conn)
-
Подключение:
R connect.r
Ruby
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes ruby ruby-pg
-
Пример кода:
connect.rb
require "pg" conn = PG.connect(" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net port=6432 dbname=<имя_БД> user=<имя_пользователя> password=<пароль_пользователя> target_session_attrs=read-write sslmode=disable ") q = conn.exec("SELECT version()") puts q.getvalue 0, 0 conn.close()
-
Подключение:
ruby connect.rb
-
Пример кода:
connect.rb
require "pg" conn = PG.connect(" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net port=6432 dbname=<имя_БД> user=<имя_пользователя> password=<пароль_пользователя> target_session_attrs=read-write sslmode=verify-full ") q = conn.exec("SELECT version()") puts q.getvalue 0, 0 conn.close()
-
Подключение:
ruby connect.rb
При успешном подключении к кластеру и выполнении тестового запроса будет выведена версия PostgreSQL. Исключение — пример для фреймворка userver, в котором будет выполняться тестовый запрос SELECT 1 as ping
для периодической проверки доступности кластера PostgreSQL.
ClickHouse® является зарегистрированным товарным знаком ClickHouse, Inc