Size: a a a

2020 November 11

AS

Andrei 🦉 Sergeev in Tarantool
Nikolay
Всем привет. Уже не знаю куда написать, возможно тут мне смогут помочь...
Пишу на GO. Использую https://github.com/tarantool/go-tarantool .

// User Model
type User struct {
 ID      *uint64          json:"id" binding:"required"
 TelegramId  int64           json:"telegram_id" binding:"required"
 Email       string           json:"email" binding:"required"
 Password  string           json:"password" binding:"required"
 Settings    string          json:"settings" binding:"required"
}

//SELECT
var users models.User
err = conn.CallAsync("box.execute", []interface{}{"SELECT * FROM USERS WHERE ID=11"}).GetTyped(&users)
 if err != nil {
   fmt.Println(err)
 }
fmt.Println(users.String())

Не может произойти декодирование в структуру. Может я делаю что-то не так? Подскажите пожалуйста.
Результат выдаваемый:
msgpack: invalid code 91 decoding uint64
{0xc0001a6e70 0   }

Убираю из структуры ID, результат:
msgpack: invalid code 91 decoding int64
{0   }

Обязательно использование SQL потому что LUA игнорирует FK, заранее спасибо!
библиотека msgpack, которая используется в коннекторе, игнорирует тэги json
нужно в тэгах структуры описать поля с тэгом msgpack, например msgpack:"id"
источник

AT

Alexander Turenko in Tarantool
Я подозреваю, что дело в том, что box.execute возвращает rows и metadata.
источник

N

Nikolay in Tarantool
Andrei 🦉 Sergeev
библиотека msgpack, которая используется в коннекторе, игнорирует тэги json
нужно в тэгах структуры описать поля с тэгом msgpack, например msgpack:"id"
Ещё варианты?)
источник

N

Nikolay in Tarantool
Alexander Turenko
Я подозреваю, что дело в том, что box.execute возвращает rows и metadata.
Возможно, но почему если полностью копируешь пример с github то всё работает?)
источник

KO

Konstantin Osipov in Tarantool
Nikolay
Всем привет. Уже не знаю куда написать, возможно тут мне смогут помочь...
Пишу на GO. Использую https://github.com/tarantool/go-tarantool .

// User Model
type User struct {
 ID      *uint64          json:"id" binding:"required"
 TelegramId  int64           json:"telegram_id" binding:"required"
 Email       string           json:"email" binding:"required"
 Password  string           json:"password" binding:"required"
 Settings    string          json:"settings" binding:"required"
}

//SELECT
var users models.User
err = conn.CallAsync("box.execute", []interface{}{"SELECT * FROM USERS WHERE ID=11"}).GetTyped(&users)
 if err != nil {
   fmt.Println(err)
 }
fmt.Println(users.String())

Не может произойти декодирование в структуру. Может я делаю что-то не так? Подскажите пожалуйста.
Результат выдаваемый:
msgpack: invalid code 91 decoding uint64
{0xc0001a6e70 0   }

Убираю из структуры ID, результат:
msgpack: invalid code 91 decoding int64
{0   }

Обязательно использование SQL потому что LUA игнорирует FK, заранее спасибо!
скорее всего бага в go driver, или фичи такой нет - например не умеет по поинтеру декодировать
источник

N

Nikolay in Tarantool
Konstantin Osipov
скорее всего бага в go driver, или фичи такой нет - например не умеет по поинтеру декодировать
убирал id *uint64, и переписывал select на все поля кроме ID, результат тот же, только ругается на декодирование следующего поля
источник

N

Nikolay in Tarantool
Мне удалось распарсить приходящую структуру, но это был дикий костыль...
var users models.User
 var mapa interface{}
 err = conn.CallAsync("box.sql.execute", []interface{}{"SELECT * FROM USERS WHERE ID=11"}).GetTyped(&users)
 if err != nil {
   fmt.Println(err)
 }
 res := strings.Split(strings.ReplaceAll(strings.ReplaceAll(strings.Split(fmt.Sprintf("%v", mapa), "rows:")[1], "[", ""), "]", ""), " ")
 ID, err := strconv.ParseUint(res[0], 0, 64)
 users.ID = &ID
 users.TelegramId, err = strconv.ParseInt(res[1], 0, 64)
 users.Email = res[2]
 users.Password = res[3]
 users.Settings = res[4]

Хочется по-человечески
источник

N

Nikolay in Tarantool
GetTyped(&users) => getTyped(&mapa)
источник

AS

Andrei 🦉 Sergeev in Tarantool
Nikolay
Мне удалось распарсить приходящую структуру, но это был дикий костыль...
var users models.User
 var mapa interface{}
 err = conn.CallAsync("box.sql.execute", []interface{}{"SELECT * FROM USERS WHERE ID=11"}).GetTyped(&users)
 if err != nil {
   fmt.Println(err)
 }
 res := strings.Split(strings.ReplaceAll(strings.ReplaceAll(strings.Split(fmt.Sprintf("%v", mapa), "rows:")[1], "[", ""), "]", ""), " ")
 ID, err := strconv.ParseUint(res[0], 0, 64)
 users.ID = &ID
 users.TelegramId, err = strconv.ParseInt(res[1], 0, 64)
 users.Email = res[2]
 users.Password = res[3]
 users.Settings = res[4]

Хочется по-человечески
выше же написали, что execute возвращает массив с 2 переменными в результате, поэтому в одну структуру оно распаковываться не будет
источник

AS

Andrei 🦉 Sergeev in Tarantool
попробуйте вот так
result := []interface{}{models.User{}, map[string]interface{}{}}
err = conn.CallAsync("box.execute", []interface{}{"SELECT * FROM USERS WHERE ID=11"}).GetTyped(&result)
 if err != nil {
   fmt.Println(err)
 }
источник

N

Nikolay in Tarantool
Во втором случае удалил ID из структуры
источник

N

Nikolay in Tarantool
Если CallAsync поменять на Call17Async то ошибок нет, но результат такой же
источник

AP

Alex Profitov in Tarantool
Можно попробовать создать отдельную структуру например userRaw в которой реализован декодинг из тарантула и ее уже мапить в реальную структуру user
источник

MA

Mons Anderson in Tarantool
Alexander Turenko
Любопытно. Стандартный хак, который работает для msgpack, не катит для json: json.encode(ffi.cast('double', 1)). Фиксится просто, но не стрипает незначащие нули; вероятно, влияет на что-то еще и, возможно, должно быть под опцией.

diff --git a/src/lib/core/util.c b/src/lib/core/util.c
index dfce317f0..fa30f45e7 100644
--- a/src/lib/core/util.c
+++ b/src/lib/core/util.c
@@ -330,8 +330,8 @@ json_escape(char *buf, int size, const char *data)
}

const char *precision_fmts[] = {
-       "%.0lg", "%.1lg", "%.2lg", "%.3lg", "%.4lg", "%.5lg", "%.6lg", "%.7lg",
-       "%.8lg", "%.9lg", "%.10lg", "%.11lg", "%.12lg", "%.13lg", "%.14lg"
+       "%.0lf", "%.1lf", "%.2lf", "%.3lf", "%.4lf", "%.5lf", "%.6lf", "%.7lf",
+       "%.8lf", "%.9lf", "%.10lf", "%.11lf", "%.12lf", "%.13lf", "%.14lf"
};

void
А ещё экранирование прямого слэша спилить бы :)
источник

NM

Nikita Makarov in Tarantool
Alexander Turenko
Любопытно. Стандартный хак, который работает для msgpack, не катит для json: json.encode(ffi.cast('double', 1)). Фиксится просто, но не стрипает незначащие нули; вероятно, влияет на что-то еще и, возможно, должно быть под опцией.

diff --git a/src/lib/core/util.c b/src/lib/core/util.c
index dfce317f0..fa30f45e7 100644
--- a/src/lib/core/util.c
+++ b/src/lib/core/util.c
@@ -330,8 +330,8 @@ json_escape(char *buf, int size, const char *data)
}

const char *precision_fmts[] = {
-       "%.0lg", "%.1lg", "%.2lg", "%.3lg", "%.4lg", "%.5lg", "%.6lg", "%.7lg",
-       "%.8lg", "%.9lg", "%.10lg", "%.11lg", "%.12lg", "%.13lg", "%.14lg"
+       "%.0lf", "%.1lf", "%.2lf", "%.3lf", "%.4lf", "%.5lf", "%.6lf", "%.7lf",
+       "%.8lf", "%.9lf", "%.10lf", "%.11lf", "%.12lf", "%.13lf", "%.14lf"
};

void
Прошу прощения, не очень понял сообщение, можно немного подробнее?
Как превентить каст double внутри сложного json'а?
источник

AT

Alexander Turenko in Tarantool
Nikita Makarov
Прошу прощения, не очень понял сообщение, можно немного подробнее?
Как превентить каст double внутри сложного json'а?
Я не нашел способа.
источник

NM

Nikita Makarov in Tarantool
источник

NM

Nikita Makarov in Tarantool
Похоже с json'а надо переезжать
источник

AK

Alexey Kuzin in Tarantool
Если что, вы можете хранить в спейсе таблицы, а не жисоны
источник

AS

Anatoliy Shipitcyn in Tarantool
Nikita Makarov
Прошу прощения, не очень понял сообщение, можно немного подробнее?
Как превентить каст double внутри сложного json'а?
только через json schema
источник