'Dialect needs to be explicitly supplied as of v4.0.0
I have been working on a NodeJS project which uses PostgreSQL database. I am trying to implement migration to the database. Also, using Sequelize. After setting up the migration folder and config, it throws error while running db:migrate
The error is: "Dialect needs to be explicitly supplied as of v4.0.0"
Solution 1:[1]
Solution for me was based on what I had set for my NODE_ENV variable.
echo $NODE_ENV
If you do not have anything set for that variable, try setting it with the following:
export NODE_ENV=development
If a value is present, make sure you have an entry in your config file for that value. For me, I like to use local. So I had to update my config to this:
{
local: {
username: 'root',
password: null,
database: 'database_dev',
host: '127.0.0.1',
dialect: 'postgres'
},
development: {
username: 'root',
password: null,
database: 'database_dev',
host: '127.0.0.1',
dialect: 'postgres'
},
test: {
username: 'root',
password: null,
database: 'database_test',
host: '127.0.0.1',
dialect: 'postgres'
},
production: {
username: 'root',
password: null,
database: 'database',
host: '127.0.0.1',
dialect: 'postgres'
}
}
Solution 2:[2]
Check the dialect once.
const Sequelize = require('sequelize');
// Option 1: Passing parameters separately
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: /* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */
});
Solution 3:[3]
I got same error and I saw this mistake in the code.
title: {
type: Sequelize,
allowNull: false,
},
Changed my code with this and problem is solved:
title: {
type: Sequelize.STRING,
allowNull: false,
},
Solution 4:[4]
Check your config file (env names)
{
development: {
username: 'root',
password: null,
database: 'database_development',
host: '127.0.0.1',
dialect: 'mysql'
},
test: {
username: 'root',
password: null,
database: 'database_test',
host: '127.0.0.1',
dialect: 'mysql'
},
production: {
username: 'root',
password: null,
database: 'database_production',
host: '127.0.0.1',
dialect: 'mysql'
}
}
Solution 5:[5]
My issue was that I wasn't pointing to the config file properly. It said "successfully loaded" but I wasn't pointing to the right file.
It should say "Loaded configuration file "[some path]/config.js"."
Solution 6:[6]
I was facing this error, as it turns out, because of typescipt's transformation/compilation.
A little background: I am using sequelize in a typescript project. And the database config file was in a database.ts file.
const config = {
development: {
username: env.PG_USERNAME,
password: env.PG_PASSWORD,
database: 'sample_db',
host: env.PG_HOST,
port: env.PG_PORT,
dialect: 'postgres',
},
test: {
username: env.PG_USERNAME,
password: env.PG_PASSWORD,
database: 'sample_db',
host: env.PG_HOST,
port: env.PG_PORT,
dialect: 'postgres',
},
production: {
username: env.PG_USERNAME,
password: env.PG_PASSWORD,
database: 'sample_db',
host: env.PG_HOST,
port: env.PG_PORT,
dialect: 'postgres',
},
};
export default config;
In .sequelizerc file, I was pointing to the transpiled version of the database.ts file i.e. the dist/config/database.js file. As shown below:
const path = require('path');
module.exports = {
env: process.env.NODE_ENV || 'development',
config: path.resolve('dist', 'config', 'database.js'),
...
};
But after inspecting the transpiled version of the database.ts file, i noticed that the config was exported as:
module.exports.default = config
But sequelize is expecting the config to be at module.exports.
So, I modified the database.ts file by appending this one line to the end of the file and that resolved it for me.
...
module.exports = config;
Solution 7:[7]
I think you have missed .env file in your project
Solution 8:[8]
In my case issue was the way I was exporting config from config.ts
export const = {} did not work
but module.exports worked:
module.exports = {
development: {
dialect: process.env.DB_DIALECT,
username: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME_DEVELOPMENT,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
},
test: {
dialect: process.env.DB_DIALECT,
username: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME_DEVELOPMENT,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
},
production: {
dialect: process.env.DB_DIALECT,
username: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME_DEVELOPMENT,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
},
};
Solution 9:[9]
After pulling my hair out for a couple hours, I realized I was doing cd src; node app.js when really I was supposed to do node src/app.js... Gooooooodness
Solution 10:[10]
did you forget to add the dialect to your config? see: http://docs.sequelizejs.com/manual/tutorial/migrations.html
Solution 11:[11]
if you have not setup any .env variables before running your npm server
You are likely to get that error. so each time you restart app for changes. you will have to export again
export DATABASE_URL=<your-db-url>
Solution 12:[12]
This error can also be caused if there is an error in your model schema.
I had:
middle_name: {
type: Sequelize.Sequelize,
allowNull: false,
}
Which should had been:
middle_name: {
type: Sequelize.STRING,
allowNull: false,
}
Solution 13:[13]
In my case, I declared config.js like as:
module.exports = {
production: {
database: process.env.DB_PROD_DATABASE,
username: process.env.DB_PROD_USERNAME,
password: process.env.DB_PROD_PASSWORD,
options: {
host: process.env.DB_PROD_HOST,
port: process.env.DB_PROD_PORT,
dialect: 'postgres',
define: {
paranoid: true,
timestamp: true,
freezeTableName: true,
underscored: false
}
}
},
development: {
database: process.env.DB_DEV_DATABASE || 'database_name',
username: process.env.DB_DEV_USERNAME || 'user_name',
password: process.env.DB_DEV_PASSWORD || 'pass',
host: process.env.DB_DEV_HOST || 'localhost',
port: process.env.DB_DEV_PORT || 5432,
dialect: 'postgres',
define: {
paranoid: true,
timestamp: true,
freezeTableName: true,
underscored: false
}
}
}
But it should be like as:
module.exports = {
production: {
database: process.env.DB_PROD_DATABASE,
username: process.env.DB_PROD_USERNAME,
password: process.env.DB_PROD_PASSWORD,
options: {
host: process.env.DB_PROD_HOST,
port: process.env.DB_PROD_PORT,
dialect: 'postgres',
define: {
paranoid: true,
timestamp: true,
freezeTableName: true,
underscored: false
}
}
},
development: {
database: 'database_name',
username: 'user_name',
password: 'pass',
host: 'localhost',
port: 5432,
dialect: 'postgres',
define: {
paranoid: true,
timestamp: true,
freezeTableName: true,
underscored: false
}
}
}
without process.env.DB_DEV_DATABASE || 'database_name' eg.
Solution 14:[14]
If you are facing this error then,you have to add additional argument after password_for_rootUser in form of object and need to specify these property according to your RDBMS
var Sequilize=require('sequelize');
var connection =new Sequilize('db_name','root_user_name','password_for_rootUser',{
host:'localhost',
dialect:'mysql'|'mariadb'|'sqlite'|'postgress'|'mssql',
pool:{
max:5,
min:0,
idle:10000
},
//for sqlite only
storage:path/to/database.sqlite
});
var Article=connection.define('tableName',{
title:Sequilize.STRING, // your cloumn name with data type
body:Sequilize.TEXT // your cloumn name with data type
});
connection.sync();
hope this solves your problem
Solution 15:[15]
I had a config.js file from a previous project with a non-standard value for my environment.
It was called current.
I changed it to development and the error went away.
const main = require('./main');
module.exports = {
development: { // this was set to `current` in my case, and it was causing the error
username: main.db.user,
password: main.db.password,
database: main.db.name,
host: main.db.host,
port: main.db.port || 3306,
dialect: 'mysql'
}
};
Solution 16:[16]
You can fix this by running this command
export NODE_ENV=development; npx sequelize db:migrate
cheers!
Solution 17:[17]
In my case, I forgot to uncomment the DB_CONNECTION value from .env which is used to establish postgreSQL connection in my code
Solution 18:[18]
After reading through all the answers and possible solutions to problems people had and nothing worked for me here is another additional solution for an environment that uses:
- Typescript (Having the sequelize config in .ts)
- Sequelize
Problem: Not being able to run "sequelize db:migrate" (getting the error from this thread) due to sequelize not getting access to the .env file and cannot properly read the config
Example config
config: any = {
"development": {
"username": dbUser,
"password": dbPassword,
...
module.exports = config
dbUser is undefined for Sequelize
- Create a ".sequelizerc" file in the root of your project and give it the path to the already built .js config file:
const path = require('path');
module.exports = {
'config': path.resolve('./dist', 'src/config/config.js')
};
- In your config file add
module.exports = config
as sequelize does not like export default config (as mentioned above). I have both types of exports.
Install the dotenv-cli (I did it as a dev dependency, but globally should work fine as well)
Run the migration command while suppling the .env file with:
npx dotenv -e /path/to/.env sequelize db:migrate
Also had to make sure my NODE_ENV is set to development:
export NODE_ENV=development
Solution 19:[19]
use below code in config/config.js to load env
import dotenv from 'dotenv'
dotenv.config()
my .sequelizerc
module.exports = {
'config': path.resolve('config', 'sequelize.js'),
'models-path': path.resolve('src', 'models'),
'seeders-path': path.resolve('src', 'seeders'),
'migrations-path': path.resolve('src', 'migrations')
};
and config/sequelize.js
import dotenv from 'dotenv'
dotenv.config()
export default {
development: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: process.env.DB_DIALECT,
dialectOptions: {
bigNumberStrings: true
}
},
test: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: process.env.DB_DIALECT,
},
production: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: process.env.DB_DIALECT,
dialectOptions: {
bigNumberStrings: true,
}
}
};
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
