【问题标题】:Dialect needs to be explicitly supplied as of v4.0.0从 v4.0.0 开始需要明确提供方言
【发布时间】:2018-03-23 11:30:09
【问题描述】:

我一直在做一个使用 PostgreSQL 数据库的 NodeJS 项目。 我正在尝试实现向数据库的迁移。此外,使用 Sequelize。设置迁移文件夹和配置后,运行 db:migrate 时抛出错误

错误是: "方言需要从 v4.0.0 开始明确提供"

【问题讨论】:

  • // with uri const sequelize = new Sequelize('postgres://localhost:5432/db_name')

标签: node.js postgresql sequelize.js


【解决方案1】:

我的解决方案基于我为 NODE_ENV 变量设置的内容。

echo $NODE_ENV

如果您没有为该变量设置任何内容,请尝试使用以下设置:

export NODE_ENV=development

如果存在 is 值,请确保您的配置文件中有 那个 值的条目。对我来说,我喜欢使用local。所以我不得不将我的配置更新为:

{
 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'
 }
}  

【讨论】:

  • 在哪里可以找到这个配置文件?我在 node.js 项目中从 npm 安装 sequelize,但我不知道它在哪里
  • @Mitro:如果您使用的是 Sequelize CLI,我认为它会为您生成这些文件。无论哪种方式,请查看此处的文档:docs.sequelizejs.com/manual/tutorial/migrations.html 这些应该有助于解释运行迁移所需的文件。如果您仍然遇到问题,请尝试提出一个新问题。
  • set export NODE_ENV=development 这需要在 ~/.zshrc 或 ~/.bashrc 中设置(如果是 linux)
  • 或者,您可以使用 --env 指定配置中的条目,npx sequelize-cli db:migrate:status --config "config.json" --env "development"
【解决方案2】:

检查方言一次。

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' */
});

【讨论】:

    【解决方案3】:

    我遇到了同样的错误,我在代码中看到了这个错误。

      title: {
        type: Sequelize,
        allowNull: false,
      },
    

    用这个更改了我的代码,问题就解决了:

      title: {
        type: Sequelize.STRING,
        allowNull: false,
      },
    

    【讨论】:

      【解决方案4】:

      检查您的配置文件(环境名称)

      {
        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'
        }
      }
      

      【讨论】:

        【解决方案5】:

        我的问题是我没有正确指向配置文件。它说“加载成功”,但我没有指向正确的文件。

        应该说“加载的配置文件“[some path]/config.js”。”

        【讨论】:

          【解决方案6】:

          事实证明,由于 typecipt 的转换/编译,我遇到了这个错误。

          一点背景知识:我在一个打字稿项目中使用 sequelize。并且数据库配置文件位于database.ts 文件中。

          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;
          

          .sequelizerc 文件中,我指向database.ts 文件的转译版本,即dist/config/database.js 文件。如下图:

          const path = require('path');
          
          module.exports = {
              env: process.env.NODE_ENV || 'development',
              config: path.resolve('dist', 'config', 'database.js'),
              ...
          };
          

          但在检查了database.ts 文件的转译版本后,我注意到配置被导出为:

          module.exports.default = config
          

          sequelize 期望配置位于module.exports

          所以,我修改了database.ts 文件,将这一行附加到文件末尾,并为我解决了这个问题。

          ...
          
          module.exports = config;
          

          【讨论】:

            【解决方案7】:

            我认为您在项目中错过了 .env 文件

            【讨论】:

              【解决方案8】:

              就我而言,问题是我从 config.ts 导出配置的方式 export const = {} 无效
              module.exports 工作:

              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,
                },
              };
              

              【讨论】:

                【解决方案9】:

                您可以通过运行此命令来解决此问题

                export NODE_ENV=development; npx sequelize db:migrate
                

                干杯!

                【讨论】:

                  【解决方案10】:

                  拉了几个小时的头发后,我意识到我在做cd src; node app.js,而实际上我应该做node src/app.js...太棒了

                  【讨论】:

                    【解决方案11】:

                    您是否忘记将方言添加到您的配置中? 见:http://docs.sequelizejs.com/manual/tutorial/migrations.html

                    【讨论】:

                      【解决方案12】:

                      如果您在运行 npm server 之前没有设置任何 .env 变量

                      您很可能会遇到该错误。所以每次你重新启动应用程序进行更改。 您将不得不再次导出

                      export DATABASE_URL=<your-db-url>
                      

                      【讨论】:

                        【解决方案13】:

                        如果您的模型架构中存在错误,也可能会导致此错误。

                        我有:

                        middle_name: {
                            type: Sequelize.Sequelize,
                            allowNull: false,
                        }
                        

                        应该是这样的:

                        middle_name: {
                            type: Sequelize.STRING,
                            allowNull: false,
                        }
                        

                        【讨论】:

                          【解决方案14】:

                          就我而言,我将 config.js 声明为:

                          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
                              }
                            }
                          }
                          

                          但它应该是这样的:

                          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
                              }
                            }
                          }
                          

                          没有process.env.DB_DEV_DATABASE || 'database_name' 例如。

                          【讨论】:

                            【解决方案15】:

                            如果您遇到此错误,则必须在 password_for_rootUser 之后以对象的形式添加附加参数,并且需要根据您的 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();
                            

                            希望这能解决您的问题

                            【讨论】:

                              【解决方案16】:

                              我有一个来自以前项目的 config.js 文件,它对我的​​环境具有非标准值。

                              它被称为current

                              我将其更改为development,错误消失了。

                              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'
                                }
                              };
                              

                              【讨论】:

                                【解决方案17】:

                                在我的例子中,我忘记取消注释 .env 中的 DB_CONNECTION 值,该值用于在我的代码中建立 postgreSQL 连接

                                【讨论】:

                                  【解决方案18】:

                                  在阅读了人们遇到的所有问题的答案和可能的解决方案之后,这里对我没有任何帮助,这是另一个针对使用环境的额外解决方案:

                                  • Typescript(在 .ts 中有 sequelize 配置)
                                  • 续集

                                  问题:无法运行“sequelize db:migrate”(从该线程获取错误)由于 sequelize 无法访问 .env 文件并且无法正确读取配置

                                  示例配置

                                  
                                  
                                      config: any = {
                                          "development": {
                                          "username": dbUser,
                                          "password": dbPassword,
                                      ...
                                      module.exports = config
                                  
                                  

                                  dbUser 未为 Sequelize 定义

                                  1. 在项目的根目录中创建一个“.sequelizerc”文件,并为其指定已构建的 .js 配置文件的路径:
                                  
                                  
                                      const path = require('path');
                                      module.exports = {
                                          'config': path.resolve('./dist', 'src/config/config.js')
                                      };
                                  
                                  
                                  1. 在您的配置文件中添加
                                  
                                  
                                      module.exports = config
                                  
                                  

                                  as sequelize 不喜欢导出默认配置(如上所述)。我有两种类型的出口。

                                  1. 安装 dotenv-cli(我是作为开发依赖项安装的,但全局也应该可以正常工作)

                                  2. 在为 .env 文件提供以下内容时运行迁移命令:

                                    npx dotenv -e /path/to/.env sequelize db:migrate

                                  还必须确保我的 NODE_ENV 设置为开发:

                                  导出 NODE_ENV=development

                                  【讨论】:

                                    猜你喜欢
                                    • 2018-07-02
                                    • 2021-03-30
                                    • 2017-10-05
                                    • 1970-01-01
                                    • 2021-11-10
                                    • 1970-01-01
                                    • 2014-11-13
                                    • 1970-01-01
                                    • 2019-02-09
                                    相关资源
                                    最近更新 更多