Повторная настройка значения по умолчанию с помощью uuid_generate_v4 приводит к синтаксической ошибке

#postgresql #sequelize.js #uuid

Вопрос:

Я следовал советам, описывающим, как использовать uuid с Sequelize в базе данных Postgres, и определял модель для создания значения uuid по умолчанию. Он ссылается на эту статью здесь.

Совет требует uuid-ossp продления. Я проверил, что он установлен и работает, используя SELECT в базе данных, которая вызывает функцию, а также подтвердил, что расширение «создано». Чтобы база данных могла позвонить.

В статье рекомендуется определить модель, как я сделал в этом фрагменте кода:

 public_id: {
  field:        'public_id',
  type:         Sequelize.UUID,
  allowNull:    false,
  defaultValue: Sequelize.literal('uuid_generate_v4()'),
},
 

Когда я запускаю код для создания таблицы (синхронизация базы данных с моделями), я получаю ошибку от Sequelize:

 Error: Invalid value Literal { val: 'uuid_generate_v4()' }
 

Я отладил секвенирование, node_modules и ошибка sql_string.js здесь:

 if (!val.replace) {
  throw new Error(`Invalid value ${logger.inspect(val)}`);
}
 

потому replace что не определено вкл val ., что uuid_generate_v4() в моем случае. Забавный факт: независимо от того, что я помещаю в кавычки, я получаю одну и ту же ошибку.

Я думаю, что сделал все правильно, как описано в статье. Есть ли что-то глупое, что я упускаю?

Обновление с основной причиной найдено Хорошей новостью для любых будущих читателей является то, что приведенный здесь код определения модели является абсолютно правильным. Итак, перейдем к К. Родману Манниксу.

Проблема была совсем не в этом. Мой код гораздо более сложного, чем простой пример, в какой-то момент создает определения модели Sequelize как объекты, а затем передает их define методу Sequelize. Странная часть заключалась в том, что код, определяющий модель, использует установку Sequelize в одной папке, а затем (из-за ошибки конфигурации), выполнявшая define последовательность, использовала последовательность, установленную в другой папке.

Глубоко в коде Sequelize он выполнил Javascript instanceof , который увидел два разных «источника» для объекта и вернул значение false-y. Как только я это понял, простая очистка папок проекта заставила все работать.

Комментарии:

1. Я не могу повторить вашу проблему. Какую версию sequelize вы используете?

2. Я должен был уточнить: 6.6.2. Что вы успешно использовали?

3. 6.7.0. Возможно ли, что вы неправильно передаете его модели?

4. Отличная идея, но нет, я не думаю, что есть ошибка при переходе к модели. Если я удалю это определение одного столбца, Sequelize с радостью синхронизирует таблицу, создавая все остальное.

5. Дополнительная информация: я просто настроил его на разрешение нулей и удалил вызов функции в значении по умолчанию. Опять же, Sequelize создал таблицу просто отлично. Буквально только тогда, когда я использую Sequelize.literal, я получаю ошибку.