同步 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 初始化数据库。我已经定义了我的三个模型(我们称它们为 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。这个错误很清楚,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 创建三个文件夹。 configmodelsmigration。上面的代码将以这种方式工作【参考方案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() 不是函数(并且已弃用)的主要内容,如果未能解决你的问题,请参考以下文章

我应该让 Sequelize 模型和迁移保持同步吗?

Sequelize 同步与迁移

Node.js / Sequelize.js / Express.js - 如何插入多对多关联? (同步/异步?)

即使 paranoid 设置为 true,Sequelize.js 仍会删除表行

在 Sequelize 中使用实例方法

同步执行 Sequelize 查询