同步 sequelize 模型:sequelize.import() 不是函数(并且已弃用)
Posted
技术标签:
【中文标题】同步 sequelize 模型:sequelize.import() 不是函数(并且已弃用)【英文标题】:Syncing sequelize models: sequelize.import() is not a function (and is deprecated) 【发布时间】:2020-11-06 11:35:39 【问题描述】:我正在尝试通过 Sequelize.js ORM 使用 sqlite3 初始化数据库。我已经定义了我的三个模型(我们称它们为 model1
、model2
和 model3
,现在我正在处理一个将初始化和同步我的数据库的 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
。这个错误很清楚,import不是函数!这使我在 Sequelize 文档中发现了 this page,其中说明了以下内容:
已弃用:sequelize.import
注意:您不应使用 sequelize.import。请使用 require 代替。
考虑到这一点,这是我的主要问题:
1:我如何告诉 Sequelize 在初始化期间将哪些模型包含在我的数据库中? 文档很清楚,我应该“只使用require”。但是文档没有提供新约定的明确示例。
2:如何正确使用 require 来包含模型?
我无法找到有关其工作原理的示例。我是 JS 新手,所以这可能非常明显,因此缺乏示例。我想我们可以做类似const model1 = require(path/to/model1);
的事情,然后我可以把它插入同步功能吗?
【问题讨论】:
这能回答你的问题吗? sequelize.import is not a function 【参考方案1】:在这里你可以像这样导入你的模型。
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);
【讨论】:
感谢您的回复。 'models 文件夹有 index.js' 是什么意思?我的模型文件夹有三个 .js 文件,每个文件定义一个模型。你是说 sequelize 寻找 index.js? 如果使用sequelize.define()
定义我的模型内联(在 dbInit.js 中)文件,我可以让它工作。这种解决了我的问题,但我真的很想导入外部模型。我会继续努力的。
如果你使用的是sequelize cli。然后sequelize init
创建三个文件夹。 config
models
migration
。上面的代码将以这种方式工作【参考方案2】:
我能够找到解决问题的方法。这不是我理想的解决方案,因为我真的希望能够定义外部模型,然后根据需要引入它们。如果有人能找到/向我展示这是如何工作的可靠示例
我最终使用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...
我将继续这个项目,寻找更好的解决方案。
【讨论】:
【参考方案3】:现在有点在解决同样的问题,只是想通了。我在我的代码中使用 babel 进行导入,但如果你不这样做,你可以将它们更改为 require。
您可以像这样导入外部模块进行同步: 在您的 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;
model1 可能如下所示:
// 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)
);
);
【讨论】:
【参考方案4】:您可以像这样在 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;
我这里已经导入了所有的模型,并且做了一个常量db,可以很方便的使用。
【讨论】:
以上是关于同步 sequelize 模型:sequelize.import() 不是函数(并且已弃用)的主要内容,如果未能解决你的问题,请参考以下文章
Node.js / Sequelize.js / Express.js - 如何插入多对多关联? (同步/异步?)