@@ -6,24 +6,23 @@ import (
66 "time"
77
88 "github.com/ydb-platform/ydb-go-sdk/v3"
9- "github.com/ydb-platform/ydb-go-sdk/v3/query"
109)
1110
1211// author: Egor Danilov
1312func main () {
14- ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
13+ connectionCtx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
1514 defer cancel ()
1615
1716 // Строка подключения к локальной базе данных YDB
1817 // Формат: grpc[s]://<хост>:<порт>/<путь к базе данных>
1918 dsn := "grpc://localhost:2136/local"
2019
2120 // Создаем драйвер для подключения к YDB через gRPC
22- db , err := ydb .Open (ctx , dsn )
21+ db , err := ydb .Open (connectionCtx , dsn )
2322 if err != nil {
2423 log .Fatal (err )
2524 }
26- defer db .Close (ctx )
25+ defer db .Close (connectionCtx )
2726
2827 type myStruct struct {
2928 Id int32 `sql:"id"`
@@ -34,13 +33,13 @@ func main() {
3433 defer txCancel ()
3534
3635 // Ниже представлены примеры по обращению к клиенту для выполнения YQL запросов
37- //
36+ //
3837 // Query(), QueryResultSet() и QueryRow() являются хелперами для неинтерактивных транзакций
3938 // (т.е. когда транзакция завершается за одно обращение к серверу)
4039 // Ретраи тут происходят внутри, а наружу возвращается уже материализированный в памяти в результат,
4140 // Таймаутом транзакции можно управлять через контекст
4241
43- result , err := db .Query ().Query (queryCtx , "SELECT 1 as id" );
42+ result , err := db .Query ().Query (queryCtx , "SELECT 1 as id" )
4443 if err != nil {
4544 log .Fatal (err )
4645 }
@@ -50,88 +49,45 @@ func main() {
5049 log .Fatal (err )
5150 }
5251
53- row , err := rs .NextRow (ctx )
52+ row , err := rs .NextRow (connectionCtx )
5453 if err != nil {
5554 log .Fatal (err )
5655 }
5756
58- // Материализуем результат
57+ // Читаем результат
5958 if err = row .ScanStruct (& structId ); err != nil {
6059 log .Fatal (err )
6160 }
6261 println (structId .Id )
6362
6463 // ======
65- rs , err = db .Query ().QueryResultSet (queryCtx , "SELECT 2 as id" );
64+
65+ rs , err = db .Query ().QueryResultSet (queryCtx , "SELECT 2 as id" )
6666 if err != nil {
6767 log .Fatal (err )
6868 }
69-
70- row , err = rs .NextRow (ctx )
69+
70+ row , err = rs .NextRow (connectionCtx )
7171 if err != nil {
7272 log .Fatal (err )
7373 }
7474
75- // Материализуем результат
75+ // Читаем результат
7676 if err = row .ScanStruct (& structId ); err != nil {
7777 log .Fatal (err )
7878 }
7979 println (structId .Id )
8080
8181 // ======
8282
83- row , err = db .Query ().QueryRow (queryCtx , "SELECT 3 as id" );
83+ row , err = db .Query ().QueryRow (queryCtx , "SELECT 3 as id" )
8484 if err != nil {
8585 log .Fatal (err )
8686 }
8787
88- // Материализуем результат
88+ // Читаем результат
8989 if err = row .ScanStruct (& structId ); err != nil {
9090 log .Fatal (err )
9191 }
9292 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 )
13793}
0 commit comments