Size: a a a

2020 November 11

N

Nikolay in Tarantool
источник

N

Nikolay in Tarantool
Может ещё кто-то мысль подкинет?
источник

IL

Igor Latkin in Tarantool
Nikolay
Возвращаюсь к теме. Не прокатило так.
Написал функцию на LUA которая выполняет SQL и возвращает res.rows (без метадата)
Получаю такой интерфейс:
[[1 0 dmassltssev@mai.ru $2a$04$6X.Zlq0Dt.FyD4swXccHfeyTzMWUevrMmnlzS4kcQCCrtpgrIXAJO testSEttings]]
При замене интерфейса, на структуру:

type User struct {
ID     uint      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"
}

Результат прежний:
msgpack: invalid code 91 decoding uint64
{0 0   }
на сколько я знаю
из sql по протоколу прилетают таплы просто массивами и задача клиента уже обработать метадату и сформировать мапки
поэтому чтобы вы смогли распарсить в структуру гошную вам из своей функции на луа надо не просто rows вернуть
а луа таблицы с ключами-значениями вызвав для каждой строки из rows :tomap({names_only=true})
источник

ОБ

Олег Бабин in Tarantool
В sql rows вроде таплы без формата names_only не прокатит
источник

IL

Igor Latkin in Tarantool
тогда сформировать словари в луа самостоятельно
источник

IL

Igor Latkin in Tarantool
короче говоря у вас в го нет вообще никакой информации об именовании полей таплов вернувшихся и поэтому он и не сможет ничего распарсить
источник

IL

Igor Latkin in Tarantool
поэтому либо должна быть поддержка на уровне клиента гошного sql чтобы он метадату учитывал либо самому отправлять данные которые можно распарсить
источник

IL

Igor Latkin in Tarantool
либо вот в ридми по го тарантулу
/* same effect in a "magic" way, but slower */
type Tuple2 struct {
_msgpack struct{} msgpack:",asArray"

Cid     uint
Orig    string
Members []Member
}

указать еще поле _msgpack чтобы он пытался парсить как массив
источник

N

Nikolay in Tarantool
Igor Latkin
на сколько я знаю
из sql по протоколу прилетают таплы просто массивами и задача клиента уже обработать метадату и сформировать мапки
поэтому чтобы вы смогли распарсить в структуру гошную вам из своей функции на луа надо не просто rows вернуть
а луа таблицы с ключами-значениями вызвав для каждой строки из rows :tomap({names_only=true})
:tomap помог, спасибо!
источник

RV

Ruslan Valitov in Tarantool
Добрый день. Подскажите пожалуйста, в коде lua нужно получить значение из таблицы, как правильнее выполнять запрос id = box.execute([[SELECT id FROM table1 WHERE x=:x;]],{{[':x']=1}}) или id =  box.execute("select id from table1 where x="..value_x)  ? И какой тип данных я получу в переменную id? Таблицу?
источник

S

Sergey in Tarantool
Наверняка таблица будет, вообще log.info в консоль поможет понять что там)
источник

RV

Ruslan Valitov in Tarantool
Ну наверняка в ответ может вернуть более чем одну строку 🤔
источник

N

Nikolay in Tarantool
Ruslan Valitov
Добрый день. Подскажите пожалуйста, в коде lua нужно получить значение из таблицы, как правильнее выполнять запрос id = box.execute([[SELECT id FROM table1 WHERE x=:x;]],{{[':x']=1}}) или id =  box.execute("select id from table1 where x="..value_x)  ? И какой тип данных я получу в переменную id? Таблицу?
Да, таблицу
источник

RV

Ruslan Valitov in Tarantool
Nikolay
Да, таблицу
Спасибо.
источник

N

Nikolay in Tarantool
Nikolay
:tomap помог, спасибо!
Может кому пригодится решение подобной проблемы!

local funcBody = [[function(sql)
       local sqlres,err = box.execute(sql)
       if err~=nil then
           return err
       end
       local result = {}
       if sqlres.rows ~=nil then
           for v=1, #sqlres.rows do
               table.insert(result, sqlres.rows[v]:tomap())
           end    
           return result  
       end
       if sqlres.autoincrement_ids ~= nil then
           return sqlres.autoincrement_ids
       end
       return sqlres.row_count            
   end ]]
источник

S

Sergey in Tarantool
Может удобнее юзать готовую ORB какую-нибудь с поддержкой моделей итп итд?
источник

VG

Vladislav Grubov in Tarantool
Nikolay
Может кому пригодится решение подобной проблемы!

local funcBody = [[function(sql)
       local sqlres,err = box.execute(sql)
       if err~=nil then
           return err
       end
       local result = {}
       if sqlres.rows ~=nil then
           for v=1, #sqlres.rows do
               table.insert(result, sqlres.rows[v]:tomap())
           end    
           return result  
       end
       if sqlres.autoincrement_ids ~= nil then
           return sqlres.autoincrement_ids
       end
       return sqlres.row_count            
   end ]]
Слушайте, а почему вы ходите из го в луа, а там запускаете SQL? Почему не делать все в луа, или все в SQL?
источник

R

R-omk in Tarantool
Vladislav Grubov
Слушайте, а почему вы ходите из го в луа, а там запускаете SQL? Почему не делать все в луа, или все в SQL?
Видимо потому что на луа писать влом когда есть sql, а поддержки sql в драйаере го нету
источник

N

Nikolay in Tarantool
Потому что LUA игнорирует FK
источник

N

Nikolay in Tarantool
Если у тебя в другой таблице fk на user_id, то при вставке из lua ты вставишь запись, даже если у тебя нет юзеров, а SQL будет ругаться
источник