2.0.14x , опять json и null

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

2.0.14x , опять json и null

Сообщение sm-vasya » 2018.03.03, 13:40

Друзья и коллеги, всем доброе время суток.

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

есть модель у которой аттрибут (допустим 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

sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

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

Сообщение sm-vasya » 2018.03.03, 14:00

пс. до появления JsonExtension все работало правильно, $model->attr1 = null сохраняло NULL

chesar
Сообщения: 512
Зарегистрирован: 2013.04.10, 17:49

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

Сообщение chesar » 2018.03.03, 14:16

Зарепорть ишку на гитхабе

Аватара пользователя
maleks
Сообщения: 1722
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение 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.

Nex-Otaku
Сообщения: 825
Зарегистрирован: 2016.07.09, 21:07

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

Сообщение Nex-Otaku » 2018.03.04, 11:24

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

sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

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

Сообщение sm-vasya » 2018.03.04, 21:11

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
и тд...

Аватара пользователя
samdark
Администратор
Сообщения: 9105
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark » 2018.03.04, 22:37

Кидайте репорт на github, но сначала попробуйте master и посмотрите changelog для 2.0.14.1 и 2.0.14.2.

sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

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

Сообщение sm-vasya » 2018.03.05, 00:31

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));

Аватара пользователя
maleks
Сообщения: 1722
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение maleks » 2018.03.05, 09:31

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

sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

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

Сообщение sm-vasya » 2018.03.08, 00:18

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 не появилась бы

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

sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

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

Сообщение sm-vasya » 2018.03.08, 01:00

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

Аватара пользователя
samdark
Администратор
Сообщения: 9105
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark » 2018.03.08, 01:09

Заведите. Всё-равно придётся рано или поздно для работы.

sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

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

Сообщение sm-vasya » 2018.03.09, 13:08

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

sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

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

Сообщение sm-vasya » 2018.03.09, 13:11

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)

Аватара пользователя
samdark
Администратор
Сообщения: 9105
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark » 2018.03.09, 16:07

Не вытесняет, если нужно писать код и в компании код на github (что часто).

sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

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

Сообщение sm-vasya » 2018.03.09, 16:48

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

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

Аватара пользователя
maleks
Сообщения: 1722
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение maleks » 2018.03.09, 18:03

deleted as not relevant
Последний раз редактировалось maleks 2018.03.13, 08:02, всего редактировалось 2 раза.

Аватара пользователя
maleks
Сообщения: 1722
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение maleks » 2018.03.10, 15:26

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

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

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

sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

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

Сообщение sm-vasya » 2018.03.11, 23:33

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,

Аватара пользователя
maleks
Сообщения: 1722
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение maleks » 2018.03.12, 08:27

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

Ответить