运行CLI命令db:migrate

时间:2019-05-03 08:29:36

标签: node.js postgresql sequelize.js

我正在中等水平上关注本教程Using PostgreSQL and Sequelize to persist our data,现在我被困在db:migrate上。它返回此错误

Sequelize CLI [Node: 12.1.0, CLI: 5.4.0, ORM: 5.8.2]

Loaded configuration file "config.json".
Using environment "development".

ERROR: Error parsing url: undefined

您可以看到我正在使用NodeJS版本12.1.0和Sequelize CLI版本5.4.0和Sequelize版本5.8.2,它们都是最新版本。

在运行sequelize db:migrate之前,我先运行此命令SET DATABASE_URL=postgresql://[user[:password]@][netlocation][:port][/dbname],它不会返回任何错误。

但是我运行db:migrate

后返回错误

我已经尝试找到问题了,但是还没有找到答案。 这是我的./Models/Index.js文件。

'use strict';

require('dotenv').config();

import { readdirSync } from 'fs';
import { basename as _basename, join } from 'path';
import Sequelize from 'sequelize';
const basename = _basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../../config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = sequelize['import'](join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

export default db;

如果您意识到我只是将其更改为ES6格式而更改了一些代码,但是在我将其更改为ES6之前,它也不起作用。以及本教程之后的所有其他文件。

以下是我认为具有关联的文件:

.env

DATABASE_URL=postgres://postgres:admin@localhost:5432/test_app

.sequelizerc

const path = require('path');

module.exports = {
  "config": path.resolve('./config.json'),
  "models-path": path.resolve('./app/Models'),
  "migrations-path": path.resolve('./migrations')
};

config.json

{
  "development": {
    "use_env_variable": "DATABASE_URL"
  },
  "test": {
    "use_env_variable": "DATABASE_URL"
  },
  "production": {
    "use_env_variable": "DATABASE_URL"
  }
}

如果我还没有包含某些文件,请告诉我,并请帮助我解决此问题的解决方案。谢谢

  

操作系统:Windows 10

3 个答案:

答案 0 :(得分:3)

基本上,您无法成功设置环境变量DATABASE_URL

我不是Windows专家,但这应该可以完成您的工作。

如果您使用的是GitBash,那么它很简单:

export DATABASE_URL=postgres://postgres@localhost:5432/database_name

之后:

node_modules/.bin/sequelize db:migrate

编辑:

我不确定如何在gitbash和cmd中设置此变量。 这是另一种选择。

config/config.json

"development": {
    "username": "postgres"
    "password": "postgres",
    "database": "your_db_here",
    "host": "127.0.0.1",
    "dialect": "postgres"
},

根据您的postgres数据库更新这些变量。

并运行:

node_modules/.bin/sequelize db:migrate

答案 1 :(得分:2)

  1. 您无法在运行时在config.json中获取值。它必须是静态的。
  2. 您应该使用config.json或env变量,或者像在另一个答案中提到的那样滚动自己的变量。

要使用环境变量,请避开config.json。而是在models / index.js中设置

if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

sequelize = new Sequelize(process.env.DATABASE_URL)

答案 2 :(得分:0)

AFAIK Sequelize迁移与正常的sequelize工作流程不同。

加载时正在读取config/config.json-因此您不能使用系统环境变量-它必须是静态json文件。

在我的项目中,我要做的是config.js文件,以确保配置文件使用我的任何设置都是最新的。

我在主程序启动时也在package.json中执行以下操作:

(确保将npm-run-all添加到您的package.json中)

  "scripts": {
    "config": "node src/config.js",
    "_migrate": "sequelize db:migrate",
    "_migrate:status": "sequelize db:migrate:status",
    "_migrate:undo": "sequelize db:migrate:undo",
    "_seed": "sequelize db:seed:all",
    "migrate": "npm-run-all config _migrate",
    "migrate:status": "npm-run-all config _migrate:status",
    "migrate:undo": "npm-run-all config _migrate:undo",
    "seed": "npm-run-all config _seed"
  },

config.js只是在文件末尾执行了类似的操作:

// Export sequelize config/config.json for easy compatibality with sequelize-cli
const filepath = path.resolve(__dirname, '../../config');
const filename = path.join(filepath, 'config.json');

fs.ensureDir(filepath)
    .then(() => fs.writeFileSync(filename, JSON.stringify(sequelizeConfig, 2) + '\n'))
    .catch((err) => console.error(`Failed to write config: ${err}`));

sequelizeConfig是完全生成的sequelize配置对象。您也可以像现在一样拥有通用的,并以此为基础。