【问题标题】:Syncing sequelize models: sequelize.import() is not a function (and is deprecated)同步 sequelize 模型:sequelize.import() 不是函数(并且已弃用)
【发布时间】: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); 的事情,然后我可以把它插入同步功能吗?

【问题讨论】:

标签: javascript node.js sqlite sequelize.js discord.js


【解决方案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,可以很方便的使用。

      【讨论】:

        猜你喜欢
        • 2020-11-13
        • 2021-08-21
        • 2020-10-18
        • 2023-03-27
        • 2020-12-06
        • 1970-01-01
        • 2020-01-09
        • 1970-01-01
        • 2020-02-03
        相关资源
        最近更新 更多