sequelize / cli

The Sequelize CLI
MIT License
2.53k stars 525 forks source link

DataTypes.JSON dosn't work with seeding and arrays #1152

Open MauritzFunke opened 2 years ago

MauritzFunke commented 2 years ago

What you are doing?

I used npx sequelize db:seed:all to seed a database entry. If I try to create it in the project itself everything is working fine (see test file)

Test File

const { test } = require('./models')
let test1 = test.build({
    arr: ['test1'],
    createdAt: new Date(),
    updatedAt: new Date()
})
test1.save()

Model File

const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class test extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  }
  test.init({
    arr: DataTypes.JSON,
  }, {
    sequelize,
    modelName: 'test',
  });
  return test;
};

Seed File

module.exports = {
  async up (queryInterface, Sequelize) {
    return queryInterface.bulkInsert('test',[
      {
        arr: ['test1'],
        createdAt: new Date(),
        updatedAt: new Date()
      }
    ])
  },

  async down (queryInterface, Sequelize) {
     return queryInterface.bulkDelete('test', null, {});
  }
};

What do you expect to happen?

Insert a new row into the database with the array

What is actually happening?

The array isnt beeing parsed to ['test1'], it's getting parsed to 'test1'

ERROR: (conn=81, no: 4025, SQLState: 23000) CONSTRAINT `test.arr` failed for `database_dev`.`test`
INSERT INTO `tests` (`test`,`createdAt`,`updatedAt`) VALUES ('test','2022-09-14 09:17:45.936','2022-09-14 09:17:45.936');

Dialect: mariadb Database version: 10.5.15 Sequelize CLI version: 6.4.1 Sequelize version: 6.21.6

hanin77 commented 1 year ago

Hello , For the test file it works because When using Model.build(), you can directly assign an object to the arr property, and Sequelize will store it as JSON in the database without any additional stringification. but when using bulkInsert you need to serialize arr value ['test1'] manually:

module.exports = {
  async up (queryInterface, Sequelize) {
    return queryInterface.bulkInsert('test',[
      {
        arr: JSON.stringify(['test1']),
        createdAt: new Date(),
        updatedAt: new Date()
      }
    ])
  },

  async down (queryInterface, Sequelize) {
     return queryInterface.bulkDelete('test', null, {});
  }
};

so i assume , this is not a bug

nelsonhamada commented 1 year ago

Thanks for your help! I had the same problem and searched for a long time before seeing your comment. You solved my bug. Thank you again!