同步sequelize模型:sequelize.import()不是函数(已弃用)



我正试图通过Sequelize.js ORM使用sqlite3初始化数据库。我已经定义了我的三个模型(让我们称它们为model1model2model3(,现在我正在开发一个js文件,该文件将初始化和同步我的数据库

dbInit.js看起来像这样:

const Sequelize = require('../node_modules/sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'sqlite',
logging: false,
storage: 'database.sqlite',
});
// importing the modules
// import() is deprecated and will throw an error!
sequelize.import('models/model1');
sequelize.import('models/model2');
sequelize.import('models/model3');
// if force == true this will create the table, dropping it first if it already existed.
const force = process.argv.includes('--force') || process.argv.includes('-f');
// sync the database
sequelize.sync({ force }).then(async() => {
console.log('dbInit.js: Database synced');
sequelize.close();
}).catch(console.error);

当我运行此文件时,我观察到以下错误:TypeError: sequelize.import is not a function。这个错误很明显,导入不是函数!这让我在Sequelize文档中发现了这个页面,其中说明了以下内容:

已弃用:sequelize.import

注意:您不应该使用sequelize.import。请使用require。

考虑到这一点,以下是我的主要问题:

1:在初始化期间,我如何告诉Sequelize哪些模型要包含在我的数据库中文档非常清楚,我应该"只使用require"。但该文件并没有提供新公约的明确例子。

2:如何正确使用require来包含模型

我很难找到一个例子来说明它是如何工作的。我是JS的新手,所以这可能非常明显,因此缺少示例。我想我们可以做一些类似const model1 = require(path/to/model1);的事情,然后我可以把它插入同步函数吗?

Kinda现在正在处理同样的问题,刚刚解决了它。我在代码中使用babel进行导入,但如果不需要,您可以根据需要更改它们。

您可以导入外部模块以进行如下排序:在您的dbInit.js中尝试:

// dbInit.js
import Sequelize from 'sequelize';
import model1 from './model1'
import model2 from './model2'
const sequelize = new Sequelize(
process.env.DATABASE,
process.env.DATABASE_USER,
process.env.DATABASE_PASSWORD,
{
dialect: 'sqlite',
},
);
model1(sequelize, Sequelize.DataTypes);
model2(sequelize, Sequelize.DataTypes);
const models = sequelize.models;
export { sequelize };
export default models;

型号1可能看起来像这样:

// model1.js
const message = (sequelize, DataTypes) => {
const Message = sequelize.define('message', {
text: DataTypes.STRING,
});
Message.associate = (models) => {
Message.belongsTo(models.User);
};
return Message;
};
export default message;

然后你可能想在你的主index.js或其他东西中导入你的dbInit.js:

// index.js
import models, {sequelize} from './dbInit';
sequelize.sync({ force }).then(async () => {
app.listen(process.env.PORT, () =>
console.log(models)
);
});

在这里,您可以像这样导入模型。

const models = require('./models'); //path of models folder
const ModelA = models.model1;
const ModelB = models.model2;
const ModelC = models.model3;

//Sequelize v5

现在您不必导入Sequelize,因为models文件夹具有index.js

这将为您建立连接。

用于使用sequelize方法。只需像这样添加型号即可。

models.sequelize.sync({ force }).then(async() => {
console.log('dbInit.js: Database synced');
sequelize.close();
}).catch(console.error);

我找到了解决问题的方法。这不是我理想的解决方案,因为我真的希望能够定义外部模型,然后根据需要引入它们。如果有人能找到/向我展示一个关于如何工作的坚实例子

最后,我使用sequelize.define()方法在dbInit.js中内联定义了我的模型。这基本上就是他们在Sequelize官方例子中的做法。在sqlite的数据库浏览器中检查这一点表明dbInit.js确实创建了所需的表。

// define a model...
sequelize.define('modelName',{
random_thing:{
type: Sequelize.STRING,
primaryKey: true,
}
}, {
timestamps: false,
});
// then sync the db...

我将继续这个项目,寻找更好的解决方案。

您可以简单地导入sequelize.js文件中的函数,如

const dbConfig = require("../config/db.config")[process.env.NODE_ENV];
const Sequelize = require("sequelize");
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
host: dbConfig.HOST,
dialect: dbConfig.DIALECT,
operatorsAliases: false,
});
const db = {};
db.Sequelize = Sequelize;
db.sequelize = sequelize;
db.model1= require("./model1")(sequelize, Sequelize);
db.model2 = require("./model2")(sequelize, Sequelize);
db.model3= require("./model3")(sequelize, Sequelize);
db.sequelize.sync({ force: true }).then(() => {
console.log("Drop and re-sync db.");
});
module.exports = db;

我在这里导入了所有的模型,并制作了一个可以轻松使用的常量数据库。

最新更新