Страница 1 из 2

2.0.14x , опять json и null

Добавлено: 2018.03.03, 13:40
sm-vasya
Друзья и коллеги, всем доброе время суток.

столкнулся со следующей проблемой.

есть модель у которой аттрибут (допустим attr1) в бд PgSQL имеет тип json (или jsonb)

так вот. если мне надо присвоить ему значение NULL, то это значение так же енкодится, и в бд ложится null::json

со всеми вытекающими проблемами, а именно например SQL конструкция attr1 IS NULL , attr1 IS NOT NULL и др - не сработают, потому что null::json != NULL

такое поведение замечено и с валидатором default, и с new JsonExtension(null), и непосредственно с $model->attr1 = null

считаю правильным енкодить нулл только с $model->attr1 = new JsonExtension(null), если же $model->attr1 = null - то в бд должно ложится именно NULL

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.03, 14:00
sm-vasya
пс. до появления JsonExtension все работало правильно, $model->attr1 = null сохраняло NULL

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.03, 14:16
chesar
Зарепорть ишку на гитхабе

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.04, 10:40
maleks
sm-vasya писал(а): 2018.03.03, 14:00 пс. до появления JsonExtension все работало правильно, $model->attr1 = null сохраняло NULL
JsonExpression ;)
И когда это правильно было, до 2.0.14?
считаю правильным енкодить нулл только с $model->attr1 = new JsonExtension(null), если же $model->attr1 = null - то в бд должно ложится именно NULL
Сейчас они автоматом через JsonExpression проганяют, т.е. не самому это делать, поэтому нет маркера как судить надо не надо. Вот вы null значения хотите в SQL NULL, а вдруг в базе стоит столбцу NOT NULL. И 'null' кстати валидный json.

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.04, 11:24
Nex-Otaku
Если в БД в колонку JSON можно записать SQL NULL, то должен быть адекватный и простой способ сделать это из Yii. Об этом должны позаботиться разработчики Yii.

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.04, 21:11
sm-vasya
maleks писал(а): 2018.03.04, 10:40
sm-vasya писал(а): 2018.03.03, 14:00 пс. до появления JsonExtension все работало правильно, $model->attr1 = null сохраняло NULL
JsonExpression ;)
И когда это правильно было, до 2.0.14?
считаю правильным енкодить нулл только с $model->attr1 = new JsonExtension(null), если же $model->attr1 = null - то в бд должно ложится именно NULL
Сейчас они автоматом через JsonExpression проганяют, т.е. не самому это делать, поэтому нет маркера как судить надо не надо. Вот вы null значения хотите в SQL NULL, а вдруг в базе стоит столбцу NOT NULL. И 'null' кстати валидный json.
что-то по-моему глупость Вы написали

а я гдето говорил что null это не валидный json ?

если я в БД хочу положить NULL, то наверное я знаю что хочу, а если я не знаю то это знает валидатор "реквайед" например, а NOT NULL в данном случае к JsonExpression не имеет никакого отношения, не его собачье дело NOT NULL в бд или не NOT NULL


пс. если attr1 типа string - по вашему тогда в БД для него правильно строку 'null' записывать :) ? и да, скажите что ложится в бд если в атрибуты с другими типами сейчас NULL хочешь положить...

для справки
NULL != 'null'::varchar
NULL != 0
NULL != 0.0
и тд...

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.04, 22:37
samdark
Кидайте репорт на github, но сначала попробуйте master и посмотрите changelog для 2.0.14.1 и 2.0.14.2.

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.05, 00:31
sm-vasya
https://github.com/yiisoft/yii2/blob/2. ... ma.php#L40
https://github.com/yiisoft/yii2/blob/2. ... ma.php#L67

заменил у себя на
return ($value === null ? null : new JsonExpression($value, $this->type));
стало корректно отрабатывать $model->attr = null

но для "фаст способа" сделать null::json видимо придется сделать константу чтото типа JSON_NULL || NULL_JSON

я еще подозреваю что и с массивами значений тоже самое придется править, но не пробовал, поэтому не утверждаю

https://github.com/yiisoft/yii2/blob/2. ... ma.php#L37
https://github.com/yiisoft/yii2/blob/2. ... ma.php#L64
return ($value === null ? null : new ArrayExpression($value, $this->dbType, $this->dimension));

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.05, 09:31
maleks
sm-vasya писал(а): 2018.03.05, 00:31 заменил у себя на
return ($value === null ? null : new JsonExpression($value, $this->type));
стало корректно отрабатывать $model->attr = null
Я вам как раз про это и намекал, чтобы вы разобрались подробнее в проблеме, у других с этим тоже затыки, но уже другие, т.к. если просто сделать вот так очевидно как выше($value === null ? null), чтобы не пропустить:
sm-vasya писал(а): 2018.03.05, 00:31 но для "фаст способа" сделать null::json видимо придется сделать константу чтото типа JSON_NULL || NULL_JSON
Теперь когда вы разобрались в картине, можете создать там issue

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.08, 00:18
sm-vasya
maleks писал(а): 2018.03.05, 09:31 Я вам как раз про это и намекал, чтобы вы разобрались подробнее в проблеме, у других с этим тоже затыки, но уже другие, т.к. если просто сделать вот так очевидно как выше($value === null ? null), чтобы не пропустить:
sm-vasya писал(а): 2018.03.05, 00:31 но для "фаст способа" сделать null::json видимо придется сделать константу чтото типа JSON_NULL || NULL_JSON
Теперь когда вы разобрались в картине, можете создать там issue
эммм..... наверное я слишком глуп, туп и слеп, чтоб не найти в вашем сообщении такой глубокий намек. но если бы вы прочитали заголовок топика то увидели бы в нем слово "опять" которое означает что это еще один очередной топик но все про тот же самый json, а поскольку проблема другая, то и топик другой ... я надеюсь у меня получилось сказать короткую мысль "я ознакомился с другими топиками прежде чем написать" ?

ну и конечно же спасибо за ваш "намек", потому что без него я бы конечно же не смог разобраться в "картине". так и просидел бы еще полгода-год как минимум пока 2.1 не появилась бы

пс. я как всегда в позитиве, это сарказм

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.08, 01:00
sm-vasya
maleks писал(а): 2018.03.05, 09:31 Теперь когда вы разобрались в картине, можете создать там issue
для меня это проблема :( у меня нет аккаунта на гитхабе :oops:

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.08, 01:09
samdark
Заведите. Всё-равно придётся рано или поздно для работы.

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.09, 13:08
sm-vasya
samdark писал(а): 2018.03.08, 01:09 Заведите. Всё-равно придётся рано или поздно для работы.
чем дальше тем больше рабочий инструмент типа "блокнот" и "карандаш" вытесняет все остальное

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.09, 13:11
sm-vasya
samdark писал(а): 2018.03.04, 22:37 Кидайте репорт на github, но сначала попробуйте master и посмотрите changelog для 2.0.14.1 и 2.0.14.2.
видимо про массивы поправили в 2.0.14.2:
Bug: Fixed encoding of empty yii\db\ArrayExpression for PostgreSQL (silverfire)

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.09, 16:07
samdark
Не вытесняет, если нужно писать код и в компании код на github (что часто).

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.09, 16:48
sm-vasya
samdark писал(а): 2018.03.09, 16:07 Не вытесняет, если нужно писать код и в компании код на github (что часто).
код то писать нужно, только чем больше человек в подчинении, тем меньше пишешь код, и больше занимаешься административными вопросами. потому что сначала руководишь одним разработчиком, потом 5, потом 10, потом руководишь тимлидами, рук проектами, потом руководишь начальниками отделов, руководителями департаментов .... генеральными директорами холдинга.... так вот если руководишь тимлидами - то еще общаешься про программирование, а дальше в основном позадачно, только как опытный эксперт вмешиваешься в момент прохода реперных точек или разруливания ситуаций, и то "по желанию"

а вот про гитхаб не согласен, его используют по большей части компании у которых нет собственной инфраструктуры, поэтому они и используют сторонние сервисы. не представляю чтоб одноклассники или вконтакте хранились на гитхабе. да и компании гораздо поменьше так же ставят свои гитлабы, на свои сервера.

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.09, 18:03
maleks
deleted as not relevant

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.10, 15:26
maleks
В 2.0.14 был оказывается добавлен ExpressionInterface, так что с самого начала NULL присвоить, если надо, можно как

Код: Выделить всё

$obj->attr = new \yii\db\Expression('NULL');

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.11, 23:33
sm-vasya
maleks писал(а): 2018.03.10, 15:26 В 2.0.14 был оказывается добавлен ExpressionInterface, так что с самого начала NULL присвоить, если надо, можно как

Код: Выделить всё

$obj->attr = new \yii\db\Expression('NULL');
я точно не помню, но если не ошибаюсь то еще до 2.0.4 а не 2.0.14 существовал \yii\db\Expression,

Re: 2.0.14x , опять json и null

Добавлено: 2018.03.12, 08:27
maleks
sm-vasya писал(а): 2018.03.11, 23:33 я точно не помню, но если не ошибаюсь то еще до 2.0.4 а не 2.0.14 существовал \yii\db\Expression,
Я по русски вроде же говорил о "добавлен ExpressionInterface", а не \yii\db\Expression.
Expression раньше применялся чисто для QueryBuilder-а чтобы строить запрос без экранирования кусков. Про использование их с AR или DAO, в доках не было ни слова, только сейчас что то в пример с upsert добавили.
Если вы про эти пасхалки с самого начала знали, то к чему весь этот цирк от вас был? Идея ж и была, ваша проблема, вы в ней и разбираетесь, в том числе в пасхалках, но вы включили режим гения который не может зарегистрироваться на гитхабе.