Sequelize sync和Node.js不创建表
我正在学习node.js和sequelizer,我遇到了一个问题,即我使用sequelizer创建了一个用户模型,不幸的是,当我想在index.js sequelizer.sync()中运行时;它在控制台中显示结果,但不创建表 我的模型: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', {
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。然后按照以下步骤操作
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;
};
我也在学习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},但即使这样对我也不起作用。它仍然删除数据。