Drupal Comment Notify (опять)

Drupal закричал мне, что у меня все устарело, нужно срочно апгредиться. Ну, как он любит. Поапгрейдил, в том числе и Comment Notify до версии 1.2, про натягивание которого на Postgresql я уже писал.

Поапгрейдив, имею вопрос: а что, в MySQL у поля написано NOT NULL, то там самостоятельно появится еще и DEFAULT ...? Потому что я не верю, что автор Comment Notify его совсем не тестирует, однако в нем:

  • В таблице заводится крайне полезное поле, позволяющее не слать повторные нотификации если комментарий редактировался. Но оно NOT NULL и без DEFAULT.
  • Вставка в эту таблицу делается без инициализации данного поля.

Патчить можно или сам модуль или процедуру инсталляции/апгрейда. Точнее, без правки .install никак не обойтись, поэтому вот минимальный патч, который превращает Comment Notify 1.2 в работающий под Postgresql (про MySQL ничего не знаю, не проверял):

comment-notify-1.2-install.diff.gz

Если вы переезжаете с Comment Subscribe, то нужно выполнить еще две SQL-команды (чтобы уже разосланные нотификации не рассылались повторно):

UPDATE comment_notify set notified=1;
UPDATE comment_notify set notify=1 where cid in (SELECT cid FROM z_com
mentsubscribe WHERE subscribe > 0);

Comments

Проверил на дефолтных настройках. Оказывается, ага, и даже warnings не дает. Все-таки правильно я делаю, что strictы включаю по максмуму :) Проверено на 4.1.22, думаю что на 5 без стриктов та же редика.

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> create table test1(f int not null);
Query OK, 0 rows affected (0.11 sec)

mysql> insert into test1 values();
Query OK, 1 row affected (0.01 sec)

mysql> show warnings;
Empty set (0.08 sec)

mysql> select * from test1\G
*************************** 1. row ***************************
f: 0
1 row in set (0.00 sec)

Офигеть. А для строковых полей умолчание какое?

Главное, какой смысл в таком NOT NULL?

> А для строковых полей умолчание какое?
Пустая строка.

>какой смысл в таком NOT NULL?
Видимо, когда-то давно разработчики mysql решили, что NOT NULL это "запретить значение NULL для данного поля". О причинах такого решения остается только догадываться:)

Ну, в общем, да, MySQL прописывает дефолты для NOT NULL полей. Хорошо это, или плохо, вопрос отдельный и довольно специябельный.

А что в нем специябельного? NOT NULL, помимо прочего, подразумевает, что пользователь должен задать значение.
NOT NULL DEFAULT ... - с моей точки зрения, поведение довольно неумное. Впрочем, если этот DEFAULT потом можно убрать, то жить можно.

Это сильно упрощает жизнь при апгрейдах. Когда старый код все-таки может записать в таблицу с добавленными колонками. А не падать и заставлять всех всё править.

Если есть такая потребность - ну пиши DEFAULT явно. Или не ставь NOT NULL
Ставить неявно DEFAUL - диверсия.

Но, конечно, это все сползает к дискуссии об use strict. В том смысле, что в скриптах на экран я use strict не пишу, но как только переползаем некоторый размер - пишу и правлю все объявления. Что не мешает программы на полстранички и на С++ писать.

Забавно то, что в большинстве hook_schema (определении полей таблиц) поля типа text идут not null и без default. В 7ке наверно будет работать какое-то умолчание...

В этом нет ничего страшного, пока в эти поля пишут. MySQL поставил default, PgSQL - нет, ну и что.

Но наверное в генераторе схемы для постгреса нужно явно ставить default если есть not null, иначе эти грабли будут больно биться.