Страница 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
для меня это проблема
у меня нет аккаунта на гитхабе
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 добавили.
Если вы про эти
пасхалки с самого начала знали, то к чему весь этот цирк от вас был? Идея ж и была, ваша проблема, вы в ней и разбираетесь, в том числе в пасхалках, но вы включили режим гения который не может зарегистрироваться на гитхабе.