Примеры кода

В предыдущих разделах описывалось, как создавать таблицы и выполнять вставку данных и запросы с помощью psql в командной строке. Однако в реальной разработке разработчики обычно используют языки программирования для подключения к базе данных и выполнения операций DML и DDL. В данном разделе показано, как подключиться к MatrixDB и выполнять запросы на Java, Python, Golang и C.

MatrixDB совместим с протоколом передачи данных PostgreSQL. Следовательно, вы можете подключаться к нему теми же способами, что и к PostgreSQL.


1. JAVA

Чтобы подключиться к MatrixDB с помощью Java, сначала загрузите драйвер JDBC по адресу https://jdbc.postgresql.org/download.html.

Пример кода:

package main;
import java.sql.*;

public class Main {
    public static void main(String []args) {
        Connection connection = null;
        Statement statement = null;
        try {
            String url = "jdbc:postgresql://127.0.0.1:5432/mxadmin";
            String user = "mxadmin";
            String password = "abcd";
            Class.forName("org.postgresql.Driver");
            connection = DriverManager.getConnection(url, user, password);

            // Create table
            String sql = "CREATE TABLE data ("
                    + "time timestamp,"
                    + "tag_id int,"
                    + "metrics1 float8,"
                    + "metrics2 float8,"
                    + "metrics3 float8"
                    + ")Distributed by(tag_id)";
            statement = connection.createStatement();
            statement.execute(sql);

            // Insert data
            sql = "INSERT INTO data VALUES(now(), 1, 1.1, 1.2, 1.3)";
            statement.execute(sql);

            // Query data
            sql = "SELECT * FROM data";
            ResultSet resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                String ts = resultSet.getString(1);
                int tag_id = resultSet.getInt(2);
                double metrics1 = resultSet.getDouble(3);
                double metrics2 = resultSet.getDouble(4);
                double metrics3 = resultSet.getDouble(5);
                System.out.printf("%s %d %f %f %f\n", ts, tag_id, metrics1, metrics2, metrics3);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
        }
    }
}


2. Python

Для подключения к MatrixDB с помощью Python сначала установите пакет psycopg2:

pip3 install psycopg2

Пример кода:

# -*- coding: utf-8 -*-
import psycopg2

class MatrixDB(object):
    def __init__(self):
        self.host = "127.0.0.1"
        self.user = "mxadmin"
        self.database = "mxadmin"
        self.port = "5432"
        self.password = "abcd"

    def get_conn(self):
        conn = psycopg2.connect(database=self.database,
                                user=self.user,
                                password=self.password,
                                host=self.host,
                                port=self.port)
        return conn

    def create_table(self):
        conn = self.get_conn()
        cursor = conn.cursor()
        sql = "CREATE TABLE data(" \
                "time timestamp," \
                "tag_id int," \
                "metrics1 float8," \
                "metrics2 float8," \
                "metrics3 float8" \
                ")Distributed by(tag_id)"
        cursor.execute(sql)
        conn.commit()
        conn.close()

    def insert(self):
        conn = self.get_conn()
        cursor = conn.cursor()
        sql = "INSERT INTO data VALUES(now(), 1, 1.1, 1.2, 1.3)"
        cursor.execute(sql)
        conn.commit()
        conn.close()

    def select(self):
        conn = self.get_conn()
        cursor = conn.cursor()
        sql = "SELECT * FROM data"
        cursor.execute(sql)
        data = cursor.fetchone()
        conn.commit()
        conn.close()
        return data

if __name__ == '__main__':
    mxdb = MatrixDB()
    mxdb.create_table()
    mxdb.insert()
    print(mxdb.select())


3. Golang

Для подключения к MatrixDB с помощью Golang требуется пакет github.com/lib/pq.

Пример кода:

package main

import (
    "database/sql"
    "fmt"
    "time"

    _ "github.com/lib/pq"
)

type Data struct {
    Time     time.Time
    TagId    int32
    Metrics1 float64
    Metrics2 float64
    Metrics3 float64
}

func getConn() (*sql.DB, error) {
    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", "127.0.0.1", 5432, "mxadmin", "", "mxadmin")

    db, err := sql.Open("postgres", psqlInfo)
    if err != nil {
        return nil, err
    }

    return db, nil
}

func createTable() error {
    db, _ := getConn()
    defer db.Close()

    _, err := db.Exec(`
CREATE TABLE data(
    time timestamp,
    tag_id int,
    metrics1 float8,
    metrics2 float8,
    metrics3 float8
)Distributed by(tag_id)
`)
    return err
}

func insertData() error {
    db, _ := getConn()
    defer db.Close()

    _, err := db.Exec(`INSERT INTO data VALUES(now(), 1, 1.1, 1.2, 1.3)`)
    return err
}

func selectData() ([]Data, error) {
    db, _ := getConn()
    defer db.Close()

    datas := make([]Data, 0)
    rows, err := db.Query(`SELECT * FROM data`)
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    for rows.Next() {
        data := Data{}
        err = rows.Scan(&data.Time, &data.TagId, &data.Metrics1, &data.Metrics2, &data.Metrics3)
        if err != nil {
            return nil, err
        }
        datas = append(datas, data)
    }

    return datas, err
}

func main() {
    createTable()
    insertData()
    datas, _ := selectData()
    fmt.Println(datas)
}


4. C

Для подключения к MatrixDB с помощью C необходимо использовать библиотеку libpq. Эта библиотека устанавливается вместе с MatrixDB и находится в каталоге $GPHOME.

При компиляции укажите пути к заголовочным файлам и библиотекам:

gcc -I $GPHOME/include -L $GPHOME/lib -lpq main.c -o main

Пример кода:

#include <stdio.h>
#include "libpq-fe.h"

void PQresultPrint(PGresult *res)
{
    int nFields = PQnfields(res);
    int nTuples = PQntuples(res);
    int i, j;
    for (i = 0; i < nTuples; i++)
    {
        for (j = 0; j < nFields; j++)
        {
            printf("%s ", PQgetvalue(res, i, j));
        }
        printf("\n");
    }
}

PGconn *GetConn()
{
    PGconn *conn;
    char str[128];

    sprintf(str, "host=%s port=%d dbname=%s user=%s password=%s",
            "127.0.0.1",
            5432,
            "mxadmin",
            "mxadmin",
            "abcd"
            );

    // Establish connection
    conn = PQconnectdb(str);
    if (PQstatus(conn) == CONNECTION_BAD)
    {
        fprintf(stderr, "Failed to connect to database!");
        fprintf(stderr, "%s", PQerrorMessage(conn));
        return NULL;
    }
    return conn;
}

PGresult *ExecuteQuery(const char *query)
{
    PGconn *conn;
    PGresult *res;

    conn = GetConn();
    if (conn == NULL)
        return NULL;

    // Execute SQL
    res = PQexec(conn, query);
    if (PQresultStatus(res) == PGRES_FATAL_ERROR)
    {
        fprintf(stderr, "%s", PQerrorMessage(conn));
        return NULL;
    }

    PQfinish(conn);
    return res;
}

PGresult *CreateTable()
{
    const char *sql =
"CREATE TABLE data \
( \
    time timestamp, \
    tag_id int, \
    metrics1 float8, \
    metrics2 float8, \
    metrics3 float8 \
)Distributed by(tag_id)";
    return ExecuteQuery(sql);
}

PGresult *InsertData()
{
    const char *sql = "INSERT INTO data VALUES(now(), 1, 1.1, 1.2, 1.3)";
    return ExecuteQuery(sql);
}

PGresult *SelectData()
{
    const char *sql = "SELECT * FROM data";
    return ExecuteQuery(sql);
}

int main()
{
    PGresult *res;
    res = CreateTable();
    if (res != NULL)
        PQclear(res);
    res = InsertData();
    if (res != NULL)
        PQclear(res);
    res = SelectData();
    if (res != NULL) {
        PQresultPrint(res);
        PQclear(res);
    }
    return 0;
}