cli
cli copied to clipboard
DataTypes.JSON dosn't work with seeding and arrays
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
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
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!