Skip to content

Commit 5efa985

Browse files
added examples for helper methods and fixed some review edits
1 parent 7284f55 commit 5efa985

File tree

5 files changed

+138
-74
lines changed

5 files changed

+138
-74
lines changed

dev-1/go/lesson-2.1/main.go

Lines changed: 0 additions & 73 deletions
This file was deleted.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11

22
.PHONY: run
33
run:
4-
go run main.go
4+
go run main.go
File renamed without changes.
File renamed without changes.

dev-1/lesson-2.1/go/main.go

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log"
6+
"time"
7+
8+
"github.com/ydb-platform/ydb-go-sdk/v3"
9+
"github.com/ydb-platform/ydb-go-sdk/v3/query"
10+
)
11+
12+
// author: Egor Danilov
13+
func main() {
14+
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
15+
defer cancel()
16+
17+
// Строка подключения к локальной базе данных YDB
18+
// Формат: grpc[s]://<хост>:<порт>/<путь к базе данных>
19+
dsn := "grpc://localhost:2136/local"
20+
21+
// Создаем драйвер для подключения к YDB через gRPC
22+
db, err := ydb.Open(ctx, dsn)
23+
if err != nil {
24+
log.Fatal(err)
25+
}
26+
defer db.Close(ctx)
27+
28+
type myStruct struct {
29+
Id int32 `sql:"id"`
30+
}
31+
var structId myStruct
32+
33+
queryCtx, txCancel := context.WithTimeout(context.Background(), 30*time.Second)
34+
defer txCancel()
35+
36+
// Ниже представлены примеры по обращению к клиенту для выполнения YQL запросов
37+
//
38+
// Query(), QueryResultSet() и QueryRow() являются хелперами для неинтерактивных транзакций
39+
// (т.е. когда транзакция завершается за одно обращение к серверу)
40+
// Ретраи тут происходят внутри, а наружу возвращается уже материализированный в памяти в результат,
41+
// Таймаутом транзакции можно управлять через контекст
42+
43+
result, err := db.Query().Query(queryCtx, "SELECT 1 as id");
44+
if err != nil {
45+
log.Fatal(err)
46+
}
47+
48+
rs, err := result.NextResultSet(queryCtx)
49+
if err != nil {
50+
log.Fatal(err)
51+
}
52+
53+
row, err := rs.NextRow(ctx)
54+
if err != nil {
55+
log.Fatal(err)
56+
}
57+
58+
// Материализуем результат
59+
if err = row.ScanStruct(&structId); err != nil {
60+
log.Fatal(err)
61+
}
62+
println(structId.Id)
63+
64+
// ======
65+
rs, err = db.Query().QueryResultSet(queryCtx, "SELECT 2 as id");
66+
if err != nil {
67+
log.Fatal(err)
68+
}
69+
70+
row, err = rs.NextRow(ctx)
71+
if err != nil {
72+
log.Fatal(err)
73+
}
74+
75+
// Материализуем результат
76+
if err = row.ScanStruct(&structId); err != nil {
77+
log.Fatal(err)
78+
}
79+
println(structId.Id)
80+
81+
// ======
82+
83+
row, err = db.Query().QueryRow(queryCtx, "SELECT 3 as id");
84+
if err != nil {
85+
log.Fatal(err)
86+
}
87+
88+
// Материализуем результат
89+
if err = row.ScanStruct(&structId); err != nil {
90+
log.Fatal(err)
91+
}
92+
println(structId.Id)
93+
94+
// ======
95+
96+
// Ниже представлен пример общего случая выполнения YQL запросов через метод Do
97+
// По типу ошибки, которую вернет лямбда op Operation, драйвер поймет, надо ретраить запрос или нет
98+
// За счет этого можно более гранулярно управлять ходом выполнения запроса и материализацией данных
99+
err = db.Query().Do(
100+
queryCtx,
101+
func(ctx context.Context, s query.Session) error {
102+
res, err := s.Query(ctx, "SELECT 4 as id;")
103+
104+
if err != nil {
105+
return err
106+
}
107+
108+
defer func() { _ = res.Close(ctx) }()
109+
110+
// Итерируемся по набору результатов
111+
for rs, err := range res.ResultSets(ctx) {
112+
if err != nil {
113+
return err
114+
}
115+
116+
// Итерируемся по строкам в каждом наборе результате
117+
for row, err := range rs.Rows(ctx) {
118+
if err != nil {
119+
return err
120+
}
121+
122+
// Материализуем результат
123+
if err = row.ScanStruct(&structId); err != nil {
124+
return err
125+
}
126+
}
127+
}
128+
return nil
129+
},
130+
query.WithIdempotent(),
131+
)
132+
if err != nil {
133+
log.Fatal(err)
134+
}
135+
136+
println(structId.Id)
137+
}

0 commit comments

Comments
 (0)