Примеры кода для подключения к кластеру Greenplum®
Примеры проверялись в следующем окружении:
- Виртуальная машина в Yandex Cloud с Ubuntu 20.04 LTS:
- Bash:
5.0.16.
- Bash:
- Виртуальная машина в Yandex Cloud с Windows Server 2019 Datacenter:
- PostgreSQL:
13. - PowerShell:
5.1.17763.1490 Desktop.
- PostgreSQL:
При создании кластера Greenplum® пользовательская база данных не создается. Для проверки подключения используйте служебную базу postgres.
Для подключения к кластеру с публичным доступом подготовьте SSL-сертификат. В примерах предполагается, что SSL-сертификат root.crt расположен в директории:
/home/<домашняя_директория>/.postgresql/для Ubuntu;$HOME\AppData\Roaming\postgresqlдля Windows.
Подключиться к кластеру можно как с использованием обычного FQDN хоста-мастера, так и особого FQDN первичного хоста-мастера. О том, как получить FQDN хоста, см. инструкцию.
Примеры кода с заполненным FQDN хоста доступны в консоли управления
C# EF Core
Необходимые пакеты:
- Microsoft.EntityFrameworkCore
- Npgsql.EntityFrameworkCore.PostgreSQL
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.net";
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);
}
}
}
}
Go
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes golang git && \
go mod init example && go get github.com/jackc/pgx/v4
-
Пример кода:
connect.gopackage main import ( "context" "fmt" "os" "github.com/jackc/pgx/v4" ) const ( host = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.net" 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) } -
Подключение:
go run connect.go
-
Пример кода:
connect.gopackage 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 = "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.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 --parents 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>Актуальную версию
postgresqlуточняйте на странице проекта в репозитории Maven .
-
Пример кода:
src/java/com/example/App.javapackage 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/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(); } } } -
Сборка и подключение:
mvn clean package && \ java -jar target/app-0.1.0-jar-with-dependencies.jar
-
Пример кода:
src/java/com/example/App.javapackage 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/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(); } } } -
Сборка и подключение:
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/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]);
conn.end();
});
app.js
"use strict";
const fs = require("fs");
const pg = require("pg");
const config = {
connectionString:
"postgres://<имя_пользователя>:<пароль_пользователя>@c-<идентификатор_кластера>.rw.mdb.yandexcloud.net: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]);
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=postgres 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=postgres 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=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); ?> -
Подключение:
php connect.php
-
Пример кода:
connect.php<?php $conn = pg_connect(" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net 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); ?> -
Подключение:
php connect.php
Python
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes python3 python3-pip && \
pip3 install psycopg2-binary
-
Пример кода:
connect.pyimport psycopg2 conn = psycopg2.connect(""" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net 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() -
Подключение:
python3 connect.py
-
Пример кода:
connect.pyimport psycopg2 conn = psycopg2.connect(""" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net 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() -
Подключение:
python3 connect.py
Ruby
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes ruby ruby-pg
-
Пример кода:
connect.rbrequire "pg" conn = PG.connect(" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net 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() -
Подключение:
ruby connect.rb
-
Пример кода:
connect.rbrequire "pg" conn = PG.connect(" host=c-<идентификатор_кластера>.rw.mdb.yandexcloud.net 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() -
Подключение:
ruby connect.rb
Greenplum® и Greenplum Database® являются зарегистрированными товарными знаками или товарными знаками Broadcom Inc в США и/или других странах.