Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Зеркалирование
Управление ресурсами
Безопасность
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
В предыдущих разделах описывалось, как создавать таблицы и выполнять вставку данных и запросы с помощью psql в командной строке. Однако в реальной разработке разработчики обычно используют языки программирования для подключения к базе данных и выполнения операций DML и DDL. В данном разделе показано, как подключиться к MatrixDB и выполнять запросы на Java, Python, Golang и C.
MatrixDB совместим с протоколом передачи данных PostgreSQL. Следовательно, вы можете подключаться к нему теми же способами, что и к PostgreSQL.
Чтобы подключиться к 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);
}
}
}
}
}
Для подключения к 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())
Для подключения к 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)
}
Для подключения к 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;
}