Sequelize 同步和 Node.js 不创建表

Paw*_*elC 8 node.js

我正在学习node.js和sequelizer,我遇到了一个问题,即我使用Sequelizer创建了一个User模型,不幸的是当我想在index.js中运行sequelizer.sync(); 它在控制台中向我显示结果,但它不会创建表格。

我的型号:

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: {
        type: Sequelize.TEXT,
        allowNull: false
    },
    surname: {
        type: Sequelize.TEXT,
        allowNull: false
    }
});

module.exports = User;
Run Code Online (Sandbox Code Playgroud)

我的数据库配置

const Sequelize = require('sequelize');
const sequelize = new Sequelize('node-nauka', 'root', '', {
    dialect: 'mysql',
    host: 'localhost'
});

module.exports = sequelize;
Run Code Online (Sandbox Code Playgroud)

索引.js

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const defaultRoutes = require('./routes/default');
const sequelize = require('./util/database');

app.use(bodyParser.json());

app.use(defaultRoutes);
sequelize.sync().then(result => {
    console.log(result);
    app.listen(3000);
}).catch(err => {
    console.log(err);
});
Run Code Online (Sandbox Code Playgroud)

同步结果: https: //pastebin.com/rtxqkMtx 我想念想法,在几个数据库上尝试过,效果相同,没有错误,但也没有创建表。

Nik*_*are 11

就我而言,我只是将模型导入到 app.js

const sequelize = require("./src/Utils/database");
const User = require("./src/models/User");

sequelize
  .sync()
  .then((result) => {
    console.log(result);
  })
  .catch((err) => {
    console.log(err);
  });
Run Code Online (Sandbox Code Playgroud)

@PawelC你的代码和我的一样所以它也适合你

谢谢


小智 9

首先,您没有向我们展示您的./routes/default. 你在那里使用你的模型吗?如果没有,这里就是错误。在pastebin的输出中你可以看到:

  models: {},
  modelManager: ModelManager { models: [], sequelize: [Circular] },
Run Code Online (Sandbox Code Playgroud)

在路线中使用模型,您将看到:

  models: { user: user },
  modelManager: ModelManager { models: [ user ], sequelize: [Circular] },
Run Code Online (Sandbox Code Playgroud)

其次,require代码中的 s 有点像意大利面条。在index.js你的 require中./util/database,在./models/user(例如)你的 require中./util/database,所以流程是:

index.js < ./util/database > ./models/user
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,需求的一个方向没有流动 -index.js对您的模型一无所知。Require 是 import 语句,而不是代码注入。

如果您将在路线中使用模型,流程将是:

index.js < ./util/database > ./models/user > ./models/default > index.js
Run Code Online (Sandbox Code Playgroud)

所以会有从 model 到 的流量index.js

最终解决方案

为了更全面,您可以将数据库配置和所有模型收集在一个集合中(主要是这样./models/index.js您可以通过 获取它require('./models')),并从该集合导入sync()到路由以使用它。流动:

(config and models) > ./models/index.js > migrate.js > sync()
(config and models) > ./models/index.js > (routes) > index.js
Run Code Online (Sandbox Code Playgroud)

第二个最佳实践是不要在主应用程序文件中使用sync()(对于您来说:)index.js。现在,当您开发时,它并​​不那么重要,但在生产中,这可能会破坏数据库中的数据(例如删除行)。更好的方法是将其用作迁移。

您可以在我们的示例博客应用程序中查看此主题的示例:https://github.com/OptizeTeam/blog-api-node