Size: a a a

2020 July 27

GS

Gleb Selyukov in Tarantool
Добрый вечер, возможно ли задать колонке дефолтные значения?
К примеру, если мы используем upsert, то при вставке в поле created_at добавлять по аналогии с PG - TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
А при update записи обновлять колонку updated_at также на текущее время.

Я так понимаю сделать это легко передавая всегда текущую дату и записывая в updated_at, а вот created_at обновлять с помощью триггера, но проблема в том, что в документации не смог найти триггер на insert

Вопрос: можно ли колонке задать дефолтное значение в виде функции? Например os.time(os.date("!*t"))

Заранее благодарю за помощь и понимание
источник

MA

Mons Anderson in Tarantool
> не смог найти триггер на insert
все триггеры обобщены одним: on_replace. он вызывается для любой операции.
источник

P

Pavel in Tarantool
Привет.
Ребята, расскажите, пожалуйста, как жить, когда три реплики трех разных репликасетов и 1 роутер нужно переместить в новое место?
Машину, на которой это все развернуто, будут выводить из эксплуатации, IP адрес на новом месте будет другой.

У меня из мыслей только сделать expel всех этих реплик, перед этим переключив лидерство, но вот не знаю, может есть 100 проц рецепт?
источник

PL

Pavel Lapaev in Tarantool
Регистрируйтесь на https://team.mail.ru/event/763/

@a_lyapunov выступает с докладом "Small: Specialized Memory ALLocators"

Tarantool — in-memory СУБД, поэтому просто обязан работать с памятью быстро и стабильно. В частности, чтобы быстро аллоцировать динамическую память, командой разработчиков Тарантула был написан целый выводок различных аллокаторов. В докладе будет рассказано об устройстве и назначении каждого из этих аллокаторов.
источник

YD

Yaroslav Dynnikov in Tarantool
Pavel
Привет.
Ребята, расскажите, пожалуйста, как жить, когда три реплики трех разных репликасетов и 1 роутер нужно переместить в новое место?
Машину, на которой это все развернуто, будут выводить из эксплуатации, IP адрес на новом месте будет другой.

У меня из мыслей только сделать expel всех этих реплик, перед этим переключив лидерство, но вот не знаю, может есть 100 проц рецепт?
Мы как раз готовим секцию траблшутинг, с этой темой в т.ч. Я поделюсь как будет готово
источник

GS

Gleb Selyukov in Tarantool
Mons Anderson
> не смог найти триггер на insert
все триггеры обобщены одним: on_replace. он вызывается для любой операции.
То есть это единственный вариант для реализации автовставки дефолтного времени?
Очень прошу, можно пожалуйста привести пример реализации on_replace триггера с добавлением в new состояние данных?

Вот такой вариант не работает:

function trigger_on_insert(old, new, s, op)
   if op == "INSERT" then
       new[2] = "asd"
   end

   return new
end

box.space.some_space:on_replace(trigger_on_insert)
источник

MA

Mons Anderson in Tarantool
Gleb Selyukov
То есть это единственный вариант для реализации автовставки дефолтного времени?
Очень прошу, можно пожалуйста привести пример реализации on_replace триггера с добавлением в new состояние данных?

Вот такой вариант не работает:

function trigger_on_insert(old, new, s, op)
   if op == "INSERT" then
       new[2] = "asd"
   end

   return new
end

box.space.some_space:on_replace(trigger_on_insert)
вот это не работает:
new[2] = "asd"

t= new:totable() t[2] = "asd" return box.tuple.new( t )
источник

MA

Mons Anderson in Tarantool
function trigger(old, new, s, op)
   if op == "INSERT" then
       local t = new:totable()
       t[2] = "asd"
       return box.tuple.new( t )
   end
   return
end
источник

GS

Gleb Selyukov in Tarantool
Mons Anderson
function trigger(old, new, s, op)
   if op == "INSERT" then
       local t = new:totable()
       t[2] = "asd"
       return box.tuple.new( t )
   end
   return
end
Я понял ошибку, спасибо огромное, но все равно не срабатывает

function trigger_on_insert(old, new, s, op)
   if op == "INSERT" then
       local t = new:totable()
       t[2] = "asd"
       return
box.tuple.new( t )
   end
   return
end

box.space.some_space:on_replace(trigger_on_insert)
box.space.some_space:run_triggers(true)
box.space.some_space:insert{"test-key-1", "test-value-1"}
-- ['test-key-1', 'test-value-1']

box.space.some_space:select{"test-key-1"}
-- ['test-key-1', 'test-value-1']
источник

MA

Mons Anderson in Tarantool
Хм. А триггер вызывается?
источник

OK

Oleg Koshovetc in Tarantool
Gleb Selyukov
Я понял ошибку, спасибо огромное, но все равно не срабатывает

function trigger_on_insert(old, new, s, op)
   if op == "INSERT" then
       local t = new:totable()
       t[2] = "asd"
       return
box.tuple.new( t )
   end
   return
end

box.space.some_space:on_replace(trigger_on_insert)
box.space.some_space:run_triggers(true)
box.space.some_space:insert{"test-key-1", "test-value-1"}
-- ['test-key-1', 'test-value-1']

box.space.some_space:select{"test-key-1"}
-- ['test-key-1', 'test-value-1']
у вас могли в принципе старые тригеры остаться, которые работали неправильно
можете скинуть выхлоп
box.space.some_space:on_replace()
?
источник

GS

Gleb Selyukov in Tarantool
Да я бы с радостью посмотрел, но увы, методы дебага луа внутри тарантула мне не известны.
Тот же print не срабатывает в функциях и я не в курсе, должен ли вообще срабатывать, если подключаться через tarantoolctl
источник

GS

Gleb Selyukov in Tarantool
Oleg Koshovetc
у вас могли в принципе старые тригеры остаться, которые работали неправильно
можете скинуть выхлоп
box.space.some_space:on_replace()
?
Поэтому я на новом спейсе специально создал этот триггер

Конечно, я могу дать что выводит в консоль и Вы увидите ссылку, но она вряд ли что-то даст
box.space.some_space:on_replace()
-- 'function: 0x402389f0'
источник

MA

Mons Anderson in Tarantool
Gleb Selyukov
Поэтому я на новом спейсе специально создал этот триггер

Конечно, я могу дать что выводит в консоль и Вы увидите ссылку, но она вряд ли что-то даст
box.space.some_space:on_replace()
-- 'function: 0x402389f0'
Позже отвечу
источник

GS

Gleb Selyukov in Tarantool
Mons Anderson
Позже отвечу
Нашел причину, спасибо огромное Вам и всем остальным.
Триггер on_replace не может заменять tuple, только before_replace может изменять состояние
источник

KN

Konstantin Nechaev in Tarantool
ребят, подскажите пожалуйста, как так может получаться:
вылетает  Tuple field 11 type does not match one required by operation: expected integer при этом перед вставкой идет преобразование tonumber(), потом подстановка дефолтного числа, если nil вышел, затем идет проверка на type(value) ~= 'number`, число не может быть и float (так как при нем не запись падает а дальнейшая работа с таблицей)), что может дать такую ошибку?
источник

MA

Mons Anderson in Tarantool
Gleb Selyukov
Нашел причину, спасибо огромное Вам и всем остальным.
Триггер on_replace не может заменять tuple, только before_replace может изменять состояние
Ох, точно, я что-то не сообразил, что у вас обычный, не before
источник

KN

Konstantin Nechaev in Tarantool
Konstantin Nechaev
ребят, подскажите пожалуйста, как так может получаться:
вылетает  Tuple field 11 type does not match one required by operation: expected integer при этом перед вставкой идет преобразование tonumber(), потом подстановка дефолтного числа, если nil вышел, затем идет проверка на type(value) ~= 'number`, число не может быть и float (так как при нем не запись падает а дальнейшая работа с таблицей)), что может дать такую ошибку?
tarantool/tarantool:1.10.3 тарантул из офиц репки с докером (Tarantool 1.10.3-0-g0b7078a93)
источник

MA

Mons Anderson in Tarantool
Покажите space:format()
источник

KN

Konstantin Nechaev in Tarantool
Mons Anderson
Покажите space:format()
space:format()
---
- []
...
источник