[Документация Yandex Cloud](../../../index.md) > [Yandex MPP Analytics for PostgreSQL](../../index.md) > [Пошаговые инструкции](../index.md) > [Подключение](index.md) > Примеры кода

# Примеры кода для подключения к кластеру Yandex MPP Analytics for PostgreSQL

**Примеры проверялись в следующем окружении:**

* Виртуальная машина в Yandex Cloud с Ubuntu 20.04 LTS:
    * Bash: `5.0.16`.
* Виртуальная машина в Yandex Cloud с Windows Server 2019 Datacenter:
    * PostgreSQL: `13`.
    * PowerShell: `5.1.17763.1490 Desktop`.

При создании кластера Yandex MPP Analytics for PostgreSQL пользовательская база данных не создается. Для проверки подключения используйте служебную базу `postgres`.

Для подключения к кластеру с публичным доступом [подготовьте SSL-сертификат](index.md#get-ssl-cert). В примерах предполагается, что SSL-сертификат `root.crt` расположен в директории:

* `/home/<домашняя_директория>/.postgresql/` для Ubuntu;
* `$HOME\AppData\Roaming\postgresql` для Windows.

Подключиться к кластеру можно как с использованием обычного FQDN хоста-мастера, так и [особого FQDN](fqdn.md#fqdn-master) первичного хоста-мастера. При подключении с помощью JDBC-коннектора вы можете указать сразу два хоста-мастера. О том, как получить FQDN хоста, читайте в [инструкции](fqdn.md#get-fqdn).

Примеры кода с заполненным FQDN хоста доступны в [консоли управления](https://kz.console.yandex.cloud) по нажатию кнопки **Подключиться** на странице кластера.

## C# EF Core {#csharpefcore}

Необходимые пакеты:

* Microsoft.EntityFrameworkCore
* Npgsql.EntityFrameworkCore.PostgreSQL

{% list tabs group=connection %}

- Подключение с SSL {#with-ssl}

  ```csharp
  using System;
  using System.Threading.Tasks;
  using Microsoft.EntityFrameworkCore;

  namespace ConsoleApp
  {
      public class VersionString
      {
          public int id { get; set; }
          public string versionString { get; set; }
      }
      public class ApplicationContext : DbContext
      {
          public ApplicationContext()
          {
              Database.EnsureCreated();
          }
          protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
          {
              var host      = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz";
              var port      = "6432";
              var db        = "postgres";
              var username  = "<имя_пользователя>";
              var password  = "<пароль_пользователя>";
              optionsBuilder.UseNpgsql($"Host={host};Port={port};Database={db};Username={username};Password={password};Ssl Mode=Require;Trust Server Certificate=true;");
          }
          public DbSet<VersionString> VersionStrings { get; set; }

      }
      class Program
      {
          static async Task Main(string[] args)
          {
              using (ApplicationContext db = new ApplicationContext())
              {
                  var versionStrings = await db.VersionStrings.FromSqlRaw(@"select 1 as id, version() as versionString;").ToListAsync();
                  Console.WriteLine(versionStrings[0].versionString);
              }
          }
      }
  }
  ```

{% endlist %}

## Go {#go}

Перед подключением установите зависимости:

```bash
sudo apt update && sudo apt install --yes golang git && \
go mod init example && go get github.com/jackc/pgx/v4
```

{% list tabs group=connection %}

- Подключение без SSL {#without-ssl}

  1. Пример кода:

      `connect.go`

      ```go
      package main

      import (
      	"context"
      	"fmt"
      	"os"

      	"github.com/jackc/pgx/v4"
      )

      const (
      	host     = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz"
      	port     = 6432
      	user     = "<имя_пользователя>"
      	password = "<пароль_пользователя>"
      	dbname   = "postgres"
      )

      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)
      }
      ```

  1. Подключение:

      ```bash
      go run connect.go
      ```

- Подключение с SSL {#with-ssl}

  1. Пример кода:

      `connect.go`

      ```go
      package main

      import (
      	"context"
      	"crypto/tls"
      	"crypto/x509"
      	"fmt"
      	"os"

      	"github.com/jackc/pgx/v4"
      )

      const (
      	host     = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz"
      	port     = 6432
      	user     = "<имя_пользователя>"
      	password = "<пароль_пользователя>"
      	dbname   = "postgres"
      	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.kz",
      	}

      	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`.

  1. Подключение:

      ```bash
      go run connect.go
      ```

{% endlist %}

## Java {#java}

Перед подключением:

1. Установите зависимости:

    ```bash
    sudo apt update && sudo apt install --yes default-jdk maven
    ```

1. Создайте директорию для проекта Maven:

    ```bash
    cd ~/ && mkdir --parents project/src/java/com/example && cd project/
    ```

1. Создайте конфигурационный файл для Maven:

    {% cut "pom.xml" %}

    ```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>
    ```

    {% endcut %}

    Актуальную версию `postgresql` уточняйте на [странице проекта в репозитории Maven](https://mvnrepository.com/artifact/org.postgresql/postgresql).

{% list tabs group=connection %}

- Подключение без SSL {#without-ssl}

  1. Пример кода:

      `src/java/com/example/App.java`

      ```java
      package com.example;

      import java.sql.*;

      public class App {
        public static void main(String[] args) {
          String DB_URL  = "jdbc:postgresql://<FQDN_первичного_хоста-мастера>:6432,<FQDN_резервного_хоста-мастера>:6432/postgres?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();
          }
        }
      }
      ```

  1. Сборка и подключение:

      ```bash
      mvn clean package && \
      java -jar target/app-0.1.0-jar-with-dependencies.jar
      ```

- Подключение с SSL {#with-ssl}

  1. Пример кода:

      `src/java/com/example/App.java`

      ```java
      package com.example;

      import java.sql.*;

      public class App {
        public static void main(String[] args) {
          String DB_URL  = "jdbc:postgresql://<FQDN_первичного_хоста-мастера>:6432,<FQDN_резервного_хоста-мастера>:6432/postgres?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();
          }
        }
      }
      ```

  1. Сборка и подключение:

      ```bash
      mvn clean package && \
      java -jar target/app-0.1.0-jar-with-dependencies.jar
      ```

{% endlist %}

## Node.js {#nodejs}

Перед подключением установите зависимости:

```bash
sudo apt update && sudo apt install --yes nodejs npm && \
npm install pg
```

{% list tabs group=connection %}

- Подключение без SSL {#without-ssl}

    `app.js`

    ```javascript
    "use strict";
    const pg = require("pg");

    const config = {
        connectionString:
            "postgres://<имя_пользователя>:<пароль_пользователя>@c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:6432/postgres"
    };

    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].version);
        conn.end();
    });
    ```

- Подключение с SSL {#with-ssl}

    `app.js`

    ```javascript
    "use strict";
    const fs = require("fs");
    const pg = require("pg");

    const config = {
        connectionString:
            "postgres://<имя_пользователя>:<пароль_пользователя>@c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:6432/postgres",
        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].version);
        conn.end();
    });
    ```

    При этом способе подключения в коде необходимо указывать полный путь к сертификату `root.crt` для PostgreSQL в переменной `ca`.

{% endlist %}

Подключение:

```bash
node app.js
```

## ODBC {#odbc}

Перед подключением установите зависимости:

```bash
sudo apt update && sudo apt install --yes unixodbc odbc-postgresql
```

Драйвер PostgreSQL ODBC будет автоматически зарегистрирован в файле `/etc/odbcinst.ini`.

{% list tabs group=connection %}

- Подключение без SSL {#without-ssl}

  1. Пример кода:

      `/etc/odbc.ini`

      ```ini
      [postgresql]
      Driver=PostgreSQL Unicode
      Servername=c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz
      Username=<имя_пользователя>
      Password=<пароль_пользователя>
      Database=postgres
      Port=6432
      Pqopt=target_session_attrs=read-write
      ```

  1. Подключение:

      ```bash
      isql -v postgresql
      ```

      После подключения к СУБД выполните команду `SELECT version();`.

- Подключение с SSL {#with-ssl}

  1. Пример кода:

      `/etc/odbc.ini`

      ```ini
      [postgresql]
      Driver=PostgreSQL Unicode
      Servername=c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz
      Username=<имя_пользователя>
      Password=<пароль_пользователя>
      Database=postgres
      Port=6432
      Pqopt=target_session_attrs=read-write
      Sslmode=verify-full
      ```

  1. Подключение:

      ```bash
      isql -v postgresql
      ```

      После подключения к СУБД выполните команду `SELECT version();`.

{% endlist %}

## PHP {#php}

Перед подключением установите зависимости:

```bash
sudo apt update && sudo apt install --yes php php-pgsql
```

{% list tabs group=connection %}

- Подключение без SSL {#without-ssl}

  1. Пример кода:

      `connect.php`

      ```php
      <?php
        $conn = pg_connect("
            host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz
            port=6432
            sslmode=disable
            dbname=postgres
            user=<имя_пользователя>
            password=<пароль_пользователя>
            target_session_attrs=read-write
        ");

      $q = pg_query($conn, "SELECT version()");
      $result = pg_fetch_row($q);
      echo $result[0];

      pg_close($conn);
      ?>
      ```

  1. Подключение:

      ```bash
      php connect.php
      ```

- Подключение с SSL {#with-ssl}

  1. Пример кода:

      `connect.php`

      ``` php
      <?php
        $conn = pg_connect("
            host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz
            port=6432
            sslmode=verify-full
            dbname=postgres
            user=<имя_пользователя>
            password=<пароль_пользователя>
            target_session_attrs=read-write
        ");

      $q = pg_query($conn, "SELECT version()");
      $result = pg_fetch_row($q);
      echo $result[0];

      pg_close($conn);
      ?>
      ```

  1. Подключение:

      ```bash
      php connect.php
      ```

{% endlist %}

## Python {#python}

Перед подключением установите зависимости:

```bash
sudo apt update && sudo apt install --yes python3 python3-pip && \
pip3 install psycopg2-binary
```

{% list tabs group=connection %}

- Подключение без SSL {#without-ssl}

  1. Пример кода:

      `connect.py`

      ```python
      import psycopg2

      conn = psycopg2.connect("""
          host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz
          port=6432
          sslmode=disable
          dbname=postgres
          user=<имя_пользователя>
          password=<пароль_пользователя>
          target_session_attrs=read-write
      """)

      q = conn.cursor()
      q.execute('SELECT version()')

      print(q.fetchone())

      conn.close()
      ```

  1. Подключение:

      ```bash
      python3 connect.py
      ```

- Подключение с SSL {#with-ssl}

  1. Пример кода:

      `connect.py`

      ```python
      import psycopg2

      conn = psycopg2.connect("""
          host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz
          port=6432
          sslmode=verify-full
          dbname=postgres
          user=<имя_пользователя>
          password=<пароль_пользователя>
          target_session_attrs=read-write
      """)

      q = conn.cursor()
      q.execute('SELECT version()')

      print(q.fetchone())

      conn.close()
      ```

  1. Подключение:

      ```bash
      python3 connect.py
      ```

{% endlist %}

## Ruby {#ruby}

Перед подключением установите зависимости:

```bash
sudo apt update && sudo apt install --yes ruby ruby-pg
```

{% list tabs group=connection %}

- Подключение без SSL {#without-ssl}

  1. Пример кода:

      `connect.rb`

      ```ruby
      require "pg"

      conn = PG.connect("
              host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz
              port=6432
              dbname=postgres
              user=<имя_пользователя>
              password=<пароль_пользователя>
              target_session_attrs=read-write
              sslmode=disable
      ")

      q = conn.exec("SELECT version()")
      puts q.getvalue 0, 0

      conn.close()
      ```

  1. Подключение:

      ```bash
      ruby connect.rb
      ```

- Подключение с SSL {#with-ssl}

  1. Пример кода:

      `connect.rb`

      ```ruby
      require "pg"

      conn = PG.connect("
              host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz
              port=6432
              dbname=postgres
              user=<имя_пользователя>
              password=<пароль_пользователя>
              target_session_attrs=read-write
              sslmode=verify-full
      ")

      q = conn.exec("SELECT version()")
      puts q.getvalue 0, 0

      conn.close()
      ```

  1. Подключение:

      ```bash
      ruby connect.rb
      ```

{% endlist %}