Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sequelize sync和Node.js不创建表_Node.js - Fatal编程技术网

Sequelize sync和Node.js不创建表

Sequelize sync和Node.js不创建表,node.js,Node.js,我正在学习node.js和sequelizer,我遇到了一个问题,即我使用sequelizer创建了一个用户模型,不幸的是,当我想在index.js sequelizer.sync()中运行时;它在控制台中显示结果,但不创建表 我的模型: const Sequelize = require('sequelize'); const sequelize = require('../util/database'); const User = sequelize.define('user', {

我正在学习node.js和sequelizer,我遇到了一个问题,即我使用sequelizer创建了一个用户模型,不幸的是,当我想在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;
我的数据库配置

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

module.exports = sequelize;
index.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);
});
同步结果:
我错过了一些想法,在多个数据库上尝试了相同的效果,没有错误,但也没有创建表。

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

  models: {},
  modelManager: ModelManager { models: [], sequelize: [Circular] },
在route中使用模型,您将看到:

  models: { user: user },
  modelManager: ModelManager { models: [ user ], sequelize: [Circular] },
其次,
require
s在您的代码中有一点意大利面。 在
index.js
中需要
/util/database
,在
/models/user
(例如)中需要
/util/database
,因此流是:

index.js < ./util/database > ./models/user
因此,将有从模型到
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
第二个最佳实践是不要在主应用程序文件中使用sync()(对于您:
index.js
)。现在,当您开发时,它并不那么重要,但在生产中,这可能会破坏数据库中的数据(例如,删除行)。更好的方法是将其用作迁移


您可以在我们的示例博客应用程序上看到此主题的示例:

要解决此问题,请在控制台上安装sequelize cli。然后按照以下步骤操作

  • 在控制台上运行npx sequelize init,它会生成一些文件夹,如config文件夹、models文件夹等。删除config文件夹并打开models->index.js,然后按以下方式重构代码:
  • `

    二,。在创建模型的同一个模型文件夹中,请以这种方式重构您的模型创建代码

    const sequelize = require("../util/database") // import the Database connection path;
    
    module.exports = (sequelize, DataTypes) => {
      const Product = sequelize.define("product", {
        id: {
          type: DataTypes.INTEGER,
          autoIncrement: true,
          primaryKey: true,
          allowNull: false
        },
        name: {
          type: DataTypes.STRING,
          unique: true
        },
        email: {
          type: DataTypes.STRING,
          unique: true
        },
        password: DataTypes.STRING
      });
    
      return Product;
    };
    
  • 在index.js文件中
  • `

    `

  • 然后运行代码->npm start以创建表。多谢各位
    我也在学习Maximilian的Udemy课程,对我有效的是我创建了一个post请求(即使同步没有创建表),当我有了在其中一个post路由中创建条目的逻辑并启动了节点服务器时,它自动创建了表。

    只需在index.js中导入用户模型文件。这将在数据库中创建表,因为除非节点读取了该文件,否则它不知道已创建了表。

    我认为您的代码无法工作的原因是,您没有从“models”文件夹导入某些内容。 Max在“controllers”文件夹的admin.js文件中有此导入:const Product=require(“../models/Product”);通过这种方式,他将models文件夹链接到应用程序的其余部分,从而允许Sequelize找到他在“models”文件夹中定义的模型的配置

    如果您尝试将user.js中的所有代码移动到app.js或index.js中,然后尝试同步,您将看到这将起作用。

    在index.js中

    导入模型

    例如:-

    const Product = require('./models/product');
    const User = require('./models/user');
    
    const sequelize = require('./util/database');
    
    const sequelize = require('./util/database');
    const Product = require('./models/product');
    const User = require('./models/user');
    
    之后:-

    const Product = require('./models/product');
    const User = require('./models/user');
    
    const sequelize = require('./util/database');
    
    const sequelize = require('./util/database');
    const Product = require('./models/product');
    const User = require('./models/user');
    
    代码将如下所示:-

    const Product = require('./models/product');
    const User = require('./models/user');
    
    const sequelize = require('./util/database');
    
    const sequelize = require('./util/database');
    const Product = require('./models/product');
    const User = require('./models/user');
    

    在我的例子中,我只是将模型导入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);
      });
    
    @PawelC您的代码与我的代码相同,因此它也适用于您


    谢谢

    您尝试过使用迁移而不是同步方法吗?没有,我正在按照NodeJS课程做所有事情-udemy上的完整指南Maximilian Schwarzmüller,他做得很好,我没有和我一起创建表。一般来说,我已经创建了一个数据库,现在我想自动创建表。我不明白为什么ORM每次启动时都会删除您的数据,除非您明确要求它这样做。我读到你可以通过{force:false},但即使这样对我也不起作用。它仍然删除数据。