部署到App Engine后运行Sequelize迁移

时间:2017-05-21 18:33:09

标签: node.js google-app-engine sequelize.js gcloud

我为自己创建了一个示例项目,可以在Google App Engine上使用Sequelize尝试Node.js。

我可以在本地运行该项目并且工作正常,但是当我将其部署到App Engine gcloud app deploy

我收到以下错误:

{
    name: "SequelizeDatabaseError",
    message: "ER_NO_SUCH_TABLE: Table 'sql8175762.Likes' doesn't exist",
    parent: {
        code: "ER_NO_SUCH_TABLE",
        errno: 1146,
        sqlState: "42S02",
        index: 0,
        sql: "SELECT `id`, `code`, `likes`, `createdAt`, `updatedAt` FROM `Likes` AS `Likes`;"
    },
    original: {
        code: "ER_NO_SUCH_TABLE",
        errno: 1146,
        sqlState: "42S02",
        index: 0,
        sql: "SELECT `id`, `code`, `likes`, `createdAt`, `updatedAt` FROM `Likes` AS `Likes`;"
    },
    sql: "SELECT `id`, `code`, `likes`, `createdAt`, `updatedAt` FROM `Likes` AS `Likes`;"
}

那是因为Sequelize迁移没有运行但是我确实在npm start命令中指定了它:

"scripts": {
    "deploy": "gcloud app deploy",
    "start": "npm install & sequelize db:migrate & NODE_ENV=production node ./bin/www"
},

我从未使用app引擎进行节点部署,我甚至不确定我所说的步骤是否正确,以便部署,迁移和运行应用程序。

有没有人对此有任何提示?

4 个答案:

答案 0 :(得分:0)

我不知道您的设置,但是您是否有sequelize-cli包依赖,您是否尝试在根目录中添加.sequelizerc文件并添加配置,迁移和模型的路径?例如:

var path = require('path');

module.exports = {
    'config': path.resolve('./', 'config/config.js'),
    'migrations-path': path.resolve('./', 'src/server/migrations'),
    'seeders-path': path.resolve('./', 'src/server/seeders'),
    'models-path': path.resolve('./', 'src/server/models')
}; 

答案 1 :(得分:0)

我对这个问题有点晚了,但是如果其他人正在寻找,值得注意的是显示的示例脚本使用&在命令之间。

这将对每个命令进行后台处理并立即运行下一个命令,因此当节点启动时,npm installsequelize db:migrate很可能仍在运行。

如果你使用的是unix系统(Mac / Linux)你可以通过创建一个名为./test.sh的文件来本地测试它,包含

#!/bin/sh
echo "Starting long process ..."
sleep 5
echo "Long process done"

然后从命令行运行

chmod +x test.sh
./test.sh & echo "Running second process"

将命令更改为&&应该解决这个问题,即:

npm install & sequelize db:migrate & NODE_ENV=production node ./bin/www

答案 2 :(得分:0)

我有相同的经验,问题是由于某些原因,您必须在定义模型中添加import numpy as np import cvxpy as cp weights = cp.Variable(5) d = cp.Variable(1) meas = np.random.rand(8, 3) det = np.random.rand(24, 5) dm = d * np.eye(3) # (1) beh = 1 + cp.reshape((dm @ meas.T).T, (24, )) # (2) constrs = [beh == det @ weights] #(3) tableName属性。例如:

freezeTableName: true

答案 3 :(得分:0)

您应该在启动命令中使用&&而不是&

&意味着在后台运行命令。

&&的意思是“逻辑和”,以便外壳程序将逐个运行命令并等待每个返回的代码。