2.0.14x , опять json и null
2.0.14x , опять json и null
Друзья и коллеги, всем доброе время суток.
столкнулся со следующей проблемой.
есть модель у которой аттрибут (допустим 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
столкнулся со следующей проблемой.
есть модель у которой аттрибут (допустим 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
пс. до появления JsonExtension все работало правильно, $model->attr1 = null сохраняло NULL
Re: 2.0.14x , опять json и null
Зарепорть ишку на гитхабе
Re: 2.0.14x , опять json и null
JsonExpression
И когда это правильно было, до 2.0.14?
Сейчас они автоматом через JsonExpression проганяют, т.е. не самому это делать, поэтому нет маркера как судить надо не надо. Вот вы null значения хотите в SQL NULL, а вдруг в базе стоит столбцу NOT NULL. И 'null' кстати валидный json.считаю правильным енкодить нулл только с $model->attr1 = new JsonExtension(null), если же $model->attr1 = null - то в бд должно ложится именно NULL
Re: 2.0.14x , опять json и null
Если в БД в колонку JSON можно записать SQL NULL, то должен быть адекватный и простой способ сделать это из Yii. Об этом должны позаботиться разработчики Yii.
Re: 2.0.14x , опять json и null
что-то по-моему глупость Вы написалиmaleks писал(а): ↑2018.03.04, 10:40JsonExpression
И когда это правильно было, до 2.0.14?
Сейчас они автоматом через JsonExpression проганяют, т.е. не самому это делать, поэтому нет маркера как судить надо не надо. Вот вы null значения хотите в SQL NULL, а вдруг в базе стоит столбцу NOT NULL. И 'null' кстати валидный json.считаю правильным енкодить нулл только с $model->attr1 = new JsonExtension(null), если же $model->attr1 = null - то в бд должно ложится именно NULL
а я гдето говорил что null это не валидный json ?
если я в БД хочу положить NULL, то наверное я знаю что хочу, а если я не знаю то это знает валидатор "реквайед" например, а NOT NULL в данном случае к JsonExpression не имеет никакого отношения, не его собачье дело NOT NULL в бд или не NOT NULL
пс. если attr1 типа string - по вашему тогда в БД для него правильно строку 'null' записывать ? и да, скажите что ложится в бд если в атрибуты с другими типами сейчас NULL хочешь положить...
для справки
NULL != 'null'::varchar
NULL != 0
NULL != 0.0
и тд...
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: 2.0.14x , опять json и null
Кидайте репорт на github, но сначала попробуйте master и посмотрите changelog для 2.0.14.1 и 2.0.14.2.
Нравится Yii? Давайте сделаем его лучше!.
Re: 2.0.14x , опять json и null
https://github.com/yiisoft/yii2/blob/2. ... ma.php#L40
https://github.com/yiisoft/yii2/blob/2. ... ma.php#L67
заменил у себя на
но для "фаст способа" сделать 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
https://github.com/yiisoft/yii2/blob/2. ... ma.php#L67
заменил у себя на
стало корректно отрабатывать $model->attr = nullreturn ($value === null ? null : new JsonExpression($value, $this->type));
но для "фаст способа" сделать 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
Я вам как раз про это и намекал, чтобы вы разобрались подробнее в проблеме, у других с этим тоже затыки, но уже другие, т.к. если просто сделать вот так очевидно как выше($value === null ? null), чтобы не пропустить:
Теперь когда вы разобрались в картине, можете создать там issue
Re: 2.0.14x , опять json и null
эммм..... наверное я слишком глуп, туп и слеп, чтоб не найти в вашем сообщении такой глубокий намек. но если бы вы прочитали заголовок топика то увидели бы в нем слово "опять" которое означает что это еще один очередной топик но все про тот же самый json, а поскольку проблема другая, то и топик другой ... я надеюсь у меня получилось сказать короткую мысль "я ознакомился с другими топиками прежде чем написать" ?maleks писал(а): ↑2018.03.05, 09:31 Я вам как раз про это и намекал, чтобы вы разобрались подробнее в проблеме, у других с этим тоже затыки, но уже другие, т.к. если просто сделать вот так очевидно как выше($value === null ? null), чтобы не пропустить:
Теперь когда вы разобрались в картине, можете создать там issue
ну и конечно же спасибо за ваш "намек", потому что без него я бы конечно же не смог разобраться в "картине". так и просидел бы еще полгода-год как минимум пока 2.1 не появилась бы
пс. я как всегда в позитиве, это сарказм
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: 2.0.14x , опять json и null
Заведите. Всё-равно придётся рано или поздно для работы.
Нравится Yii? Давайте сделаем его лучше!.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: 2.0.14x , опять json и null
Не вытесняет, если нужно писать код и в компании код на github (что часто).
Нравится Yii? Давайте сделаем его лучше!.
Re: 2.0.14x , опять json и null
код то писать нужно, только чем больше человек в подчинении, тем меньше пишешь код, и больше занимаешься административными вопросами. потому что сначала руководишь одним разработчиком, потом 5, потом 10, потом руководишь тимлидами, рук проектами, потом руководишь начальниками отделов, руководителями департаментов .... генеральными директорами холдинга.... так вот если руководишь тимлидами - то еще общаешься про программирование, а дальше в основном позадачно, только как опытный эксперт вмешиваешься в момент прохода реперных точек или разруливания ситуаций, и то "по желанию"
а вот про гитхаб не согласен, его используют по большей части компании у которых нет собственной инфраструктуры, поэтому они и используют сторонние сервисы. не представляю чтоб одноклассники или вконтакте хранились на гитхабе. да и компании гораздо поменьше так же ставят свои гитлабы, на свои сервера.
Re: 2.0.14x , опять json и null
deleted as not relevant
Последний раз редактировалось maleks 2018.03.13, 08:02, всего редактировалось 2 раза.
Re: 2.0.14x , опять json и null
В 2.0.14 был оказывается добавлен ExpressionInterface, так что с самого начала NULL присвоить, если надо, можно как
Код: Выделить всё
$obj->attr = new \yii\db\Expression('NULL');
Re: 2.0.14x , опять json и null
я точно не помню, но если не ошибаюсь то еще до 2.0.4 а не 2.0.14 существовал \yii\db\Expression,maleks писал(а): ↑2018.03.10, 15:26 В 2.0.14 был оказывается добавлен ExpressionInterface, так что с самого начала NULL присвоить, если надо, можно как
Код: Выделить всё
$obj->attr = new \yii\db\Expression('NULL');
Re: 2.0.14x , опять json и null
Я по русски вроде же говорил о "добавлен ExpressionInterface", а не \yii\db\Expression.
Expression раньше применялся чисто для QueryBuilder-а чтобы строить запрос без экранирования кусков. Про использование их с AR или DAO, в доках не было ни слова, только сейчас что то в пример с upsert добавили.
Если вы про эти пасхалки с самого начала знали, то к чему весь этот цирк от вас был? Идея ж и была, ваша проблема, вы в ней и разбираетесь, в том числе в пасхалках, но вы включили режим гения который не может зарегистрироваться на гитхабе.