How to stop sequelize from sending default value to MYSQL table? - mysql

The console log:
Executing (default): INSERT INTO `testtables` (`id`,`forgot_code`,`customer_id`) VALUES (DEFAULT,610,199)
How can I stop sequelize from sending DEFAULT value into my column id ?
How can I stop sequelize from inserting into my Primary Key since it is already on auto increment ?
My code:
var TestTable= sequelize.define('testtables', {
id:{
type:Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
forgot_code:Sequelize.INTEGER,
customer_id:Sequelize.INTEGER
},{
timestamps: false,
});

A bit late reply, but I had similar issue with Percona. So the solution for us was adding a hook:
new Sequelize(database, username, password, {
dialect: 'mysql',
// FIXME: This is a temporary solution to avoid issues on Percona when Sequelize transform insert query into
// INSERT INTO [TABLE_NAME] (`id`, ...) VALUES (DEFAULT, ...)
hooks: {
beforeCreate: ((attributes) => {
if (attributes
&& attributes.dataValues
&& attributes.dataValues.hasOwnProperty('id')
) {
delete attributes.dataValues.id
}
})
},
})
Update: found this solution on DB level: https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_auto_value_on_zero

1.delete all node modules
2.Re install node modules( npm install)
Now, issue will be fixed. This worked for me.

You have to remove autoIncrement: true from your model definition. Now, inserting without providing the id value will fail. For example, the below code will fail
const User = sequelize.define('user', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
// autoIncrement: true
},
username: Sequelize.STRING,
});
sequelize.sync({ force: true })
.then(() => User.create({
username: 'test123'
}).then((user) => {
console.log(user);
}));
However if you uncomment autoIncrement: true, insert will go through

Related

Sequelize associations not generating foreign key

Sequelize is not creating the foreign key automatically, and is throwing a "no column "userId" in "fieldset"" error. I try to provide all the information down below. Im completely stuck on where to go from here as my code is 100% correct. (Read below)
So i have a Product and User model. both before were working fine. I added some code to set up the relationship:
Product.belongsTo(User, { constraints: true, onUpdate: "CASCADE" });
User.hasMany(Product);
I also, when syncing the db, have used {force: true} and removed it after tables were refreshed. Ive tried restarting pc after these steps, restarting workbench, creating a new database and changing connection to connect to fresh one, still it doesnt put a "userId" column in my product schema.
Ive had this code checked by two people so far and they confirm my syntax is fine, and are equally baffled. Im also confident myself that its not incorrect because im following a reputable course and i've now had to copy and paste his code in replacement to mine just incase, which didnt work.
Product model:
const Sequelize = require("sequelize");
const sequelize = require("../util/database");
const Product = sequelize.define("product", {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true,
},
title: Sequelize.STRING,
price: {
type: Sequelize.DOUBLE,
allowNull: false,
},
image_url: {
type: Sequelize.STRING,
allowNull: false,
},
description: {
type: Sequelize.STRING,
allowNull: false,
},
});
module.exports = Product;
User model:
const Sequelize = require("sequelize");
const sequelize = require("../util/database");
const User = sequelize.define("user", {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true,
},
name: Sequelize.STRING,
email: Sequelize.STRING,
});
module.exports = User;
Syncing code (I create a test user as the course is at a stage where we are testing we can make one):
// db.sync({ force: true })
db.sync()
.then((result) => {
return User.findByPk(1);
// console.log(result);
})
.then((user) => {
if (!user) {
return User.create({ name: "Max", email: "test#test.com" });
}
return user;
})
.then((user) => {
app.listen(5000);
})
.catch((err) => {
console.log(err);
});
The connection is 100% connected as things happen to the tables in my database, just the "userId" column which sequelize should auto-generate from my associations doesnt come up.
Also have tried putting in a foreignKey: "userId" in my Product.belongsTo() line of code to try to implicitly set it. That didnt even work.
Therefore im stuck and cannot continue with my sql code.
Github repo if need further code:
https://github.com/NinjaInShade/online-shop
I tried your code with some modifications about associations and foreign keys and you have two ways to create a column userId and a foreign key:
Add a userId field definition to Product model with references option like this:
userId: {
allowNull: true,
type: Sequelize.INTEGER,
references: {
model: 'users',
key: 'id'
}
}
Synchronize models individually using their sync method:
User.sync({ force: true })
.then(() => {
Product.sync({ force: true }).then(() => {
app.listen(5000);
})
})
Unfortunately the official documentation does not clarify why sync method in Sequelize acts differently in comparison with sync of separate models.
Usually I use migrations and that's why I don't have this issue.

Sequelize Create or FindOrCreate never creates new records, only updates previous ones

When I use sequelize create it always updates the data in the table instead of creating a new one (id is auto increment)
When I ran the same command from mysql workbench it creates the new data correctly. Maybe i'm missing something in my setup...
Sequelize version: sequelize:^5.22.3
Mysql Version: 5.5.62
model:
const Merchants = sequelize.define('merchant', {
merchant_id: { type: Sequelize.STRING(12), allowNull: false },
shop_id: { type: Sequelize.STRING(75), allowNull: false },
status: { type: Sequelize.TINYINT(4), allowNull: false },
credits: { type: Sequelize.INTEGER(11), allowNull: false },
});
create:
Merchants.create({
merchant_id: getNewMerchantID(),
shop_id: shop_id,
status: status,
credits: credits
}).then(merchants => {
console.log(` created merchant: ${shop_id}`);
}).catch(error => {
console.log(` error creating merchant: ${error}`);
})
Console log
Executing (default): SHOW INDEX FROM `merchants`
Executing (default): INSERT INTO `merchants` (`id`,`merchant_id`,`shop_id`,`status`,`credits`) VALUES (DEFAULT,?,?,?,?);
[merchantController] created merchant: SHOP_ID1
Btw I have the same problem with findOneOrCreate, it nevers inserts a new record, always updates the last record that was on the db
findOrCreate
try {
//check if exists
const [merchant, created] = await Merchants.findOrCreate({
where: { shop_id: shop_id },//find this
defaults: {//or create this
merchant_id: getNewMerchantID(),
//shop_id: shop_id, // does not need to repeat, its in the where clause
status: status,
credits: credits
}
});
console.log(`[Merchants] created merchant: ${shop_id} [${created}]`);
return created;
} catch (error) {
console.log(`[Merchants] error creating Merchants: ${error}`);
return false;
}
Found the problem
I was calling the code to create a new record of this model inside the promise from sequelize.sync, that apparently was always dropping the table and inserting new data what made it looks like it was overwriting
sequelize.sync({ force: true }).then(syncRes => {
createMerchant("SHOP_ID1", 1, 999, "TOKEN");
}).catch(error => {
console.log(`sequelize synch error: ${error}`);
});

'Table not found' error when inserting row. Sequelize and nodejs

When I'm trying to import user into database with User.create(), sequelize trows me error that says that table doesn't exist. Even tho I created a table line above the create function. My goal is to add user without using .then() function on .sync function.
I've tried to put sync function in await as I imagined that the sync function takes longer to finish.
// imports ...
// Connecting to database
// Creating ORM object
const db = new sequelize(format("%s://%s:%s#%s:%s/%s", gvars.db_soft, gvars.db_user, gvars.db_pass, gvars.db_host, gvars.db_port, gvars.db_daba));
db.authenticate().then(() => {
console.log("Connection established.");
}).catch(err => {
console.error(err);
});
// Define users table
const User = db.define("users", {
firstName: {
type: sequelize.STRING,
allowNull: false
},
lastName: {
type: sequelize.STRING,
allowNull: false
}}, { freezeTableName: true,
});
db.sync({ force: true }).then(() => { console.log("Table created."); });
User.create({
firstName: "Milan",
lastName: "Vjestica"
});
//...starting app
I expect for user to be added in table.
You have to use promise in sequelize as it is a promised based ORM,try following changes:
User.create({ firstName: "Milan",lastName: "Vjestica"}).then(function(user)
{
console.log(user.get('firstName'));
console.log(user.get('lastName'));
});

Async await in mysql seeding does not run

I am trying to seed my MySQL database. I am using the Sequelize ORM. In my index.js file which is in the models folder, I have the code to run the realSync() function for every model as such :
const syncDB = async () => {
await db['Meal'].realSync();
await db['User'].realSync();
}
syncDB();
And in my 'Meal' file, I have the following:
const mealSeeds = require("../scripts/mealSeeds");
module.exports = (sequelize, DataTypes) => {
let Meal = sequelize.define("Meal", {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
name: DataTypes.STRING,
type: DataTypes.STRING,
description: DataTypes.STRING,
photo_URL: DataTypes.STRING,
allergen_dairy: DataTypes.BOOLEAN,
allergen_treenuts: DataTypes.BOOLEAN,
allergen_peanuts: DataTypes.BOOLEAN,
allergen_wheat: DataTypes.BOOLEAN,
allergen_fish: DataTypes.BOOLEAN,
allergen_crustaceanshellfish: DataTypes.BOOLEAN,
allergen_eggs: DataTypes.BOOLEAN,
allergen_soya: DataTypes.BOOLEAN,
date_available: DataTypes.DATE,
time_available: DataTypes.TIME,
quantity: DataTypes.INTEGER,
zipcodes: DataTypes.JSON,
catererId: {
field: "CatererId",
type: DataTypes.INTEGER,
allowNull: true,
defaultValue: 0
}
})
Meal.associate = function (models) {
Meal.belongsTo(models.User, {
foreignKey: "catererId",
targetKey: "id"
})
}
// // Insert the meal seed data
Meal.realSync = async () => {
await Meal.sync()
return await Meal.bulkCreate(mealSeeds,
{ignoreDuplicates: true}
);
};
return Meal;
}
Where the Meal.realSync is supposed to seed the Meals table with data from the mealSeeds.js file in the scripts directory. (And I have a User.js file with the user table fields and a similar .realSync() function for the User table. And this function is working just fine, and users are being seeded into the db).
This function was working fine for weeks, as I was building the project, and recently after changing some of the fields in the 'Meal' table, it no longer works. My previous research shows that by calling the realSync() function asynchronously in the index.js file, it will run and wait for the Meal realSync() function to complete before running the User realSync() function. I am not sure why it no longer runs the first function at all. Any help would be greatly appreciated.
Solved-I figured out that my seed data did not contain a foreign key reference.

Sequelize - Mysql foreignKey ADD CONSTRAINT fails with ALTER TABLE

I'm trying to create two tables with the following model of Sequelize:
const Sequelize = require('sequelize');
module.exports = function (db) {
const Product = db.define('product', {
intProductID: {
type: Sequelize.INTEGER(11),
primaryKey: true,
autoIncrement: true,
allowNull: false
},
strName: {
type: Sequelize.STRING
},
douPrice: {
type: Sequelize.DOUBLE
}
});
return Product;
}
const Sequelize = require('sequelize');
module.exports = function(db){
const User = db.define('user', {
intUserID:{
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
strEmail:{
type:Sequelize.STRING
},
strPassword:{
type:Sequelize.STRING
},
strFirstName: {
type: Sequelize.STRING
},
strLastName: {
type: Sequelize.STRING
}
});
return User;
}
After adding these two models, I try to associate them with the follow code:
Product.belongsTo(
User,
{
foreignKey: {
name: 'intCreateUserID',
allowNull: false
},
foreignKeyConstraint: true
}
);
The first time this happens, it works well. But after one time, it tries to add the constraints several time. I'm continuously getting the following error:
SequelizeDatabaseError: Can't create table 'shop.#sql-4d23_2563b' (errno: 121)
code: 'ER_CANT_CREATE_TABLE',
errno: 1005,
sqlState: '#HY000',
sql: 'ALTER TABLE `products` ADD CONSTRAINT `products_intUpdateUserID_foreign_idx` FOREIGN KEY (`intUpdateUserID`) REFERENCES `users` (`intUserID`) ON DELETE NO ACTION ON UPDATE CASCADE;'
I tried to reproduce the error on mysql console and copy paste the query. I noticed that it fails because of the existing foreign key. It tries to re-add the constrain without removing it first. Is this a bug of Sequelize or is my definition of model wrong?
I'm syncing the tables with the follow code:
init.db.sync({ alter: true }).then(() => {
proceed();
}, (error) => {
console.log(error);
});
After updated to the latest version of Sequelize the problem was solved. People who are getting the same error could try to update the version.